diff options
author | Eric Paris <eparis@redhat.com> | 2009-06-11 11:09:47 -0400 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2009-06-11 14:57:54 -0400 |
commit | ff52cc2158b32b3b979ca7802b1fd7c70f36e13c (patch) | |
tree | 1156b8a138adef3698636bf28ad3a739c3c5bff3 /include | |
parent | 63c882a05416e18de6fb59f7dd6da48f3bbe8273 (diff) |
fsnotify: move events should indicate the event was on a child
fsnotify tells its listeners explicitly when an event happened on the given
inode verses on the child of the given inode. (see __fsnotify_parent)
However, the semantics of fsnotify_move() are such that we deliver events
directly to the two parent directories in question (old_dir and new_dir)
directly without using the __fsnotify_parent() call. fsnotify should be
adding FS_EVENT_ON_CHILD for the notifications to these parents.
Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/fsnotify.h | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index c25b39ddd62a..936f9aa8bb97 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
@@ -71,12 +71,11 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
71 | struct inode *source = moved->d_inode; | 71 | struct inode *source = moved->d_inode; |
72 | u32 in_cookie = inotify_get_cookie(); | 72 | u32 in_cookie = inotify_get_cookie(); |
73 | u32 fs_cookie = fsnotify_get_cookie(); | 73 | u32 fs_cookie = fsnotify_get_cookie(); |
74 | __u32 old_dir_mask = 0; | 74 | __u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM); |
75 | __u32 new_dir_mask = 0; | 75 | __u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO); |
76 | 76 | ||
77 | if (old_dir == new_dir) { | 77 | if (old_dir == new_dir) |
78 | old_dir_mask = FS_DN_RENAME; | 78 | old_dir_mask |= FS_DN_RENAME; |
79 | } | ||
80 | 79 | ||
81 | if (isdir) { | 80 | if (isdir) { |
82 | isdir = IN_ISDIR; | 81 | isdir = IN_ISDIR; |
@@ -84,9 +83,6 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
84 | new_dir_mask |= FS_IN_ISDIR; | 83 | new_dir_mask |= FS_IN_ISDIR; |
85 | } | 84 | } |
86 | 85 | ||
87 | old_dir_mask |= FS_MOVED_FROM; | ||
88 | new_dir_mask |= FS_MOVED_TO; | ||
89 | |||
90 | inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir, in_cookie, old_name, | 86 | inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir, in_cookie, old_name, |
91 | source); | 87 | source); |
92 | inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, in_cookie, new_name, | 88 | inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, in_cookie, new_name, |