Btrfs: Add properly locking around add_root_to_dirty_list
authorChris Mason <chris.mason@oracle.com>
Thu, 3 May 2012 16:08:48 +0000 (12:08 -0400)
committerChris Mason <chris.mason@oracle.com>
Fri, 4 May 2012 19:14:11 +0000 (15:14 -0400)
add_root_to_dirty_list happens once at the very beginning of the
transaction, but it is still racey.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c

index e801f226d7e028b72ca08b5726ed409215c27b84..086303b9be64e87af8ce5593b2f1a31dfb2a4eaa 100644 (file)
@@ -220,10 +220,12 @@ struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root)
  */
 static void add_root_to_dirty_list(struct btrfs_root *root)
 {
+       spin_lock(&root->fs_info->trans_lock);
        if (root->track_dirty && list_empty(&root->dirty_list)) {
                list_add(&root->dirty_list,
                         &root->fs_info->dirty_cowonly_roots);
        }
+       spin_unlock(&root->fs_info->trans_lock);
 }
 
 /*