|
@@ -510,6 +510,7 @@ static int inotify_update_existing_watch(struct fsnotify_group *group,
|
|
|
__u32 old_mask, new_mask;
|
|
|
__u32 mask;
|
|
|
int add = (arg & IN_MASK_ADD);
|
|
|
+ int create = (arg & IN_MASK_CREATE);
|
|
|
int ret;
|
|
|
|
|
|
mask = inotify_arg_to_mask(arg);
|
|
@@ -517,6 +518,8 @@ static int inotify_update_existing_watch(struct fsnotify_group *group,
|
|
|
fsn_mark = fsnotify_find_mark(&inode->i_fsnotify_marks, group);
|
|
|
if (!fsn_mark)
|
|
|
return -ENOENT;
|
|
|
+ else if (create)
|
|
|
+ return -EEXIST;
|
|
|
|
|
|
i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark);
|
|
|
|
|
@@ -718,6 +721,10 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
|
|
|
if (unlikely(!f.file))
|
|
|
return -EBADF;
|
|
|
|
|
|
+ /* IN_MASK_ADD and IN_MASK_CREATE don't make sense together */
|
|
|
+ if (unlikely((mask & IN_MASK_ADD) && (mask & IN_MASK_CREATE)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
/* verify that this is indeed an inotify instance */
|
|
|
if (unlikely(f.file->f_op != &inotify_fops)) {
|
|
|
ret = -EINVAL;
|
|
@@ -806,7 +813,7 @@ static int __init inotify_user_setup(void)
|
|
|
BUILD_BUG_ON(IN_ISDIR != FS_ISDIR);
|
|
|
BUILD_BUG_ON(IN_ONESHOT != FS_IN_ONESHOT);
|
|
|
|
|
|
- BUG_ON(hweight32(ALL_INOTIFY_BITS) != 21);
|
|
|
+ BUG_ON(hweight32(ALL_INOTIFY_BITS) != 22);
|
|
|
|
|
|
inotify_inode_mark_cachep = KMEM_CACHE(inotify_inode_mark, SLAB_PANIC);
|
|
|
|