btrfs: call btrfs_check_uuid_tree_entry directly in btrfs_uuid_tree_iterate
authorNikolay Borisov <nborisov@suse.com>
Tue, 18 Feb 2020 14:56:07 +0000 (16:56 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Mar 2020 16:01:41 +0000 (17:01 +0100)
btrfs_uuid_tree_iterate is called from only once place and its 2nd
argument is always btrfs_check_uuid_tree_entry. Simplify
btrfs_uuid_tree_iterate's signature by removing its 2nd argument and
directly calling btrfs_check_uuid_tree_entry. Also move the latter into
uuid-tree.h. No functional changes.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
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/ctree.h
fs/btrfs/uuid-tree.c
fs/btrfs/volumes.c

index bb237d5..ad275d0 100644 (file)
@@ -2738,9 +2738,7 @@ int btrfs_uuid_tree_add(struct btrfs_trans_handle *trans, u8 *uuid, u8 type,
                        u64 subid);
 int btrfs_uuid_tree_remove(struct btrfs_trans_handle *trans, u8 *uuid, u8 type,
                        u64 subid);
-int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info,
-                           int (*check_func)(struct btrfs_fs_info *, u8 *, u8,
-                                             u64));
+int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info);
 
 /* dir-item.c */
 int btrfs_check_dir_item_collision(struct btrfs_root *root, u64 dir,
index 76b84f2..dc95e95 100644 (file)
@@ -246,9 +246,53 @@ out:
        return ret;
 }
 
-int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info,
-                           int (*check_func)(struct btrfs_fs_info *, u8 *, u8,
-                                             u64))
+/*
+ * Check if there's an matching subvolume for given UUID
+ *
+ * Return:
+ * 0   check succeeded, the entry is not outdated
+ * > 0 if the check failed, the caller should remove the entry
+ * < 0 if an error occurred
+ */
+static int btrfs_check_uuid_tree_entry(struct btrfs_fs_info *fs_info,
+                                      u8 *uuid, u8 type, u64 subvolid)
+{
+       struct btrfs_key key;
+       int ret = 0;
+       struct btrfs_root *subvol_root;
+
+       if (type != BTRFS_UUID_KEY_SUBVOL &&
+           type != BTRFS_UUID_KEY_RECEIVED_SUBVOL)
+               goto out;
+
+       key.objectid = subvolid;
+       key.type = BTRFS_ROOT_ITEM_KEY;
+       key.offset = (u64)-1;
+       subvol_root = btrfs_get_fs_root(fs_info, &key, true);
+       if (IS_ERR(subvol_root)) {
+               ret = PTR_ERR(subvol_root);
+               if (ret == -ENOENT)
+                       ret = 1;
+               goto out;
+       }
+
+       switch (type) {
+       case BTRFS_UUID_KEY_SUBVOL:
+               if (memcmp(uuid, subvol_root->root_item.uuid, BTRFS_UUID_SIZE))
+                       ret = 1;
+               break;
+       case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
+               if (memcmp(uuid, subvol_root->root_item.received_uuid,
+                          BTRFS_UUID_SIZE))
+                       ret = 1;
+               break;
+       }
+       btrfs_put_root(subvol_root);
+out:
+       return ret;
+}
+
+int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info)
 {
        struct btrfs_root *root = fs_info->uuid_root;
        struct btrfs_key key;
@@ -305,7 +349,8 @@ again_search_slot:
                        read_extent_buffer(leaf, &subid_le, offset,
                                           sizeof(subid_le));
                        subid_cpu = le64_to_cpu(subid_le);
-                       ret = check_func(fs_info, uuid, key.type, subid_cpu);
+                       ret = btrfs_check_uuid_tree_entry(fs_info, uuid,
+                                                         key.type, subid_cpu);
                        if (ret < 0)
                                goto out;
                        if (ret > 0) {
index d8a8886..63e499d 100644 (file)
@@ -4442,51 +4442,6 @@ out:
        return 0;
 }
 
-/*
- * Callback for btrfs_uuid_tree_iterate().
- * returns:
- * 0   check succeeded, the entry is not outdated.
- * < 0 if an error occurred.
- * > 0 if the check failed, which means the caller shall remove the entry.
- */
-static int btrfs_check_uuid_tree_entry(struct btrfs_fs_info *fs_info,
-                                      u8 *uuid, u8 type, u64 subid)
-{
-       struct btrfs_key key;
-       int ret = 0;
-       struct btrfs_root *subvol_root;
-
-       if (type != BTRFS_UUID_KEY_SUBVOL &&
-           type != BTRFS_UUID_KEY_RECEIVED_SUBVOL)
-               goto out;
-
-       key.objectid = subid;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-       subvol_root = btrfs_get_fs_root(fs_info, &key, true);
-       if (IS_ERR(subvol_root)) {
-               ret = PTR_ERR(subvol_root);
-               if (ret == -ENOENT)
-                       ret = 1;
-               goto out;
-       }
-
-       switch (type) {
-       case BTRFS_UUID_KEY_SUBVOL:
-               if (memcmp(uuid, subvol_root->root_item.uuid, BTRFS_UUID_SIZE))
-                       ret = 1;
-               break;
-       case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
-               if (memcmp(uuid, subvol_root->root_item.received_uuid,
-                          BTRFS_UUID_SIZE))
-                       ret = 1;
-               break;
-       }
-       btrfs_put_root(subvol_root);
-out:
-       return ret;
-}
-
 static int btrfs_uuid_rescan_kthread(void *data)
 {
        struct btrfs_fs_info *fs_info = (struct btrfs_fs_info *)data;
@@ -4497,7 +4452,7 @@ static int btrfs_uuid_rescan_kthread(void *data)
         * to delete all entries that contain outdated data.
         * 2nd step is to add all missing entries to the UUID tree.
         */
-       ret = btrfs_uuid_tree_iterate(fs_info, btrfs_check_uuid_tree_entry);
+       ret = btrfs_uuid_tree_iterate(fs_info);
        if (ret < 0) {
                btrfs_warn(fs_info, "iterating uuid_tree failed %d", ret);
                up(&fs_info->uuid_tree_rescan_sem);