OSDN Git Service

fsnotify: add helper to get mask from connector
authorAmir Goldstein <amir73il@gmail.com>
Sat, 23 Jun 2018 14:54:50 +0000 (17:54 +0300)
committerJan Kara <jack@suse.cz>
Wed, 27 Jun 2018 11:45:07 +0000 (13:45 +0200)
Use a helper to get the mask from the object (i.e. i_fsnotify_mask)
to generalize code of add/remove inode/vfsmount mark.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/notify/fanotify/fanotify_user.c
fs/notify/mark.c
include/linux/fsnotify_backend.h

index 81212b2..3899ad1 100644 (file)
@@ -542,8 +542,8 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
 
        removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
                                                 &destroy_mark);
-       if (removed & real_mount(mnt)->mnt_fsnotify_mask)
-               fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks);
+       if (removed & fsnotify_conn_mask(fsn_mark->connector))
+               fsnotify_recalc_mask(fsn_mark->connector);
        if (destroy_mark)
                fsnotify_detach_mark(fsn_mark);
        mutex_unlock(&group->mark_mutex);
@@ -571,8 +571,8 @@ static int fanotify_remove_inode_mark(struct fsnotify_group *group,
 
        removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
                                                 &destroy_mark);
-       if (removed & inode->i_fsnotify_mask)
-               fsnotify_recalc_mask(inode->i_fsnotify_marks);
+       if (removed & fsnotify_conn_mask(fsn_mark->connector))
+               fsnotify_recalc_mask(fsn_mark->connector);
        if (destroy_mark)
                fsnotify_detach_mark(fsn_mark);
        mutex_unlock(&group->mark_mutex);
@@ -658,8 +658,8 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
                }
        }
        added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
-       if (added & ~real_mount(mnt)->mnt_fsnotify_mask)
-               fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks);
+       if (added & ~fsnotify_conn_mask(fsn_mark->connector))
+               fsnotify_recalc_mask(fsn_mark->connector);
        mutex_unlock(&group->mark_mutex);
 
        fsnotify_put_mark(fsn_mark);
@@ -697,8 +697,8 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group,
                }
        }
        added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
-       if (added & ~inode->i_fsnotify_mask)
-               fsnotify_recalc_mask(inode->i_fsnotify_marks);
+       if (added & ~fsnotify_conn_mask(fsn_mark->connector))
+               fsnotify_recalc_mask(fsn_mark->connector);
        mutex_unlock(&group->mark_mutex);
 
        fsnotify_put_mark(fsn_mark);
index 959bc73..05506d6 100644 (file)
@@ -109,6 +109,23 @@ void fsnotify_get_mark(struct fsnotify_mark *mark)
        refcount_inc(&mark->refcnt);
 }
 
+static __u32 *fsnotify_conn_mask_p(struct fsnotify_mark_connector *conn)
+{
+       if (conn->type == FSNOTIFY_OBJ_TYPE_INODE)
+               return &fsnotify_conn_inode(conn)->i_fsnotify_mask;
+       else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT)
+               return &fsnotify_conn_mount(conn)->mnt_fsnotify_mask;
+       return NULL;
+}
+
+__u32 fsnotify_conn_mask(struct fsnotify_mark_connector *conn)
+{
+       if (WARN_ON(!fsnotify_valid_obj_type(conn->type)))
+               return 0;
+
+       return *fsnotify_conn_mask_p(conn);
+}
+
 static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn)
 {
        u32 new_mask = 0;
@@ -119,10 +136,10 @@ static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn)
                if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)
                        new_mask |= mark->mask;
        }
-       if (conn->type == FSNOTIFY_OBJ_TYPE_INODE)
-               fsnotify_conn_inode(conn)->i_fsnotify_mask = new_mask;
-       else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT)
-               fsnotify_conn_mount(conn)->mnt_fsnotify_mask = new_mask;
+       if (WARN_ON(!fsnotify_valid_obj_type(conn->type)))
+               return;
+
+       *fsnotify_conn_mask_p(conn) = new_mask;
 }
 
 /*
index 381cfb0..2b9b6f1 100644 (file)
@@ -401,6 +401,8 @@ extern struct fsnotify_event *fsnotify_remove_first_event(struct fsnotify_group
 
 /* functions used to manipulate the marks attached to inodes */
 
+/* Get mask of events for a list of marks */
+extern __u32 fsnotify_conn_mask(struct fsnotify_mark_connector *conn);
 /* Calculate mask of events for a list of marks */
 extern void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn);
 extern void fsnotify_init_mark(struct fsnotify_mark *mark,