projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PARISC] Return PDC_OK when alloc_pa_dev fails to enumerate all devices
[powerpc.git]
/
fs
/
inotify.c
diff --git
a/fs/inotify.c
b/fs/inotify.c
index
2e4e2a5
..
bf7ce1d
100644
(file)
--- a/
fs/inotify.c
+++ b/
fs/inotify.c
@@
-37,6
+37,7
@@
#include <asm/ioctls.h>
static atomic_t inotify_cookie;
#include <asm/ioctls.h>
static atomic_t inotify_cookie;
+static atomic_t inotify_watches;
static kmem_cache_t *watch_cachep;
static kmem_cache_t *event_cachep;
static kmem_cache_t *watch_cachep;
static kmem_cache_t *event_cachep;
@@
-175,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);
}
}
@@
-370,7
+372,7
@@
static int find_inode(const char __user *dirname, struct nameidata *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;
@@
-422,6
+424,7
@@
static struct inotify_watch *create_watch(struct inotify_device *dev,
get_inotify_watch(watch);
atomic_inc(&dev->user->inotify_watches);
get_inotify_watch(watch);
atomic_inc(&dev->user->inotify_watches);
+ atomic_inc(&inotify_watches);
return watch;
}
return watch;
}
@@
-454,6
+457,7
@@
static void remove_watch_no_event(struct inotify_watch *watch,
list_del(&watch->d_list);
atomic_dec(&dev->user->inotify_watches);
list_del(&watch->d_list);
atomic_dec(&dev->user->inotify_watches);
+ atomic_dec(&inotify_watches);
idr_remove(&dev->idr, watch->wd);
put_inotify_watch(watch);
}
idr_remove(&dev->idr, watch->wd);
put_inotify_watch(watch);
}
@@
-532,6
+536,9
@@
void inotify_dentry_parent_queue_event(struct dentry *dentry, u32 mask,
struct dentry *parent;
struct inode *inode;
struct dentry *parent;
struct inode *inode;
+ if (!atomic_read (&inotify_watches))
+ return;
+
spin_lock(&dentry->d_lock);
parent = dentry->d_parent;
inode = parent->d_inode;
spin_lock(&dentry->d_lock);
parent = dentry->d_parent;
inode = parent->d_inode;
@@
-925,6
+932,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;
struct nameidata nd;
struct file *filp;
int ret, fput_needed;
+ int mask_add = 0;
filp = fget_light(fd, &fput_needed);
if (unlikely(!filp))
filp = fget_light(fd, &fput_needed);
if (unlikely(!filp))
@@
-947,6
+955,9
@@
asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
down(&inode->inotify_sem);
down(&dev->sem);
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)) {
/* don't let user-space set invalid bits: we don't want flags set */
mask &= IN_ALL_EVENTS;
if (unlikely(!mask)) {
@@
-960,7
+971,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 = 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;
}
ret = old->wd;
goto out;
}
@@
-1043,6
+1057,7
@@
static int __init inotify_setup(void)
inotify_max_user_watches = 8192;
atomic_set(&inotify_cookie, 0);
inotify_max_user_watches = 8192;
atomic_set(&inotify_cookie, 0);
+ atomic_set(&inotify_watches, 0);
watch_cachep = kmem_cache_create("inotify_watch_cache",
sizeof(struct inotify_watch),
watch_cachep = kmem_cache_create("inotify_watch_cache",
sizeof(struct inotify_watch),