[PATCH] inotify (2/5): add name's inode to event handler
When an inotify event includes a dentry name, also include the inode associated with that name. Signed-off-by: Amy Griffis <amy.griffis@hp.com> Acked-by: Robert Love <rml@novell.com> Acked-by: John McCutchan <john@johnmccutchan.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
2d9048e201
Коммит
7c29772288
13
fs/inotify.c
13
fs/inotify.c
|
@ -232,7 +232,7 @@ static void remove_watch_no_event(struct inotify_watch *watch,
|
|||
static void remove_watch(struct inotify_watch *watch, struct inotify_handle *ih)
|
||||
{
|
||||
remove_watch_no_event(watch, ih);
|
||||
ih->in_ops->handle_event(watch, watch->wd, IN_IGNORED, 0, NULL);
|
||||
ih->in_ops->handle_event(watch, watch->wd, IN_IGNORED, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/* Kernel API for producing events */
|
||||
|
@ -275,9 +275,10 @@ void inotify_d_move(struct dentry *entry)
|
|||
* @mask: event mask describing this event
|
||||
* @cookie: cookie for synchronization, or zero
|
||||
* @name: filename, if any
|
||||
* @n_inode: inode associated with name
|
||||
*/
|
||||
void inotify_inode_queue_event(struct inode *inode, u32 mask, u32 cookie,
|
||||
const char *name)
|
||||
const char *name, struct inode *n_inode)
|
||||
{
|
||||
struct inotify_watch *watch, *next;
|
||||
|
||||
|
@ -292,7 +293,8 @@ void inotify_inode_queue_event(struct inode *inode, u32 mask, u32 cookie,
|
|||
mutex_lock(&ih->mutex);
|
||||
if (watch_mask & IN_ONESHOT)
|
||||
remove_watch_no_event(watch, ih);
|
||||
ih->in_ops->handle_event(watch, watch->wd, mask, cookie, name);
|
||||
ih->in_ops->handle_event(watch, watch->wd, mask, cookie,
|
||||
name, n_inode);
|
||||
mutex_unlock(&ih->mutex);
|
||||
}
|
||||
}
|
||||
|
@ -323,7 +325,8 @@ void inotify_dentry_parent_queue_event(struct dentry *dentry, u32 mask,
|
|||
if (inotify_inode_watched(inode)) {
|
||||
dget(parent);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
inotify_inode_queue_event(inode, mask, cookie, name);
|
||||
inotify_inode_queue_event(inode, mask, cookie, name,
|
||||
dentry->d_inode);
|
||||
dput(parent);
|
||||
} else
|
||||
spin_unlock(&dentry->d_lock);
|
||||
|
@ -407,7 +410,7 @@ void inotify_unmount_inodes(struct list_head *list)
|
|||
struct inotify_handle *ih= watch->ih;
|
||||
mutex_lock(&ih->mutex);
|
||||
ih->in_ops->handle_event(watch, watch->wd, IN_UNMOUNT, 0,
|
||||
NULL);
|
||||
NULL, NULL);
|
||||
remove_watch(watch, ih);
|
||||
mutex_unlock(&ih->mutex);
|
||||
}
|
||||
|
|
|
@ -253,7 +253,8 @@ inotify_dev_get_event(struct inotify_device *dev)
|
|||
* Can sleep (calls kernel_event()).
|
||||
*/
|
||||
static void inotify_dev_queue_event(struct inotify_watch *w, u32 wd, u32 mask,
|
||||
u32 cookie, const char *name)
|
||||
u32 cookie, const char *name,
|
||||
struct inode *ignored)
|
||||
{
|
||||
struct inotify_user_watch *watch;
|
||||
struct inotify_device *dev;
|
||||
|
|
|
@ -54,16 +54,18 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
|
||||
if (isdir)
|
||||
isdir = IN_ISDIR;
|
||||
inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir,cookie,old_name);
|
||||
inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, cookie, new_name);
|
||||
inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir,cookie,old_name,
|
||||
source);
|
||||
inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, cookie, new_name,
|
||||
source);
|
||||
|
||||
if (target) {
|
||||
inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL);
|
||||
inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL, NULL);
|
||||
inotify_inode_is_dead(target);
|
||||
}
|
||||
|
||||
if (source) {
|
||||
inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL);
|
||||
inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL);
|
||||
}
|
||||
audit_inode_child(old_name, source, old_dir->i_ino);
|
||||
audit_inode_child(new_name, target, new_dir->i_ino);
|
||||
|
@ -85,7 +87,7 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir)
|
|||
*/
|
||||
static inline void fsnotify_inoderemove(struct inode *inode)
|
||||
{
|
||||
inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL);
|
||||
inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL, NULL);
|
||||
inotify_inode_is_dead(inode);
|
||||
}
|
||||
|
||||
|
@ -95,7 +97,8 @@ static inline void fsnotify_inoderemove(struct inode *inode)
|
|||
static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
|
||||
{
|
||||
inode_dir_notify(inode, DN_CREATE);
|
||||
inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name,
|
||||
dentry->d_inode);
|
||||
audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino);
|
||||
}
|
||||
|
||||
|
@ -106,7 +109,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry)
|
|||
{
|
||||
inode_dir_notify(inode, DN_CREATE);
|
||||
inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0,
|
||||
dentry->d_name.name);
|
||||
dentry->d_name.name, dentry->d_inode);
|
||||
audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino);
|
||||
}
|
||||
|
||||
|
@ -123,7 +126,7 @@ static inline void fsnotify_access(struct dentry *dentry)
|
|||
|
||||
dnotify_parent(dentry, DN_ACCESS);
|
||||
inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -139,7 +142,7 @@ static inline void fsnotify_modify(struct dentry *dentry)
|
|||
|
||||
dnotify_parent(dentry, DN_MODIFY);
|
||||
inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -154,7 +157,7 @@ static inline void fsnotify_open(struct dentry *dentry)
|
|||
mask |= IN_ISDIR;
|
||||
|
||||
inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -172,7 +175,7 @@ static inline void fsnotify_close(struct file *file)
|
|||
mask |= IN_ISDIR;
|
||||
|
||||
inotify_dentry_parent_queue_event(dentry, mask, 0, name);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -187,7 +190,7 @@ static inline void fsnotify_xattr(struct dentry *dentry)
|
|||
mask |= IN_ISDIR;
|
||||
|
||||
inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, mask, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -234,7 +237,7 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid)
|
|||
if (in_mask) {
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
in_mask |= IN_ISDIR;
|
||||
inotify_inode_queue_event(inode, in_mask, 0, NULL);
|
||||
inotify_inode_queue_event(inode, in_mask, 0, NULL, NULL);
|
||||
inotify_dentry_parent_queue_event(dentry, in_mask, 0,
|
||||
dentry->d_name.name);
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ struct inotify_watch {
|
|||
|
||||
struct inotify_operations {
|
||||
void (*handle_event)(struct inotify_watch *, u32, u32, u32,
|
||||
const char *);
|
||||
const char *, struct inode *);
|
||||
void (*destroy_watch)(struct inotify_watch *);
|
||||
};
|
||||
|
||||
|
@ -102,7 +102,7 @@ struct inotify_operations {
|
|||
extern void inotify_d_instantiate(struct dentry *, struct inode *);
|
||||
extern void inotify_d_move(struct dentry *);
|
||||
extern void inotify_inode_queue_event(struct inode *, __u32, __u32,
|
||||
const char *);
|
||||
const char *, struct inode *);
|
||||
extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32,
|
||||
const char *);
|
||||
extern void inotify_unmount_inodes(struct list_head *);
|
||||
|
@ -134,7 +134,8 @@ static inline void inotify_d_move(struct dentry *dentry)
|
|||
|
||||
static inline void inotify_inode_queue_event(struct inode *inode,
|
||||
__u32 mask, __u32 cookie,
|
||||
const char *filename)
|
||||
const char *filename,
|
||||
struct inode *n_inode)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче