]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
fsnotify: Remove indirection from fsnotify_detach_mark()
authorJan Kara <jack@suse.cz>
Wed, 15 Mar 2017 08:48:11 +0000 (09:48 +0100)
committerJan Kara <jack@suse.cz>
Mon, 10 Apr 2017 15:37:35 +0000 (17:37 +0200)
fsnotify_detach_mark() calls fsnotify_destroy_inode_mark() or
fsnotify_destroy_vfsmount_mark() to remove mark from object list. These
two functions are however very similar and differ only in the lock they
use to protect the object list of marks. Simplify the code by removing
the indirection and removing mark from the object list in a common
function.

Reviewed-by: Miklos Szeredi <mszeredi@redhat.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/notify/fsnotify.h
fs/notify/inode_mark.c
fs/notify/mark.c
fs/notify/vfsmount_mark.c

index 225924274f8a519b6b777d173ce25e1e5aaddbe7..510f027bdf0f0e3570397d2baae82ebaa64a43bc 100644 (file)
@@ -18,10 +18,6 @@ extern struct srcu_struct fsnotify_mark_srcu;
 extern int fsnotify_compare_groups(struct fsnotify_group *a,
                                   struct fsnotify_group *b);
 
-/* vfsmount specific destruction of a mark */
-extern void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark);
-/* inode specific destruction of a mark */
-extern struct inode *fsnotify_destroy_inode_mark(struct fsnotify_mark *mark);
 /* Find mark belonging to given group in the list of marks */
 extern struct fsnotify_mark *fsnotify_find_mark(
                                        struct fsnotify_mark_connector *conn,
index f05fc49b8242c108762d700b7a54bbcce08d3536..080b6d8b9973d59fdbcecc60a06a9bab6975585f 100644 (file)
@@ -35,27 +35,6 @@ void fsnotify_recalc_inode_mask(struct inode *inode)
        fsnotify_recalc_mask(inode->i_fsnotify_marks);
 }
 
-struct inode *fsnotify_destroy_inode_mark(struct fsnotify_mark *mark)
-{
-       struct inode *inode = mark->connector->inode;
-       bool empty;
-
-       BUG_ON(!mutex_is_locked(&mark->group->mark_mutex));
-       assert_spin_locked(&mark->lock);
-
-       spin_lock(&inode->i_lock);
-
-       hlist_del_init_rcu(&mark->obj_list);
-       empty = hlist_empty(&mark->connector->list);
-       mark->connector = NULL;
-
-       spin_unlock(&inode->i_lock);
-
-       fsnotify_recalc_mask(inode->i_fsnotify_marks);
-
-       return empty ? inode : NULL;
-}
-
 /*
  * Given a group clear all of the inode marks associated with that group.
  */
index f32ca924c44ed7cea2df8ebed52d0fcc19eda62a..08ab7b252322da210e2953478af3b712c6937e24 100644 (file)
@@ -141,6 +141,30 @@ void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn)
        }
 }
 
+static struct inode *fsnotify_detach_from_object(struct fsnotify_mark *mark)
+{
+       struct fsnotify_mark_connector *conn;
+       struct inode *inode = NULL;
+       spinlock_t *lock;
+
+       conn = mark->connector;
+       if (conn->flags & FSNOTIFY_OBJ_TYPE_INODE)
+               lock = &conn->inode->i_lock;
+       else
+               lock = &conn->mnt->mnt_root->d_lock;
+       spin_lock(lock);
+       hlist_del_init_rcu(&mark->obj_list);
+       if (hlist_empty(&conn->list)) {
+               if (conn->flags & FSNOTIFY_OBJ_TYPE_INODE)
+                       inode = conn->inode;
+       }
+       mark->connector = NULL;
+       spin_unlock(lock);
+       fsnotify_recalc_mask(conn);
+
+       return inode;
+}
+
 /*
  * Remove mark from inode / vfsmount list, group list, drop inode reference
  * if we got one.
@@ -164,12 +188,8 @@ void fsnotify_detach_mark(struct fsnotify_mark *mark)
 
        mark->flags &= ~FSNOTIFY_MARK_FLAG_ATTACHED;
 
-       if (mark->connector->flags & FSNOTIFY_OBJ_TYPE_INODE)
-               inode = fsnotify_destroy_inode_mark(mark);
-       else if (mark->connector->flags & FSNOTIFY_OBJ_TYPE_VFSMOUNT)
-               fsnotify_destroy_vfsmount_mark(mark);
-       else
-               BUG();
+       inode = fsnotify_detach_from_object(mark);
+
        /*
         * Note that we didn't update flags telling whether inode cares about
         * what's happening with children. We update these flags from
index 3476ee44b2c5a3783bc7c01a9af484777bf51d1b..26da5c209944166da4b4bf7fa2b765c7719bb4c6 100644 (file)
@@ -39,24 +39,6 @@ void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt)
        fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks);
 }
 
-void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark)
-{
-       struct vfsmount *mnt = mark->connector->mnt;
-       struct mount *m = real_mount(mnt);
-
-       BUG_ON(!mutex_is_locked(&mark->group->mark_mutex));
-       assert_spin_locked(&mark->lock);
-
-       spin_lock(&mnt->mnt_root->d_lock);
-
-       hlist_del_init_rcu(&mark->obj_list);
-       mark->connector = NULL;
-
-       spin_unlock(&mnt->mnt_root->d_lock);
-
-       fsnotify_recalc_mask(m->mnt_fsnotify_marks);
-}
-
 /*
  * given a group and vfsmount, find the mark associated with that combination.
  * if found take a reference to that mark and return it, else return NULL