|
@@ -44,10 +44,8 @@
|
|
|
|
|
|
#include <asm/ioctls.h>
|
|
|
|
|
|
-/* these are configurable via /proc/sys/fs/inotify/ */
|
|
|
-static int inotify_max_user_instances __read_mostly;
|
|
|
+/* configurable via /proc/sys/fs/inotify/ */
|
|
|
static int inotify_max_queued_events __read_mostly;
|
|
|
-static int inotify_max_user_watches __read_mostly;
|
|
|
|
|
|
static struct kmem_cache *inotify_inode_mark_cachep __read_mostly;
|
|
|
|
|
@@ -60,7 +58,7 @@ static int zero;
|
|
|
struct ctl_table inotify_table[] = {
|
|
|
{
|
|
|
.procname = "max_user_instances",
|
|
|
- .data = &inotify_max_user_instances,
|
|
|
+ .data = &init_user_ns.ucount_max[UCOUNT_INOTIFY_INSTANCES],
|
|
|
.maxlen = sizeof(int),
|
|
|
.mode = 0644,
|
|
|
.proc_handler = proc_dointvec_minmax,
|
|
@@ -68,7 +66,7 @@ struct ctl_table inotify_table[] = {
|
|
|
},
|
|
|
{
|
|
|
.procname = "max_user_watches",
|
|
|
- .data = &inotify_max_user_watches,
|
|
|
+ .data = &init_user_ns.ucount_max[UCOUNT_INOTIFY_WATCHES],
|
|
|
.maxlen = sizeof(int),
|
|
|
.mode = 0644,
|
|
|
.proc_handler = proc_dointvec_minmax,
|
|
@@ -500,7 +498,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
|
|
|
/* remove this mark from the idr */
|
|
|
inotify_remove_from_idr(group, i_mark);
|
|
|
|
|
|
- atomic_dec(&group->inotify_data.user->inotify_watches);
|
|
|
+ dec_inotify_watches(group->inotify_data.ucounts);
|
|
|
}
|
|
|
|
|
|
/* ding dong the mark is dead */
|
|
@@ -584,14 +582,17 @@ static int inotify_new_watch(struct fsnotify_group *group,
|
|
|
tmp_i_mark->fsn_mark.mask = mask;
|
|
|
tmp_i_mark->wd = -1;
|
|
|
|
|
|
- ret = -ENOSPC;
|
|
|
- if (atomic_read(&group->inotify_data.user->inotify_watches) >= inotify_max_user_watches)
|
|
|
- goto out_err;
|
|
|
-
|
|
|
ret = inotify_add_to_idr(idr, idr_lock, tmp_i_mark);
|
|
|
if (ret)
|
|
|
goto out_err;
|
|
|
|
|
|
+ /* increment the number of watches the user has */
|
|
|
+ if (!inc_inotify_watches(group->inotify_data.ucounts)) {
|
|
|
+ inotify_remove_from_idr(group, tmp_i_mark);
|
|
|
+ ret = -ENOSPC;
|
|
|
+ goto out_err;
|
|
|
+ }
|
|
|
+
|
|
|
/* we are on the idr, now get on the inode */
|
|
|
ret = fsnotify_add_mark_locked(&tmp_i_mark->fsn_mark, group, inode,
|
|
|
NULL, 0);
|
|
@@ -601,8 +602,6 @@ static int inotify_new_watch(struct fsnotify_group *group,
|
|
|
goto out_err;
|
|
|
}
|
|
|
|
|
|
- /* increment the number of watches the user has */
|
|
|
- atomic_inc(&group->inotify_data.user->inotify_watches);
|
|
|
|
|
|
/* return the watch descriptor for this new mark */
|
|
|
ret = tmp_i_mark->wd;
|
|
@@ -653,10 +652,11 @@ static struct fsnotify_group *inotify_new_group(unsigned int max_events)
|
|
|
|
|
|
spin_lock_init(&group->inotify_data.idr_lock);
|
|
|
idr_init(&group->inotify_data.idr);
|
|
|
- group->inotify_data.user = get_current_user();
|
|
|
+ group->inotify_data.ucounts = inc_ucount(current_user_ns(),
|
|
|
+ current_euid(),
|
|
|
+ UCOUNT_INOTIFY_INSTANCES);
|
|
|
|
|
|
- if (atomic_inc_return(&group->inotify_data.user->inotify_devs) >
|
|
|
- inotify_max_user_instances) {
|
|
|
+ if (!group->inotify_data.ucounts) {
|
|
|
fsnotify_destroy_group(group);
|
|
|
return ERR_PTR(-EMFILE);
|
|
|
}
|
|
@@ -819,8 +819,8 @@ static int __init inotify_user_setup(void)
|
|
|
inotify_inode_mark_cachep = KMEM_CACHE(inotify_inode_mark, SLAB_PANIC);
|
|
|
|
|
|
inotify_max_queued_events = 16384;
|
|
|
- inotify_max_user_instances = 128;
|
|
|
- inotify_max_user_watches = 8192;
|
|
|
+ init_user_ns.ucount_max[UCOUNT_INOTIFY_INSTANCES] = 128;
|
|
|
+ init_user_ns.ucount_max[UCOUNT_INOTIFY_WATCHES] = 8192;
|
|
|
|
|
|
return 0;
|
|
|
}
|