aboutsummaryrefslogtreecommitdiffstats
path: root/fs/inotify.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/inotify.c')
-rw-r--r--fs/inotify.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/inotify.c b/fs/inotify.c
index bf7ce1d2412..2fecb7af4a7 100644
--- a/fs/inotify.c
+++ b/fs/inotify.c
@@ -364,11 +364,12 @@ static int inotify_dev_get_wd(struct inotify_device *dev,
364/* 364/*
365 * find_inode - resolve a user-given path to a specific inode and return a nd 365 * find_inode - resolve a user-given path to a specific inode and return a nd
366 */ 366 */
367static int find_inode(const char __user *dirname, struct nameidata *nd) 367static int find_inode(const char __user *dirname, struct nameidata *nd,
368 unsigned flags)
368{ 369{
369 int error; 370 int error;
370 371
371 error = __user_walk(dirname, LOOKUP_FOLLOW, nd); 372 error = __user_walk(dirname, flags, nd);
372 if (error) 373 if (error)
373 return error; 374 return error;
374 /* you can only watch an inode if you have read permissions on it */ 375 /* you can only watch an inode if you have read permissions on it */
@@ -933,6 +934,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
933 struct file *filp; 934 struct file *filp;
934 int ret, fput_needed; 935 int ret, fput_needed;
935 int mask_add = 0; 936 int mask_add = 0;
937 unsigned flags = 0;
936 938
937 filp = fget_light(fd, &fput_needed); 939 filp = fget_light(fd, &fput_needed);
938 if (unlikely(!filp)) 940 if (unlikely(!filp))
@@ -944,7 +946,12 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
944 goto fput_and_out; 946 goto fput_and_out;
945 } 947 }
946 948
947 ret = find_inode(path, &nd); 949 if (!(mask & IN_DONT_FOLLOW))
950 flags |= LOOKUP_FOLLOW;
951 if (mask & IN_ONLYDIR)
952 flags |= LOOKUP_DIRECTORY;
953
954 ret = find_inode(path, &nd, flags);
948 if (unlikely(ret)) 955 if (unlikely(ret))
949 goto fput_and_out; 956 goto fput_and_out;
950 957