forked from Minki/linux
[PATCH] inotify: fix event loss on hardlinked files
People have run into a problem when they do this: watch (file1, all_events); watch (file2, some_events); if file2 is a hard link to file1, some events will be missed because by default we replace the mask. The patch below adds a flag IN_MASK_ADD which will cause inotify to add to the existing mask if present. Signed-off-by: John McCutchan <ttb@tentacle.dhs.org> Signed-off-by: Robert Love <rml@novell.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
8191151d09
commit
7ea6040b0e
@ -931,6 +931,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
|
||||
struct nameidata nd;
|
||||
struct file *filp;
|
||||
int ret, fput_needed;
|
||||
int mask_add = 0;
|
||||
|
||||
filp = fget_light(fd, &fput_needed);
|
||||
if (unlikely(!filp))
|
||||
@ -953,6 +954,9 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
|
||||
down(&inode->inotify_sem);
|
||||
down(&dev->sem);
|
||||
|
||||
if (mask & IN_MASK_ADD)
|
||||
mask_add = 1;
|
||||
|
||||
/* don't let user-space set invalid bits: we don't want flags set */
|
||||
mask &= IN_ALL_EVENTS;
|
||||
if (unlikely(!mask)) {
|
||||
@ -966,7 +970,10 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
|
||||
*/
|
||||
old = inode_find_dev(inode, dev);
|
||||
if (unlikely(old)) {
|
||||
old->mask = mask;
|
||||
if (mask_add)
|
||||
old->mask |= mask;
|
||||
else
|
||||
old->mask = mask;
|
||||
ret = old->wd;
|
||||
goto out;
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ struct inotify_event {
|
||||
#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* moves */
|
||||
|
||||
/* special flags */
|
||||
#define IN_MASK_ADD 0x20000000 /* add to the mask of an already existing watch */
|
||||
#define IN_ISDIR 0x40000000 /* event occurred against dir */
|
||||
#define IN_ONESHOT 0x80000000 /* only send event once */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user