git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] v9fs: fix fid management in v9fs_create
[safe/jmp/linux-2.6]
/
fs
/
inotify.c
diff --git
a/fs/inotify.c
b/fs/inotify.c
index
a37e9fb
..
2fecb7a
100644
(file)
--- a/
fs/inotify.c
+++ b/
fs/inotify.c
@@
-176,6
+176,7
@@
static inline void put_inotify_dev(struct inotify_device *dev)
if (atomic_dec_and_test(&dev->count)) {
atomic_dec(&dev->user->inotify_devs);
free_uid(dev->user);
if (atomic_dec_and_test(&dev->count)) {
atomic_dec(&dev->user->inotify_devs);
free_uid(dev->user);
+ idr_destroy(&dev->idr);
kfree(dev);
}
}
kfree(dev);
}
}
@@
-363,15
+364,16
@@
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
*/
/*
* 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;
{
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 */
if (error)
return error;
/* you can only watch an inode if you have read permissions on it */
- error =
permission(nd->dentry->d_inode, MAY_READ, NULL
);
+ error =
vfs_permission(nd, MAY_READ
);
if (error)
path_release(nd);
return error;
if (error)
path_release(nd);
return error;
@@
-932,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;
struct file *filp;
int ret, fput_needed;
int mask_add = 0;
+ unsigned flags = 0;
filp = fget_light(fd, &fput_needed);
if (unlikely(!filp))
filp = fget_light(fd, &fput_needed);
if (unlikely(!filp))
@@
-943,7
+946,12
@@
asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
goto fput_and_out;
}
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;
if (unlikely(ret))
goto fput_and_out;