The patch titled inotify: add interfaces to kernel API has been removed from the -mm tree. Its filename is inotify-add-interfaces-to-kernel-api.patch This patch was dropped because it was merged into mainline or a subsystem tree ------------------------------------------------------ Subject: inotify: add interfaces to kernel API From: Amy Griffis <amy.griffis@xxxxxx> Add inotify_init_watch() so caller can use inotify_watch refcounts before calling inotify_add_watch(). Add inotify_find_watch() to find an existing watch for an (ih,inode) pair. This is similar to inotify_find_update_watch(), but does not update the watch's mask if one is found. Add inotify_rm_watch() to remove a watch via the watch pointer instead of the watch descriptor. Signed-off-by: Amy Griffis <amy.griffis@xxxxxx> Acked-by: Robert Love <rml@xxxxxxxxxx> Cc: "John McCutchan" <john@xxxxxxxxxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- fs/inotify.c | 64 ++++++++++++++++++++++++++++++++++---- fs/inotify_user.c | 1 include/linux/inotify.h | 20 +++++++++++ 3 files changed, 79 insertions(+), 6 deletions(-) diff -puN fs/inotify.c~inotify-add-interfaces-to-kernel-api fs/inotify.c --- devel/fs/inotify.c~inotify-add-interfaces-to-kernel-api 2006-06-09 15:22:19.000000000 -0700 +++ devel-akpm/fs/inotify.c 2006-06-09 15:22:19.000000000 -0700 @@ -468,6 +468,19 @@ struct inotify_handle *inotify_init(cons EXPORT_SYMBOL_GPL(inotify_init); /** + * inotify_init_watch - initialize an inotify watch + * @watch: watch to initialize + */ +void inotify_init_watch(struct inotify_watch *watch) +{ + INIT_LIST_HEAD(&watch->h_list); + INIT_LIST_HEAD(&watch->i_list); + atomic_set(&watch->count, 0); + get_inotify_watch(watch); /* initial get */ +} +EXPORT_SYMBOL_GPL(inotify_init_watch); + +/** * inotify_destroy - clean up and destroy an inotify instance * @ih: inotify handle */ @@ -515,6 +528,37 @@ void inotify_destroy(struct inotify_hand EXPORT_SYMBOL_GPL(inotify_destroy); /** + * inotify_find_watch - find an existing watch for an (ih,inode) pair + * @ih: inotify handle + * @inode: inode to watch + * @watchp: pointer to existing inotify_watch + * + * Caller must pin given inode (via nameidata). + */ +s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, + struct inotify_watch **watchp) +{ + struct inotify_watch *old; + int ret = -ENOENT; + + mutex_lock(&inode->inotify_mutex); + mutex_lock(&ih->mutex); + + old = inode_find_handle(inode, ih); + if (unlikely(old)) { + get_inotify_watch(old); /* caller must put watch */ + *watchp = old; + ret = old->wd; + } + + mutex_unlock(&ih->mutex); + mutex_unlock(&inode->inotify_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(inotify_find_watch); + +/** * inotify_find_update_watch - find and update the mask of an existing watch * @ih: inotify handle * @inode: inode's watch to update @@ -593,10 +637,6 @@ s32 inotify_add_watch(struct inotify_han goto out; ret = watch->wd; - atomic_set(&watch->count, 0); - INIT_LIST_HEAD(&watch->h_list); - INIT_LIST_HEAD(&watch->i_list); - /* save a reference to handle and bump the count to make it official */ get_inotify_handle(ih); watch->ih = ih; @@ -607,8 +647,6 @@ s32 inotify_add_watch(struct inotify_han */ watch->inode = igrab(inode); - get_inotify_watch(watch); /* initial get */ - if (!inotify_inode_watched(inode)) set_dentry_child_flags(inode, 1); @@ -659,6 +697,20 @@ int inotify_rm_wd(struct inotify_handle } EXPORT_SYMBOL_GPL(inotify_rm_wd); +/** + * inotify_rm_watch - remove a watch from an inotify instance + * @ih: inotify handle + * @watch: watch to remove + * + * Can sleep. + */ +int inotify_rm_watch(struct inotify_handle *ih, + struct inotify_watch *watch) +{ + return inotify_rm_wd(ih, watch->wd); +} +EXPORT_SYMBOL_GPL(inotify_rm_watch); + /* * inotify_setup - core initialization function */ diff -puN fs/inotify_user.c~inotify-add-interfaces-to-kernel-api fs/inotify_user.c --- devel/fs/inotify_user.c~inotify-add-interfaces-to-kernel-api 2006-06-09 15:22:19.000000000 -0700 +++ devel-akpm/fs/inotify_user.c 2006-06-09 15:22:19.000000000 -0700 @@ -380,6 +380,7 @@ static int create_watch(struct inotify_d atomic_inc(&dev->user->inotify_watches); + inotify_init_watch(&watch->wdata); ret = inotify_add_watch(dev->ih, &watch->wdata, inode, mask); if (ret < 0) free_inotify_user_watch(&watch->wdata); diff -puN include/linux/inotify.h~inotify-add-interfaces-to-kernel-api include/linux/inotify.h --- devel/include/linux/inotify.h~inotify-add-interfaces-to-kernel-api 2006-06-09 15:22:19.000000000 -0700 +++ devel-akpm/include/linux/inotify.h 2006-06-09 15:22:19.000000000 -0700 @@ -112,11 +112,15 @@ extern u32 inotify_get_cookie(void); /* Kernel Consumer API */ extern struct inotify_handle *inotify_init(const struct inotify_operations *); +extern void inotify_init_watch(struct inotify_watch *); extern void inotify_destroy(struct inotify_handle *); +extern __s32 inotify_find_watch(struct inotify_handle *, struct inode *, + struct inotify_watch **); extern __s32 inotify_find_update_watch(struct inotify_handle *, struct inode *, u32); extern __s32 inotify_add_watch(struct inotify_handle *, struct inotify_watch *, struct inode *, __u32); +extern int inotify_rm_watch(struct inotify_handle *, struct inotify_watch *); extern int inotify_rm_wd(struct inotify_handle *, __u32); extern void get_inotify_watch(struct inotify_watch *); extern void put_inotify_watch(struct inotify_watch *); @@ -164,10 +168,20 @@ inotify_init(const struct inotify_operat return ERR_PTR(-EOPNOTSUPP); } +static inline void inotify_init_watch(struct inotify_watch *watch) +{ +} + static inline void inotify_destroy(struct inotify_handle *ih) { } +static inline __s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, + struct inotify_watch **watchp) +{ + return -EOPNOTSUPP; +} + static inline __s32 inotify_find_update_watch(struct inotify_handle *ih, struct inode *inode, u32 mask) { @@ -181,6 +195,12 @@ static inline __s32 inotify_add_watch(st return -EOPNOTSUPP; } +static inline int inotify_rm_watch(struct inotify_handle *ih, + struct inotify_watch *watch) +{ + return -EOPNOTSUPP; +} + static inline int inotify_rm_wd(struct inotify_handle *ih, __u32 wd) { return -EOPNOTSUPP; _ Patches currently in -mm which might be from amy.griffis@xxxxxx are origin.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html