summaryrefslogtreecommitdiffstats
path: root/include/linux/fsnotify_backend.h
diff options
context:
space:
mode:
authorJan Kara2016-12-21 12:15:30 +0100
committerJan Kara2017-04-10 17:37:36 +0200
commit6b3f05d24d355f50f3d9814304650fcab0efb482 (patch)
tree362bb47ec0f38adc2cdd05f28e3a25ece2f66787 /include/linux/fsnotify_backend.h
parentfsnotify: Move queueing of mark for destruction into fsnotify_put_mark() (diff)
downloadkernel-qcow2-linux-6b3f05d24d355f50f3d9814304650fcab0efb482.tar.gz
kernel-qcow2-linux-6b3f05d24d355f50f3d9814304650fcab0efb482.tar.xz
kernel-qcow2-linux-6b3f05d24d355f50f3d9814304650fcab0efb482.zip
fsnotify: Detach mark from object list when last reference is dropped
Instead of removing mark from object list from fsnotify_detach_mark(), remove the mark when last reference to the mark is dropped. This will allow fanotify to wait for userspace response to event without having to hold onto fsnotify_mark_srcu. To avoid pinning inodes by elevated refcount (and thus e.g. delaying file deletion) while someone holds mark reference, we detach connector from the object also from fsnotify_destroy_marks() and not only after removing last mark from the list as it was now. Reviewed-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'include/linux/fsnotify_backend.h')
-rw-r--r--include/linux/fsnotify_backend.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 84d71b6f75f6..a483614b25d0 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -245,9 +245,9 @@ struct fsnotify_mark {
struct list_head g_list;
/* Protects inode / mnt pointers, flags, masks */
spinlock_t lock;
- /* List of marks for inode / vfsmount [connector->lock] */
+ /* List of marks for inode / vfsmount [connector->lock, mark ref] */
struct hlist_node obj_list;
- /* Head of list of marks for an object [mark->lock, group->mark_mutex] */
+ /* Head of list of marks for an object [mark ref] */
struct fsnotify_mark_connector *connector;
/* Events types to ignore [mark->lock, group->mark_mutex] */
__u32 ignored_mask;