btrfs: make btrfs_root::free_objectid hold the next available objectid
authorNikolay Borisov <nborisov@suse.com>
Mon, 7 Dec 2020 15:32:36 +0000 (17:32 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:58:50 +0000 (22:58 +0100)
Adjust the way free_objectid is being initialized, it now stores
BTRFS_FIRST_FREE_OBJECTID rather than the, somewhat arbitrary,
BTRFS_FIRST_FREE_OBJECTID - 1. This change also has the added benefit
that now it becomes unnecessary to explicitly initialize free_objectid
for a newly create fs root.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c

index a5ae0bb..5473bed 100644 (file)
@@ -4767,10 +4767,10 @@ int btrfs_init_root_free_objectid(struct btrfs_root *root)
                slot = path->slots[0] - 1;
                l = path->nodes[0];
                btrfs_item_key_to_cpu(l, &found_key, slot);
-               root->free_objectid = max_t(u64, found_key.objectid,
-                                 BTRFS_FIRST_FREE_OBJECTID - 1);
+               root->free_objectid = max_t(u64, found_key.objectid + 1,
+                                           BTRFS_FIRST_FREE_OBJECTID);
        } else {
-               root->free_objectid = BTRFS_FIRST_FREE_OBJECTID - 1;
+               root->free_objectid = BTRFS_FIRST_FREE_OBJECTID;
        }
        ret = 0;
 error:
@@ -4791,7 +4791,7 @@ int btrfs_get_free_objectid(struct btrfs_root *root, u64 *objectid)
                goto out;
        }
 
-       *objectid = ++root->free_objectid;
+       *objectid = root->free_objectid++;
        ret = 0;
 out:
        mutex_unlock(&root->objectid_mutex);
index 0fe4df0..356905d 100644 (file)
@@ -8598,9 +8598,13 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
        struct inode *inode;
        int err;
        u64 index = 0;
+       u64 ino;
+
+       err = btrfs_get_free_objectid(new_root, &ino);
+       if (err < 0)
+               return err;
 
-       inode = btrfs_new_inode(trans, new_root, NULL, "..", 2,
-                               new_dirid, new_dirid,
+       inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, ino, ino,
                                S_IFDIR | (~current_umask() & S_IRWXUGO),
                                &index);
        if (IS_ERR(inode))
index 2041c4b..d842207 100644 (file)
@@ -724,10 +724,6 @@ static noinline int create_subvol(struct inode *dir,
                goto fail;
        }
 
-       mutex_lock(&new_root->objectid_mutex);
-       new_root->free_objectid = new_dirid;
-       mutex_unlock(&new_root->objectid_mutex);
-
        /*
         * insert the directory item
         */