Search
SailfishOS Open Build Service
>
Projects
>
nemo
:
testing:hw
:
x86:x86-common
>
btrfs-progs
> btrfs-progs-update-uuid.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File btrfs-progs-update-uuid.patch of Package btrfs-progs
diff --git a/ctree.c b/ctree.c index f70e10c..d5f1e99 100644 --- a/ctree.c +++ b/ctree.c @@ -625,13 +625,13 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, btrfs_item_key_to_cpu(leaf, &cpukey, i + 1); btrfs_item_key(leaf, &leaf_key, i); if (comp_keys(&leaf_key, &cpukey) >= 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d offset bad key\n", i); BUG_ON(1); } if (btrfs_item_offset_nr(leaf, i) != btrfs_item_end_nr(leaf, i + 1)) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d offset bad\n", i); BUG_ON(1); } @@ -639,7 +639,7 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, if (btrfs_item_offset_nr(leaf, i) + btrfs_item_size_nr(leaf, i) != BTRFS_LEAF_DATA_SIZE(root)) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d first offset bad\n", i); BUG_ON(1); } @@ -647,7 +647,7 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, } if (nritems > 0) { if (btrfs_item_size_nr(leaf, nritems - 1) > 4096) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d bad size \n", nritems - 1); BUG_ON(1); } @@ -657,13 +657,13 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, btrfs_item_key(leaf, &leaf_key, slot); btrfs_item_key_to_cpu(leaf, &cpukey, slot - 1); if (btrfs_comp_keys(&leaf_key, &cpukey) <= 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d offset bad key\n", slot); BUG_ON(1); } if (btrfs_item_offset_nr(leaf, slot - 1) != btrfs_item_end_nr(leaf, slot)) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d offset bad\n", slot); BUG_ON(1); } @@ -674,7 +674,7 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, BUG_ON(btrfs_comp_keys(&leaf_key, &cpukey) >= 0); if (btrfs_item_offset_nr(leaf, slot) != btrfs_item_end_nr(leaf, slot + 1)) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d offset bad\n", slot); BUG_ON(1); } @@ -2356,7 +2356,7 @@ split: ret = 0; if (btrfs_leaf_free_space(root, leaf) < 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); BUG(); } kfree(buf); @@ -2456,7 +2456,7 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans, ret = 0; if (btrfs_leaf_free_space(root, leaf) < 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); BUG(); } return ret; @@ -2484,7 +2484,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, data_end = leaf_data_end(root, leaf); if (btrfs_leaf_free_space(root, leaf) < data_size) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); BUG(); } slot = path->slots[0]; @@ -2492,7 +2492,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, BUG_ON(slot < 0); if (slot >= nritems) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d too large, nritems %d\n", slot, nritems); BUG_ON(1); } @@ -2521,7 +2521,7 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans, ret = 0; if (btrfs_leaf_free_space(root, leaf) < 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); BUG(); } return ret; @@ -2572,7 +2572,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, data_end = leaf_data_end(root, leaf); if (btrfs_leaf_free_space(root, leaf) < total_size) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("not enough freespace need %u have %d\n", total_size, btrfs_leaf_free_space(root, leaf)); BUG(); @@ -2586,7 +2586,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, unsigned int old_data = btrfs_item_end_nr(leaf, slot); if (old_data < data_end) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); printk("slot %d old_data %d data_end %d\n", slot, old_data, data_end); BUG_ON(1); @@ -2634,7 +2634,7 @@ int btrfs_insert_empty_items(struct btrfs_trans_handle *trans, } if (btrfs_leaf_free_space(root, leaf) < 0) { - btrfs_print_leaf(root, leaf); + btrfs_print_leaf(root, leaf, 0); BUG(); } diff --git a/debug-tree.c b/debug-tree.c index 0525354..cf18e94 100644 --- a/debug-tree.c +++ b/debug-tree.c @@ -103,6 +103,8 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) } } +extern u8 new_fsid[BTRFS_FSID_SIZE]; + int main(int ac, char **av) { struct btrfs_root *root; @@ -119,12 +121,13 @@ int main(int ac, char **av) int device_only = 0; u64 block_only = 0; struct btrfs_root *tree_root_scan; + int update_uuid = 0; radix_tree_init(); while(1) { int c; - c = getopt(ac, av, "deb:"); + c = getopt(ac, av, "deub:"); if (c < 0) break; switch(c) { @@ -137,6 +140,9 @@ int main(int ac, char **av) case 'b': block_only = atoll(optarg); break; + case 'u': + update_uuid = 1; + break; default: print_usage(); } @@ -145,7 +151,10 @@ int main(int ac, char **av) if (ac != 1) print_usage(); - root = open_ctree(av[optind], 0, 0); + if (update_uuid) + uuid_generate(new_fsid); + + root = open_ctree(av[optind], 0, update_uuid); if (!root) { fprintf(stderr, "unable to open %s\n", av[optind]); exit(1); @@ -169,18 +178,18 @@ int main(int ac, char **av) fprintf(stderr, "failed to read %llu\n", block_only); return 0; } - btrfs_print_tree(root, leaf, 0); + btrfs_print_tree(root, leaf, 0, update_uuid); return 0; } if (!extent_only) { printf("root tree\n"); btrfs_print_tree(root->fs_info->tree_root, - root->fs_info->tree_root->node, 1); + root->fs_info->tree_root->node, 1, update_uuid); printf("chunk tree\n"); btrfs_print_tree(root->fs_info->chunk_root, - root->fs_info->chunk_root->node, 1); + root->fs_info->chunk_root->node, 1, update_uuid); } tree_root_scan = root->fs_info->tree_root; @@ -292,7 +301,7 @@ again: printf(" tree "); btrfs_print_key(&disk_key); printf(" \n"); - btrfs_print_tree(tree_root_scan, buf, 1); + btrfs_print_tree(tree_root_scan, buf, 1, update_uuid); } } path.slots[0]++; @@ -316,5 +325,13 @@ again: uuid_unparse(root->fs_info->super_copy.fsid, uuidbuf); printf("uuid %s\n", uuidbuf); printf("%s\n", BTRFS_BUILD_VERSION); + + if (update_uuid) { + memcpy(root->fs_info->super_copy.fsid, new_fsid, BTRFS_UUID_SIZE); + memcpy(root->fs_info->fsid, new_fsid, BTRFS_UUID_SIZE); + uuid_unparse(root->fs_info->super_copy.fsid, uuidbuf); + printf("update uuid to %s\n", uuidbuf); + write_all_supers(root); + } return 0; } diff --git a/disk-io.c b/disk-io.c index a6e1000..bbc2dba 100644 --- a/disk-io.c +++ b/disk-io.c @@ -37,7 +37,6 @@ static int check_tree_block(struct btrfs_root *root, struct extent_buffer *buf) { - struct btrfs_fs_devices *fs_devices; int ret = 1; @@ -884,6 +883,8 @@ int write_all_supers(struct btrfs_root *root) btrfs_set_stack_device_io_width(dev_item, dev->io_width); btrfs_set_stack_device_sector_size(dev_item, dev->sector_size); memcpy(dev_item->uuid, dev->uuid, BTRFS_UUID_SIZE); + //update uuid from super block + memcpy(dev->fs_devices->fsid, sb->fsid, BTRFS_UUID_SIZE); memcpy(dev_item->fsid, dev->fs_devices->fsid, BTRFS_UUID_SIZE); flags = btrfs_super_flags(sb); diff --git a/disk-io.h b/disk-io.h index 49e5692..db6919d 100644 --- a/disk-io.h +++ b/disk-io.h @@ -75,4 +75,5 @@ int csum_tree_block_size(struct extent_buffer *buf, u16 csum_sectorsize, int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, int verify); int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid); +int write_all_supers(struct btrfs_root *root); #endif diff --git a/extent-tree.c b/extent-tree.c index b2f9bb2..d250804 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -1447,7 +1447,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, if (ret < 0) goto out; if (ret != 0) { - btrfs_print_leaf(root, path->nodes[0]); + btrfs_print_leaf(root, path->nodes[0], 0); printk("failed to find block number %Lu\n", bytenr); BUG(); } @@ -1505,7 +1505,7 @@ int btrfs_set_block_flags(struct btrfs_trans_handle *trans, if (ret < 0) goto out; if (ret != 0) { - btrfs_print_leaf(root, path->nodes[0]); + btrfs_print_leaf(root, path->nodes[0], 0); printk("failed to find block number %Lu\n", (unsigned long long)bytenr); BUG(); @@ -2126,13 +2126,13 @@ static int __free_extent(struct btrfs_trans_handle *trans, printk(KERN_ERR "umm, got %d back from search" ", was looking for %llu\n", ret, (unsigned long long)bytenr); - btrfs_print_leaf(extent_root, path->nodes[0]); + btrfs_print_leaf(extent_root, path->nodes[0], 0); } BUG_ON(ret); extent_slot = path->slots[0]; } } else { - btrfs_print_leaf(extent_root, path->nodes[0]); + btrfs_print_leaf(extent_root, path->nodes[0], 0); WARN_ON(1); printk(KERN_ERR "btrfs unable to find ref byte nr %llu " "parent %llu root %llu owner %llu offset %llu\n", @@ -2165,7 +2165,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, printk(KERN_ERR "umm, got %d back from search" ", was looking for %llu\n", ret, (unsigned long long)bytenr); - btrfs_print_leaf(extent_root, path->nodes[0]); + btrfs_print_leaf(extent_root, path->nodes[0], 0); } BUG_ON(ret); extent_slot = path->slots[0]; diff --git a/print-tree.c b/print-tree.c index ac575d5..e2a6630 100644 --- a/print-tree.c +++ b/print-tree.c @@ -25,6 +25,7 @@ #include "disk-io.h" #include "print-tree.h" +u8 new_fsid[BTRFS_FSID_SIZE]; static int print_dir_item(struct extent_buffer *eb, struct btrfs_item *item, struct btrfs_dir_item *di) { @@ -94,21 +95,36 @@ static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); } } -static void print_dev_item(struct extent_buffer *eb, - struct btrfs_dev_item *dev_item) +static void print_dev_item(struct btrfs_root *root, struct extent_buffer *eb, + struct btrfs_dev_item *dev_item, int update_uuid) { + unsigned long ptr; + char fs_uuid[37]; + int ret; printf("\t\tdev item devid %llu " "total_bytes %llu bytes used %Lu\n", (unsigned long long)btrfs_device_id(eb, dev_item), (unsigned long long)btrfs_device_total_bytes(eb, dev_item), (unsigned long long)btrfs_device_bytes_used(eb, dev_item)); + if (update_uuid) { + uuid_unparse(new_fsid, fs_uuid); + printf("update fs uuid to %s\n", fs_uuid); + ptr = (unsigned long)btrfs_device_fsid(dev_item); + write_extent_buffer(eb, new_fsid, ptr, + BTRFS_FSID_SIZE); + csum_tree_block(root, eb, 0); + ret = write_extent_to_disk(eb); + if (ret < 0) + fprintf(stderr,"write extent error %d\n",ret); + } } -static void print_uuids(struct extent_buffer *eb) +static void print_uuids(struct btrfs_root *root, struct extent_buffer *eb, int update_uuid) { char fs_uuid[37]; char chunk_uuid[37]; u8 disk_uuid[BTRFS_UUID_SIZE]; + int ret; read_extent_buffer(eb, disk_uuid, (unsigned long)btrfs_header_fsid(eb), BTRFS_FSID_SIZE); @@ -123,6 +139,17 @@ static void print_uuids(struct extent_buffer *eb) chunk_uuid[36] = '\0'; uuid_unparse(disk_uuid, chunk_uuid); printf("fs uuid %s\nchunk uuid %s\n", fs_uuid, chunk_uuid); + + if (update_uuid) { + uuid_unparse(new_fsid, fs_uuid); + printf("update fs uuid to %s\n", fs_uuid); + write_extent_buffer(eb, new_fsid, (unsigned long)btrfs_header_fsid(eb), + BTRFS_FSID_SIZE); + csum_tree_block(root, eb, 0); + ret = write_extent_to_disk(eb); + if (ret < 0) + fprintf(stderr,"write extent error %d\n",ret); + } } static void print_file_extent_item(struct extent_buffer *eb, @@ -435,7 +462,7 @@ void btrfs_print_key(struct btrfs_disk_key *disk_key) printf(" %llu)", (unsigned long long)btrfs_disk_key_offset(disk_key)); } -void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) +void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l, int update) { int i; char *str; @@ -462,7 +489,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) btrfs_leaf_free_space(root, l), (unsigned long long)btrfs_header_generation(l), (unsigned long long)btrfs_header_owner(l)); - print_uuids(l); + print_uuids(root, l, update); fflush(stdout); for (i = 0 ; i < nr ; i++) { item = btrfs_item_nr(l, i); @@ -582,8 +609,8 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) print_chunk(l, btrfs_item_ptr(l, i, struct btrfs_chunk)); break; case BTRFS_DEV_ITEM_KEY: - print_dev_item(l, btrfs_item_ptr(l, i, - struct btrfs_dev_item)); + print_dev_item(root, l, btrfs_item_ptr(l, i, + struct btrfs_dev_item), update); break; case BTRFS_DEV_EXTENT_KEY: dev_extent = btrfs_item_ptr(l, i, @@ -610,7 +637,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) } } -void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int follow) +void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int follow, int update) { int i; u32 nr; @@ -622,7 +649,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol return; nr = btrfs_header_nritems(eb); if (btrfs_is_leaf(eb)) { - btrfs_print_leaf(root, eb); + btrfs_print_leaf(root, eb, update); return; } printf("node %llu level %d items %d free %u generation %llu owner %llu\n", @@ -631,7 +658,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr, (unsigned long long)btrfs_header_generation(eb), (unsigned long long)btrfs_header_owner(eb)); - print_uuids(eb); + print_uuids(root, eb, update); fflush(stdout); size = btrfs_level_size(root, btrfs_header_level(eb) - 1); for (i = 0; i < nr; i++) { @@ -666,7 +693,7 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol if (btrfs_header_level(next) != btrfs_header_level(eb) - 1) BUG(); - btrfs_print_tree(root, next, 1); + btrfs_print_tree(root, next, 1, update); free_extent_buffer(next); } } diff --git a/print-tree.h b/print-tree.h index 495b81a..0fbe6a1 100644 --- a/print-tree.h +++ b/print-tree.h @@ -18,7 +18,7 @@ #ifndef __PRINT_TREE_ #define __PRINT_TREE_ -void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l); -void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *t, int follow); +void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l, int update_uuid); +void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *t, int follow, int update_uuid); void btrfs_print_key(struct btrfs_disk_key *disk_key); #endif diff --git a/root-tree.c b/root-tree.c index 782472c..9c77307 100644 --- a/root-tree.c +++ b/root-tree.c @@ -182,7 +182,7 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, if (ret < 0) goto out; if (ret) { -btrfs_print_leaf(root, path->nodes[0]); +btrfs_print_leaf(root, path->nodes[0], 0); printk("failed to del %llu %u %llu\n", (unsigned long long)key->objectid, key->type,