btrfs-progs: Introduce change_devices_uuid function.
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Mon, 11 May 2015 08:08:50 +0000 (16:08 +0800)
committerDavid Sterba <dsterba@suse.cz>
Thu, 14 May 2015 13:41:07 +0000 (15:41 +0200)
This function will change all device items' fsid.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
btrfstune.c

index 4ccd6d4..77a8b7a 100644 (file)
@@ -219,6 +219,49 @@ static int change_device_uuid(struct btrfs_root *root, struct extent_buffer *eb,
        return ret;
 }
 
+static int change_devices_uuid(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_root *root = fs_info->chunk_root;
+       struct btrfs_path *path;
+       struct btrfs_key key = {0, 0, 0};
+       int ret = 0;
+
+       /*
+        * Unlike change_extents_uuid, we only need to change fsid in dev_item
+        */
+       if (!fs_info->new_fsid)
+               return 0;
+
+       path = btrfs_alloc_path();
+       if (!path)
+               return -ENOMEM;
+       /* No transaction again */
+       ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
+       if (ret < 0)
+               goto out;
+
+       while (1) {
+               btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
+               if (key.type != BTRFS_DEV_ITEM_KEY ||
+                   key.objectid != BTRFS_DEV_ITEMS_OBJECTID)
+                       goto next;
+               ret = change_device_uuid(root, path->nodes[0], path->slots[0]);
+               if (ret < 0)
+                       goto out;
+next:
+               ret = btrfs_next_item(root, path);
+               if (ret < 0)
+                       goto out;
+               if (ret > 0) {
+                       ret = 0;
+                       goto out;
+               }
+       }
+out:
+       btrfs_free_path(path);
+       return ret;
+}
+
 static void print_usage(void)
 {
        fprintf(stderr, "usage: btrfstune [options] device\n");