diff options
author | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-02-13 11:24:33 +0000 |
---|---|---|
committer | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-02-13 11:24:33 +0000 |
commit | 4305d024938113df5d73021a09eb2a991f54ca2f (patch) | |
tree | d9e7ecc9db14bcc1394607a9e6c644a8b93e9bea /btrfstune.c | |
parent | e693f0e4ffb1776a05b78264ee3d93d5f07efede (diff) |
New upstream release Closes: #849353, #817806, #854915, #845473
Diffstat (limited to 'btrfstune.c')
-rw-r--r-- | btrfstune.c | 89 |
1 files changed, 39 insertions, 50 deletions
diff --git a/btrfstune.c b/btrfstune.c index b824f2b8..e8e3d00a 100644 --- a/btrfstune.c +++ b/btrfstune.c @@ -50,18 +50,18 @@ static int update_seeding_flag(struct btrfs_root *root, int set_flag) if (force) return 0; else - fprintf(stderr, "seeding flag is already set on %s\n", device); + warning("seeding flag is already set on %s", + device); return 1; } super_flags |= BTRFS_SUPER_FLAG_SEEDING; } else { if (!(super_flags & BTRFS_SUPER_FLAG_SEEDING)) { - fprintf(stderr, "seeding flag is not set on %s\n", - device); + warning("seeding flag is not set on %s", device); return 1; } super_flags &= ~BTRFS_SUPER_FLAG_SEEDING; - fprintf(stderr, "Warning: Seeding flag cleared.\n"); + warning("seeding flag cleared on %s", device); } trans = btrfs_start_transaction(root, 1); @@ -118,19 +118,16 @@ static int change_header_uuid(struct btrfs_root *root, struct extent_buffer *eb) static int change_extents_uuid(struct btrfs_fs_info *fs_info) { struct btrfs_root *root = fs_info->extent_root; - struct btrfs_path *path; + struct btrfs_path path; struct btrfs_key key = {0, 0, 0}; int ret = 0; - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; - + btrfs_init_path(&path); /* * Here we don't use transaction as it will takes a lot of reserve * space, and that will make a near-full btrfs unable to change uuid */ - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); if (ret < 0) goto out; @@ -140,33 +137,32 @@ static int change_extents_uuid(struct btrfs_fs_info *fs_info) u64 flags; u64 bytenr; - btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]); if (key.type != BTRFS_EXTENT_ITEM_KEY && key.type != BTRFS_METADATA_ITEM_KEY) goto next; - ei = btrfs_item_ptr(path->nodes[0], path->slots[0], + ei = btrfs_item_ptr(path.nodes[0], path.slots[0], struct btrfs_extent_item); - flags = btrfs_extent_flags(path->nodes[0], ei); + flags = btrfs_extent_flags(path.nodes[0], ei); if (!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)) goto next; bytenr = key.objectid; eb = read_tree_block(root, bytenr, root->nodesize, 0); if (IS_ERR(eb)) { - fprintf(stderr, "Failed to read tree block: %llu\n", - bytenr); + error("failed to read tree block: %llu", bytenr); ret = PTR_ERR(eb); goto out; } ret = change_header_uuid(root, eb); free_extent_buffer(eb); if (ret < 0) { - fprintf(stderr, "Failed to change uuid of tree block: %llu\n", + error("failed to change uuid of tree block: %llu", bytenr); goto out; } next: - ret = btrfs_next_item(root, path); + ret = btrfs_next_item(root, &path); if (ret < 0) goto out; if (ret > 0) { @@ -176,7 +172,7 @@ next: } out: - btrfs_free_path(path); + btrfs_release_path(&path); return ret; } @@ -204,28 +200,26 @@ static int change_device_uuid(struct btrfs_root *root, struct extent_buffer *eb, 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_path path; struct btrfs_key key = {0, 0, 0}; int ret = 0; - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; + btrfs_init_path(&path); /* No transaction again */ - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + 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]); + 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]); + ret = change_device_uuid(root, path.nodes[0], path.slots[0]); if (ret < 0) goto out; next: - ret = btrfs_next_item(root, path); + ret = btrfs_next_item(root, &path); if (ret < 0) goto out; if (ret > 0) { @@ -234,7 +228,7 @@ next: } } out: - btrfs_free_path(path); + btrfs_release_path(&path); return ret; } @@ -310,8 +304,8 @@ static int change_uuid(struct btrfs_fs_info *fs_info, const char *new_fsid_str) uuid_parse(new_fsid_str, tmp); if (memcmp(tmp, new_fsid, BTRFS_FSID_SIZE)) { - fprintf(stderr, - "ERROR: New fsid %s is not the same with unfinished fsid change\n", + error( + "new fsid %s is not the same with unfinished fsid change", new_fsid_str); return -EINVAL; } @@ -343,7 +337,7 @@ static int change_uuid(struct btrfs_fs_info *fs_info, const char *new_fsid_str) printf("Change fsid in extents\n"); ret = change_extents_uuid(fs_info); if (ret < 0) { - fprintf(stderr, "Failed to change UUID of metadata\n"); + error("failed to change UUID of metadata: %d", ret); goto out; } @@ -351,7 +345,7 @@ static int change_uuid(struct btrfs_fs_info *fs_info, const char *new_fsid_str) printf("Change fsid on devices\n"); ret = change_devices_uuid(fs_info); if (ret < 0) { - fprintf(stderr, "Failed to change UUID of devices\n"); + error("failed to change UUID of devices: %d", ret); goto out; } @@ -448,13 +442,11 @@ int main(int argc, char *argv[]) } if (random_fsid && new_fsid_str) { - fprintf(stderr, - "ERROR: Random fsid can't be used with specified fsid\n"); + error("random fsid can't be used with specified fsid"); return 1; } if (!super_flags && !seeding_flag && !(random_fsid || new_fsid_str)) { - fprintf(stderr, - "ERROR: At least one option should be assigned.\n"); + error("at least one option should be specified"); print_usage(); return 1; } @@ -464,39 +456,36 @@ int main(int argc, char *argv[]) ret = uuid_parse(new_fsid_str, tmp); if (ret < 0) { - fprintf(stderr, - "ERROR: Could not parse UUID: %s\n", - new_fsid_str); + error("could not parse UUID: %s", new_fsid_str); return 1; } if (!test_uuid_unique(new_fsid_str)) { - fprintf(stderr, - "ERROR: Fsid %s is not unique\n", - new_fsid_str); + error("fsid %s is not unique", new_fsid_str); return 1; } } ret = check_mounted(device); if (ret < 0) { - fprintf(stderr, "Could not check mount status: %s\n", + error("could not check mount status of %s: %s", device, strerror(-ret)); return 1; } else if (ret) { - fprintf(stderr, "%s is mounted\n", device); + error("%s is mounted", device); return 1; } root = open_ctree(device, 0, ctree_flags); if (!root) { - fprintf(stderr, "Open ctree failed\n"); + error("open ctree failed"); return 1; } if (seeding_flag) { if (!seeding_value && !force) { - fprintf(stderr, "Warning: This is dangerous, clearing the seeding flag may cause the derived device not to be mountable!\n"); + warning( +"this is dangerous, clearing the seeding flag may cause the derived device not to be mountable!"); ret = ask_user("We are going to clear the seeding flag, are you sure?"); if (!ret) { fprintf(stderr, "Clear seeding flag canceled\n"); @@ -520,10 +509,10 @@ int main(int argc, char *argv[]) if (random_fsid || new_fsid_str) { if (!force) { - fprintf(stderr, - "Warning: It's highly recommended to run 'btrfs check' before this operation\n"); - fprintf(stderr, - "Also canceling running UUID change progress may cause corruption\n"); + warning( + "it's highly recommended to run 'btrfs check' before this operation"); + warning( + "also canceling running UUID change progress may cause corruption"); ret = ask_user("We are going to change UUID, are your sure?"); if (!ret) { fprintf(stderr, "UUID change canceled\n"); @@ -542,7 +531,7 @@ int main(int argc, char *argv[]) } else { root->fs_info->readonly = 1; ret = 1; - fprintf(stderr, "btrfstune failed\n"); + error("btrfstune failed"); } out: close_ctree(root); |