fanotify: factor out helpers to add/remove mark
authorAmir Goldstein <amir73il@gmail.com>
Sat, 23 Jun 2018 14:54:51 +0000 (17:54 +0300)
committerJan Kara <jack@suse.cz>
Wed, 27 Jun 2018 11:45:12 +0000 (13:45 +0200)
Factor out helpers fanotify_add_mark() and fanotify_remove_mark()
to reduce duplicated code.

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

index 3899ad177651ad29a899e67fe4baeb4c0e7604ad..d736a833fe39928b020c77e9f8f1fa7a304d1af9 100644 (file)
@@ -524,17 +524,16 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
        return mask & oldmask;
 }
 
-static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
-                                        struct vfsmount *mnt, __u32 mask,
-                                        unsigned int flags)
+static int fanotify_remove_mark(struct fsnotify_group *group,
+                               fsnotify_connp_t *connp, __u32 mask,
+                               unsigned int flags)
 {
        struct fsnotify_mark *fsn_mark = NULL;
        __u32 removed;
        int destroy_mark;
 
        mutex_lock(&group->mark_mutex);
-       fsn_mark = fsnotify_find_mark(&real_mount(mnt)->mnt_fsnotify_marks,
-                                     group);
+       fsn_mark = fsnotify_find_mark(connp, group);
        if (!fsn_mark) {
                mutex_unlock(&group->mark_mutex);
                return -ENOENT;
@@ -550,39 +549,25 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
        if (destroy_mark)
                fsnotify_free_mark(fsn_mark);
 
+       /* matches the fsnotify_find_mark() */
        fsnotify_put_mark(fsn_mark);
        return 0;
 }
 
+static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
+                                        struct vfsmount *mnt, __u32 mask,
+                                        unsigned int flags)
+{
+       return fanotify_remove_mark(group, &real_mount(mnt)->mnt_fsnotify_marks,
+                                   mask, flags);
+}
+
 static int fanotify_remove_inode_mark(struct fsnotify_group *group,
                                      struct inode *inode, __u32 mask,
                                      unsigned int flags)
 {
-       struct fsnotify_mark *fsn_mark = NULL;
-       __u32 removed;
-       int destroy_mark;
-
-       mutex_lock(&group->mark_mutex);
-       fsn_mark = fsnotify_find_mark(&inode->i_fsnotify_marks, group);
-       if (!fsn_mark) {
-               mutex_unlock(&group->mark_mutex);
-               return -ENOENT;
-       }
-
-       removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
-                                                &destroy_mark);
-       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);
-       if (destroy_mark)
-               fsnotify_free_mark(fsn_mark);
-
-       /* matches the fsnotify_find_mark() */
-       fsnotify_put_mark(fsn_mark);
-
-       return 0;
+       return fanotify_remove_mark(group, &inode->i_fsnotify_marks, mask,
+                                   flags);
 }
 
 static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
@@ -639,19 +624,17 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,
 }
 
 
-static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
-                                     struct vfsmount *mnt, __u32 mask,
-                                     unsigned int flags)
+static int fanotify_add_mark(struct fsnotify_group *group,
+                            fsnotify_connp_t *connp, unsigned int type,
+                            __u32 mask, unsigned int flags)
 {
-       fsnotify_connp_t *connp = &real_mount(mnt)->mnt_fsnotify_marks;
        struct fsnotify_mark *fsn_mark;
        __u32 added;
 
        mutex_lock(&group->mark_mutex);
        fsn_mark = fsnotify_find_mark(connp, group);
        if (!fsn_mark) {
-               fsn_mark = fanotify_add_new_mark(group, connp,
-                                                FSNOTIFY_OBJ_TYPE_VFSMOUNT);
+               fsn_mark = fanotify_add_new_mark(group, connp, type);
                if (IS_ERR(fsn_mark)) {
                        mutex_unlock(&group->mark_mutex);
                        return PTR_ERR(fsn_mark);
@@ -666,14 +649,18 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
        return 0;
 }
 
+static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
+                                     struct vfsmount *mnt, __u32 mask,
+                                     unsigned int flags)
+{
+       return fanotify_add_mark(group, &real_mount(mnt)->mnt_fsnotify_marks,
+                                FSNOTIFY_OBJ_TYPE_VFSMOUNT, mask, flags);
+}
+
 static int fanotify_add_inode_mark(struct fsnotify_group *group,
                                   struct inode *inode, __u32 mask,
                                   unsigned int flags)
 {
-       fsnotify_connp_t *connp = &inode->i_fsnotify_marks;
-       struct fsnotify_mark *fsn_mark;
-       __u32 added;
-
        pr_debug("%s: group=%p inode=%p\n", __func__, group, inode);
 
        /*
@@ -686,23 +673,8 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group,
            (atomic_read(&inode->i_writecount) > 0))
                return 0;
 
-       mutex_lock(&group->mark_mutex);
-       fsn_mark = fsnotify_find_mark(connp, group);
-       if (!fsn_mark) {
-               fsn_mark = fanotify_add_new_mark(group, connp,
-                                                FSNOTIFY_OBJ_TYPE_INODE);
-               if (IS_ERR(fsn_mark)) {
-                       mutex_unlock(&group->mark_mutex);
-                       return PTR_ERR(fsn_mark);
-               }
-       }
-       added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
-       if (added & ~fsnotify_conn_mask(fsn_mark->connector))
-               fsnotify_recalc_mask(fsn_mark->connector);
-       mutex_unlock(&group->mark_mutex);
-
-       fsnotify_put_mark(fsn_mark);
-       return 0;
+       return fanotify_add_mark(group, &inode->i_fsnotify_marks,
+                                FSNOTIFY_OBJ_TYPE_INODE, mask, flags);
 }
 
 /* fanotify syscalls */