diff options
-rw-r--r-- | fs/notify/fanotify/fanotify.c | 6 | ||||
-rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 5 | ||||
-rw-r--r-- | include/linux/fsnotify_backend.h | 2 |
3 files changed, 9 insertions, 4 deletions
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index b04f88eed09..f35794b97e8 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c | |||
@@ -92,7 +92,11 @@ static int fanotify_get_response_from_access(struct fsnotify_group *group, | |||
92 | 92 | ||
93 | pr_debug("%s: group=%p event=%p\n", __func__, group, event); | 93 | pr_debug("%s: group=%p event=%p\n", __func__, group, event); |
94 | 94 | ||
95 | wait_event(group->fanotify_data.access_waitq, event->response); | 95 | wait_event(group->fanotify_data.access_waitq, event->response || |
96 | atomic_read(&group->fanotify_data.bypass_perm)); | ||
97 | |||
98 | if (!event->response) /* bypass_perm set */ | ||
99 | return 0; | ||
96 | 100 | ||
97 | /* userspace responded, convert to something usable */ | 101 | /* userspace responded, convert to something usable */ |
98 | spin_lock(&event->lock); | 102 | spin_lock(&event->lock); |
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 480434c5ee5..01fffe62a2d 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
@@ -200,7 +200,7 @@ static int prepare_for_access_response(struct fsnotify_group *group, | |||
200 | 200 | ||
201 | mutex_lock(&group->fanotify_data.access_mutex); | 201 | mutex_lock(&group->fanotify_data.access_mutex); |
202 | 202 | ||
203 | if (group->fanotify_data.bypass_perm) { | 203 | if (atomic_read(&group->fanotify_data.bypass_perm)) { |
204 | mutex_unlock(&group->fanotify_data.access_mutex); | 204 | mutex_unlock(&group->fanotify_data.access_mutex); |
205 | kmem_cache_free(fanotify_response_event_cache, re); | 205 | kmem_cache_free(fanotify_response_event_cache, re); |
206 | event->response = FAN_ALLOW; | 206 | event->response = FAN_ALLOW; |
@@ -390,7 +390,7 @@ static int fanotify_release(struct inode *ignored, struct file *file) | |||
390 | 390 | ||
391 | mutex_lock(&group->fanotify_data.access_mutex); | 391 | mutex_lock(&group->fanotify_data.access_mutex); |
392 | 392 | ||
393 | group->fanotify_data.bypass_perm = true; | 393 | atomic_inc(&group->fanotify_data.bypass_perm); |
394 | 394 | ||
395 | list_for_each_entry_safe(re, lre, &group->fanotify_data.access_list, list) { | 395 | list_for_each_entry_safe(re, lre, &group->fanotify_data.access_list, list) { |
396 | pr_debug("%s: found group=%p re=%p event=%p\n", __func__, group, | 396 | pr_debug("%s: found group=%p re=%p event=%p\n", __func__, group, |
@@ -703,6 +703,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
703 | mutex_init(&group->fanotify_data.access_mutex); | 703 | mutex_init(&group->fanotify_data.access_mutex); |
704 | init_waitqueue_head(&group->fanotify_data.access_waitq); | 704 | init_waitqueue_head(&group->fanotify_data.access_waitq); |
705 | INIT_LIST_HEAD(&group->fanotify_data.access_list); | 705 | INIT_LIST_HEAD(&group->fanotify_data.access_list); |
706 | atomic_set(&group->fanotify_data.bypass_perm, 0); | ||
706 | #endif | 707 | #endif |
707 | switch (flags & FAN_ALL_CLASS_BITS) { | 708 | switch (flags & FAN_ALL_CLASS_BITS) { |
708 | case FAN_CLASS_NOTIF: | 709 | case FAN_CLASS_NOTIF: |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 0a68f924f06..7380763595d 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
@@ -166,7 +166,7 @@ struct fsnotify_group { | |||
166 | struct mutex access_mutex; | 166 | struct mutex access_mutex; |
167 | struct list_head access_list; | 167 | struct list_head access_list; |
168 | wait_queue_head_t access_waitq; | 168 | wait_queue_head_t access_waitq; |
169 | bool bypass_perm; /* protected by access_mutex */ | 169 | atomic_t bypass_perm; |
170 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | 170 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ |
171 | int f_flags; | 171 | int f_flags; |
172 | unsigned int max_marks; | 172 | unsigned int max_marks; |