mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
[PATCH] inotify: add two inotify_add_watch flags
The below patch lets userspace have more control over the inodes that
inotify will watch. It introduces two new flags.
IN_ONLYDIR -- only watch the inode if it is a directory.
This is needed to avoid the race that can occur when we want to be
sure that we are watching a directory.
IN_DONT_FOLLOW -- don't follow a symlink. In combination
with IN_ONLYDIR we can make sure that we don't watch the target of
symlinks.
The issues the flags fix came up when writing the gnome-vfs inotify
backend. Default behaviour is unchanged.
Signed-off-by: John McCutchan <[email protected]>
Acked-by: Robert Love <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
b4788f6d55
commit
8140a5005b
2 changed files with 12 additions and 3 deletions
13
fs/inotify.c
13
fs/inotify.c
|
|
@ -364,11 +364,12 @@ static int inotify_dev_get_wd(struct inotify_device *dev,
|
|||
/*
|
||||
* find_inode - resolve a user-given path to a specific inode and return a nd
|
||||
*/
|
||||
static int find_inode(const char __user *dirname, struct nameidata *nd)
|
||||
static int find_inode(const char __user *dirname, struct nameidata *nd,
|
||||
unsigned flags)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = __user_walk(dirname, LOOKUP_FOLLOW, nd);
|
||||
error = __user_walk(dirname, flags, nd);
|
||||
if (error)
|
||||
return error;
|
||||
/* 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)
|
|||
struct file *filp;
|
||||
int ret, fput_needed;
|
||||
int mask_add = 0;
|
||||
unsigned flags = 0;
|
||||
|
||||
filp = fget_light(fd, &fput_needed);
|
||||
if (unlikely(!filp))
|
||||
|
|
@ -944,7 +946,12 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
|
|||
goto fput_and_out;
|
||||
}
|
||||
|
||||
ret = find_inode(path, &nd);
|
||||
if (!(mask & IN_DONT_FOLLOW))
|
||||
flags |= LOOKUP_FOLLOW;
|
||||
if (mask & IN_ONLYDIR)
|
||||
flags |= LOOKUP_DIRECTORY;
|
||||
|
||||
ret = find_inode(path, &nd, flags);
|
||||
if (unlikely(ret))
|
||||
goto fput_and_out;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue