diff options
author | Yan Zheng <zheng.yan@oracle.com> | 2008-11-18 10:40:06 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-11-18 10:40:06 -0500 |
commit | 4d1d3a59d6debe80ce1e2da60e82233ab8f1f886 (patch) | |
tree | 896a25411082e009b2699ef63a7dc9ae5d286bc3 /disk-io.c | |
parent | 95470dfaf12dc8aa59bcb6829c4a7f759d2c5ff6 (diff) |
update btrfs-progs for seed device support
This patch does the following:
1) Update device management code to match the kernel code.
2) Allocator fixes.
3) Add a program called btrfstune to set/clear the SEEDING
super block flags.
Diffstat (limited to 'disk-io.c')
-rw-r--r-- | disk-io.c | 29 |
1 files changed, 23 insertions, 6 deletions
@@ -37,14 +37,24 @@ static int check_tree_block(struct btrfs_root *root, struct extent_buffer *buf) { + + struct btrfs_fs_devices *fs_devices; + int ret = 1; + if (buf->start != btrfs_header_bytenr(buf)) - return 1; + return ret; - if (memcmp_extent_buffer(buf, root->fs_info->fsid, - (unsigned long)btrfs_header_fsid(buf), - BTRFS_FSID_SIZE)) - return 1; - return 0; + fs_devices = root->fs_info->fs_devices; + while (fs_devices) { + if (!memcmp_extent_buffer(buf, fs_devices->fsid, + (unsigned long)btrfs_header_fsid(buf), + BTRFS_FSID_SIZE)) { + ret = 0; + break; + } + fs_devices = fs_devices->seed; + } + return ret; } u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len) @@ -685,6 +695,10 @@ int write_all_supers(struct btrfs_root *root) dev_item); list_for_each(cur, head) { dev = list_entry(cur, struct btrfs_device, dev_list); + if (!dev->writeable) + continue; + + btrfs_set_device_generation(sb, dev_item, 0); btrfs_set_device_type(sb, dev_item, dev->type); btrfs_set_device_id(sb, dev_item, dev->devid); btrfs_set_device_total_bytes(sb, dev_item, dev->total_bytes); @@ -695,6 +709,9 @@ int write_all_supers(struct btrfs_root *root) write_extent_buffer(sb, dev->uuid, (unsigned long)btrfs_device_uuid(dev_item), BTRFS_UUID_SIZE); + write_extent_buffer(sb, dev->fs_devices->fsid, + (unsigned long)btrfs_device_fsid(dev_item), + BTRFS_UUID_SIZE); sb->fd = dev->fd; sb->dev_bytenr = sb->start; btrfs_set_header_flag(sb, BTRFS_HEADER_FLAG_WRITTEN); |