fsnotify: use _rcu functions for mark list traversal
authorEric Paris <eparis@redhat.com>
Wed, 28 Jul 2010 14:18:38 +0000 (10:18 -0400)
committerEric Paris <eparis@redhat.com>
Wed, 28 Jul 2010 14:18:51 +0000 (10:18 -0400)
In preparation for srcu locking use all _rcu appropiete functions for mark
list addition, removal, and traversal.  The operations are still done under a
spinlock at the end of this patch.

Signed-off-by: Eric Paris <eparis@redhat.com>
fs/notify/inode_mark.c
fs/notify/vfsmount_mark.c

index 83ce6db3403961c12ff8296c5f3d66c026772559..455cb41c729b7b6f55ec8dbf8b90735cf6f93c14 100644 (file)
@@ -67,7 +67,7 @@ void fsnotify_destroy_inode_mark(struct fsnotify_mark *mark)
 
        spin_lock(&inode->i_lock);
 
-       hlist_del_init(&mark->i.i_list);
+       hlist_del_init_rcu(&mark->i.i_list);
        mark->i.inode = NULL;
 
        /*
@@ -92,7 +92,7 @@ void fsnotify_clear_marks_by_inode(struct inode *inode)
        spin_lock(&inode->i_lock);
        hlist_for_each_entry_safe(mark, pos, n, &inode->i_fsnotify_marks, i.i_list) {
                list_add(&mark->i.free_i_list, &free_list);
-               hlist_del_init(&mark->i.i_list);
+               hlist_del_init_rcu(&mark->i.i_list);
                fsnotify_get_mark(mark);
        }
        spin_unlock(&inode->i_lock);
@@ -198,7 +198,7 @@ int fsnotify_add_inode_mark(struct fsnotify_mark *mark,
 
        /* is mark the first mark? */
        if (hlist_empty(&inode->i_fsnotify_marks)) {
-               hlist_add_head(&mark->i.i_list, &inode->i_fsnotify_marks);
+               hlist_add_head_rcu(&mark->i.i_list, &inode->i_fsnotify_marks);
                goto out;
        }
 
@@ -214,13 +214,13 @@ int fsnotify_add_inode_mark(struct fsnotify_mark *mark,
                if (mark->group < lmark->group)
                        continue;
 
-               hlist_add_before(&mark->i.i_list, &lmark->i.i_list);
+               hlist_add_before_rcu(&mark->i.i_list, &lmark->i.i_list);
                goto out;
        }
 
        BUG_ON(last == NULL);
        /* mark should be the last entry.  last is the current last entry */
-       hlist_add_after(last, &mark->i.i_list);
+       hlist_add_after_rcu(last, &mark->i.i_list);
 out:
        fsnotify_recalc_inode_mask_locked(inode);
        spin_unlock(&inode->i_lock);
index c4b3f14d253078e4be32bed54ef9beb46083fa77..b7ae64030021c9edd928fa0463c715e735d73aed 100644 (file)
@@ -39,7 +39,7 @@ void fsnotify_clear_marks_by_mount(struct vfsmount *mnt)
        spin_lock(&mnt->mnt_root->d_lock);
        hlist_for_each_entry_safe(mark, pos, n, &mnt->mnt_fsnotify_marks, m.m_list) {
                list_add(&mark->m.free_m_list, &free_list);
-               hlist_del_init(&mark->m.m_list);
+               hlist_del_init_rcu(&mark->m.m_list);
                fsnotify_get_mark(mark);
        }
        spin_unlock(&mnt->mnt_root->d_lock);
@@ -91,7 +91,7 @@ void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark)
 
        spin_lock(&mnt->mnt_root->d_lock);
 
-       hlist_del_init(&mark->m.m_list);
+       hlist_del_init_rcu(&mark->m.m_list);
        mark->m.mnt = NULL;
 
        fsnotify_recalc_vfsmount_mask_locked(mnt);
@@ -156,7 +156,7 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
 
        /* is mark the first mark? */
        if (hlist_empty(&mnt->mnt_fsnotify_marks)) {
-               hlist_add_head(&mark->m.m_list, &mnt->mnt_fsnotify_marks);
+               hlist_add_head_rcu(&mark->m.m_list, &mnt->mnt_fsnotify_marks);
                goto out;
        }
 
@@ -172,13 +172,13 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
                if (mark->group < lmark->group)
                        continue;
 
-               hlist_add_before(&mark->m.m_list, &lmark->m.m_list);
+               hlist_add_before_rcu(&mark->m.m_list, &lmark->m.m_list);
                goto out;
        }
 
        BUG_ON(last == NULL);
        /* mark should be the last entry.  last is the current last entry */
-       hlist_add_after(last, &mark->m.m_list);
+       hlist_add_after_rcu(last, &mark->m.m_list);
 out:
        fsnotify_recalc_vfsmount_mask_locked(mnt);
        spin_unlock(&mnt->mnt_root->d_lock);