diff options
| -rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 27 | ||||
| -rw-r--r-- | include/linux/fanotify.h | 7 | ||||
| -rw-r--r-- | include/linux/fsnotify_backend.h | 1 |
3 files changed, 28 insertions, 7 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 032b837fcd11..b966b7230f47 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
| @@ -195,6 +195,14 @@ static int prepare_for_access_response(struct fsnotify_group *group, | |||
| 195 | re->fd = fd; | 195 | re->fd = fd; |
| 196 | 196 | ||
| 197 | mutex_lock(&group->fanotify_data.access_mutex); | 197 | mutex_lock(&group->fanotify_data.access_mutex); |
| 198 | |||
| 199 | if (group->fanotify_data.bypass_perm) { | ||
| 200 | mutex_unlock(&group->fanotify_data.access_mutex); | ||
| 201 | kmem_cache_free(fanotify_response_event_cache, re); | ||
| 202 | event->response = FAN_ALLOW; | ||
| 203 | return 0; | ||
| 204 | } | ||
| 205 | |||
| 198 | list_add_tail(&re->list, &group->fanotify_data.access_list); | 206 | list_add_tail(&re->list, &group->fanotify_data.access_list); |
| 199 | mutex_unlock(&group->fanotify_data.access_mutex); | 207 | mutex_unlock(&group->fanotify_data.access_mutex); |
| 200 | 208 | ||
| @@ -364,9 +372,28 @@ static ssize_t fanotify_write(struct file *file, const char __user *buf, size_t | |||
| 364 | static int fanotify_release(struct inode *ignored, struct file *file) | 372 | static int fanotify_release(struct inode *ignored, struct file *file) |
| 365 | { | 373 | { |
| 366 | struct fsnotify_group *group = file->private_data; | 374 | struct fsnotify_group *group = file->private_data; |
| 375 | struct fanotify_response_event *re, *lre; | ||
| 367 | 376 | ||
| 368 | pr_debug("%s: file=%p group=%p\n", __func__, file, group); | 377 | pr_debug("%s: file=%p group=%p\n", __func__, file, group); |
| 369 | 378 | ||
| 379 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | ||
| 380 | mutex_lock(&group->fanotify_data.access_mutex); | ||
| 381 | |||
| 382 | group->fanotify_data.bypass_perm = true; | ||
| 383 | |||
| 384 | list_for_each_entry_safe(re, lre, &group->fanotify_data.access_list, list) { | ||
| 385 | pr_debug("%s: found group=%p re=%p event=%p\n", __func__, group, | ||
| 386 | re, re->event); | ||
| 387 | |||
| 388 | list_del_init(&re->list); | ||
| 389 | re->event->response = FAN_ALLOW; | ||
| 390 | |||
| 391 | kmem_cache_free(fanotify_response_event_cache, re); | ||
| 392 | } | ||
| 393 | mutex_unlock(&group->fanotify_data.access_mutex); | ||
| 394 | |||
| 395 | wake_up(&group->fanotify_data.access_waitq); | ||
| 396 | #endif | ||
| 370 | /* matches the fanotify_init->fsnotify_alloc_group */ | 397 | /* matches the fanotify_init->fsnotify_alloc_group */ |
| 371 | fsnotify_put_group(group); | 398 | fsnotify_put_group(group); |
| 372 | 399 | ||
diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index f0949a57ca9d..985435622ecd 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h | |||
| @@ -95,11 +95,4 @@ struct fanotify_response { | |||
| 95 | (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \ | 95 | (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \ |
| 96 | (long)(meta)->event_len <= (long)(len)) | 96 | (long)(meta)->event_len <= (long)(len)) |
| 97 | 97 | ||
| 98 | #ifdef __KERNEL__ | ||
| 99 | |||
| 100 | struct fanotify_wait { | ||
| 101 | struct fsnotify_event *event; | ||
| 102 | __s32 fd; | ||
| 103 | }; | ||
| 104 | #endif /* __KERNEL__ */ | ||
| 105 | #endif /* _LINUX_FANOTIFY_H */ | 98 | #endif /* _LINUX_FANOTIFY_H */ |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index ed36fb57c426..e40190d16878 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
| @@ -156,6 +156,7 @@ struct fsnotify_group { | |||
| 156 | struct mutex access_mutex; | 156 | struct mutex access_mutex; |
| 157 | struct list_head access_list; | 157 | struct list_head access_list; |
| 158 | wait_queue_head_t access_waitq; | 158 | wait_queue_head_t access_waitq; |
| 159 | bool bypass_perm; /* protected by access_mutex */ | ||
| 159 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | 160 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ |
| 160 | int f_flags; | 161 | int f_flags; |
| 161 | } fanotify_data; | 162 | } fanotify_data; |
