Btrfs: do not check inode's runtime flags under root->orphan_lock
authorLiu Bo <bo.li.liu@oracle.com>
Thu, 25 Jan 2018 18:02:55 +0000 (11:02 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Mar 2018 13:09:36 +0000 (15:09 +0200)
It's not necessary to hold ->orphan_lock when checking inode's runtime
flags.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 28491a82e6456fdf3b1ba1c350bcd74240f06976..4d3a4d1507a1f15bcb6a00aba15b3b922224f97c 100644 (file)
@@ -3355,14 +3355,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans,
                        return -ENOMEM;
        }
 
-       spin_lock(&root->orphan_lock);
-       if (!root->orphan_block_rsv) {
-               root->orphan_block_rsv = block_rsv;
-       } else if (block_rsv) {
-               btrfs_free_block_rsv(fs_info, block_rsv);
-               block_rsv = NULL;
-       }
-
        if (!test_and_set_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
                              &inode->runtime_flags)) {
 #if 0
@@ -3377,12 +3369,23 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans,
                        insert = 1;
 #endif
                insert = 1;
-               atomic_inc(&root->orphan_inodes);
        }
 
        if (!test_and_set_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
                              &inode->runtime_flags))
                reserve = 1;
+
+       spin_lock(&root->orphan_lock);
+       /* If someone has created ->orphan_block_rsv, be happy to use it. */
+       if (!root->orphan_block_rsv) {
+               root->orphan_block_rsv = block_rsv;
+       } else if (block_rsv) {
+               btrfs_free_block_rsv(fs_info, block_rsv);
+               block_rsv = NULL;
+       }
+
+       if (insert)
+               atomic_inc(&root->orphan_inodes);
        spin_unlock(&root->orphan_lock);
 
        /* grab metadata reservation from transaction handle */