void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; char chunk_flags_str[32] = {0}; bg_flags_to_str(btrfs_chunk_type(eb, chunk), chunk_flags_str); printf("\t\tlength %llu owner %llu stripe_len %llu type %s\n", (unsigned long long)btrfs_chunk_length(eb, chunk), (unsigned long long)btrfs_chunk_owner(eb, chunk), (unsigned long long)btrfs_chunk_stripe_len(eb, chunk), chunk_flags_str); printf("\t\tio_align %u io_width %u sector_size %u\n", btrfs_chunk_io_align(eb, chunk), btrfs_chunk_io_width(eb, chunk), btrfs_chunk_sector_size(eb, chunk)); printf("\t\tnum_stripes %hu sub_stripes %hu\n", num_stripes, btrfs_chunk_sub_stripes(eb, chunk)); for (i = 0 ; i < num_stripes ; i++) { unsigned char dev_uuid[BTRFS_UUID_SIZE]; char str_dev_uuid[BTRFS_UUID_UNPARSED_SIZE]; read_extent_buffer(eb, dev_uuid, (unsigned long)btrfs_stripe_dev_uuid_nr(chunk, i), BTRFS_UUID_SIZE); uuid_unparse(dev_uuid, str_dev_uuid); printf("\t\t\tstripe %d devid %llu offset %llu\n", i, (unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i), (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); printf("\t\t\tdev_uuid %s\n", str_dev_uuid); } }
static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; pr_info("\t\tchunk length %llu owner %llu type %llu num_stripes %d\n", btrfs_chunk_length(eb, chunk), btrfs_chunk_owner(eb, chunk), btrfs_chunk_type(eb, chunk), num_stripes); for (i = 0 ; i < num_stripes ; i++) { pr_info("\t\t\tstripe %d devid %llu offset %llu\n", i, btrfs_stripe_devid_nr(eb, chunk, i), btrfs_stripe_offset_nr(eb, chunk, i)); } }
static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu " "num_stripes %d\n", (unsigned long long)btrfs_chunk_length(eb, chunk), (unsigned long long)btrfs_chunk_owner(eb, chunk), (unsigned long long)btrfs_chunk_type(eb, chunk), num_stripes); for (i = 0 ; i < num_stripes ; i++) { printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu\n", i, (unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i), (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); } }
void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; char chunk_flags_str[32] = {0}; bg_flags_to_str(btrfs_chunk_type(eb, chunk), chunk_flags_str); printf("\t\tchunk length %llu owner %llu type %s num_stripes %d\n", (unsigned long long)btrfs_chunk_length(eb, chunk), (unsigned long long)btrfs_chunk_owner(eb, chunk), chunk_flags_str, num_stripes); for (i = 0 ; i < num_stripes ; i++) { printf("\t\t\tstripe %d devid %llu offset %llu\n", i, (unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i), (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); } }
static void print_sys_chunk_array(struct btrfs_super_block *sb) { struct extent_buffer *buf; struct btrfs_disk_key *disk_key; struct btrfs_chunk *chunk; u8 *array_ptr; unsigned long sb_array_offset; u32 num_stripes; u32 array_size; u32 len = 0; u32 cur_offset; struct btrfs_key key; int item; buf = malloc(sizeof(*buf) + sizeof(*sb)); if (!buf) { fprintf(stderr, "%s\n", strerror(ENOMEM)); exit(1); } write_extent_buffer(buf, sb, 0, sizeof(*sb)); array_size = btrfs_super_sys_array_size(sb); array_ptr = sb->sys_chunk_array; sb_array_offset = offsetof(struct btrfs_super_block, sys_chunk_array); cur_offset = 0; item = 0; while (cur_offset < array_size) { disk_key = (struct btrfs_disk_key *)array_ptr; len = sizeof(*disk_key); if (cur_offset + len > array_size) goto out_short_read; btrfs_disk_key_to_cpu(&key, disk_key); array_ptr += len; sb_array_offset += len; cur_offset += len; printf("\titem %d ", item); btrfs_print_key(disk_key); putchar('\n'); if (key.type == BTRFS_CHUNK_ITEM_KEY) { chunk = (struct btrfs_chunk *)sb_array_offset; /* * At least one btrfs_chunk with one stripe must be * present, exact stripe count check comes afterwards */ len = btrfs_chunk_item_size(1); if (cur_offset + len > array_size) goto out_short_read; print_chunk(buf, chunk); num_stripes = btrfs_chunk_num_stripes(buf, chunk); if (!num_stripes) { printk( "ERROR: invalid number of stripes %u in sys_array at offset %u\n", num_stripes, cur_offset); break; } len = btrfs_chunk_item_size(num_stripes); if (cur_offset + len > array_size) goto out_short_read; } else { printk( "ERROR: unexpected item type %u in sys_array at offset %u\n", (u32)key.type, cur_offset); break; } array_ptr += len; sb_array_offset += len; cur_offset += len; item++; } free(buf); return; out_short_read: printk("ERROR: sys_array too short to read %u bytes at offset %u\n", len, cur_offset); free(buf); }
static void print_sys_chunk_array(struct btrfs_super_block *sb) { struct extent_buffer *buf; struct btrfs_disk_key *disk_key; struct btrfs_chunk *chunk; u8 *array_ptr; unsigned long sb_array_offset; u32 num_stripes; u32 array_size; u32 len = 0; u32 cur_offset; struct btrfs_key key; int item; buf = malloc(sizeof(*buf) + sizeof(*sb)); if (!buf) { error("not enough memory"); return; } write_extent_buffer(buf, sb, 0, sizeof(*sb)); buf->len = sizeof(*sb); array_size = btrfs_super_sys_array_size(sb); array_ptr = sb->sys_chunk_array; sb_array_offset = offsetof(struct btrfs_super_block, sys_chunk_array); if (array_size > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) { error("sys_array_size %u shouldn't exceed %u bytes", array_size, BTRFS_SYSTEM_CHUNK_ARRAY_SIZE); goto out; } cur_offset = 0; item = 0; while (cur_offset < array_size) { disk_key = (struct btrfs_disk_key *)array_ptr; len = sizeof(*disk_key); if (cur_offset + len > array_size) goto out_short_read; btrfs_disk_key_to_cpu(&key, disk_key); array_ptr += len; sb_array_offset += len; cur_offset += len; printf("\titem %d ", item); btrfs_print_key(disk_key); putchar('\n'); if (key.type == BTRFS_CHUNK_ITEM_KEY) { chunk = (struct btrfs_chunk *)sb_array_offset; /* * At least one btrfs_chunk with one stripe must be * present, exact stripe count check comes afterwards */ len = btrfs_chunk_item_size(1); if (cur_offset + len > array_size) goto out_short_read; num_stripes = btrfs_chunk_num_stripes(buf, chunk); if (!num_stripes) { error( "invalid number of stripes %u in sys_array at offset %u", num_stripes, cur_offset); break; } len = btrfs_chunk_item_size(num_stripes); if (cur_offset + len > array_size) goto out_short_read; print_chunk_item(buf, chunk); } else { error("unexpected item type %u in sys_array at offset %u", (u32)key.type, cur_offset); break; } array_ptr += len; sb_array_offset += len; cur_offset += len; item++; } out: free(buf); return; out_short_read: error("sys_array too short to read %u bytes at offset %u", len, cur_offset); free(buf); }