summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-04-03 16:35:48 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2008-04-03 16:35:48 -0400
commita6de0bd778475504f42a142c83b8077993cbddfe (patch)
tree372c0634becbcd2c233e08d355e130c60de9cc58 /utils.c
parent6a87b4c00a08e377ee6265dee6c2548d2d0f67b0 (diff)
Add mirroring support across multiple drives
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c56
1 files changed, 33 insertions, 23 deletions
diff --git a/utils.c b/utils.c
index 323b108b..33610306 100644
--- a/utils.c
+++ b/utils.c
@@ -404,31 +404,40 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
{
struct btrfs_super_block *disk_super;
struct btrfs_super_block *super = &root->fs_info->super_copy;
- struct btrfs_device device;
+ struct btrfs_device *device;
struct btrfs_dev_item *dev_item;
char *buf;
u64 total_bytes;
u64 num_devs;
int ret;
- buf = malloc(sectorsize);
+ device = kmalloc(sizeof(*device), GFP_NOFS);
+ if (!device)
+ return -ENOMEM;
+ buf = kmalloc(sectorsize, GFP_NOFS);
+ if (!buf) {
+ kfree(device);
+ return -ENOMEM;
+ }
BUG_ON(sizeof(*disk_super) > sectorsize);
memset(buf, 0, sectorsize);
disk_super = (struct btrfs_super_block *)buf;
dev_item = &disk_super->dev_item;
- uuid_generate(device.uuid);
- device.devid = 0;
- device.type = 0;
- device.io_width = io_width;
- device.io_align = io_align;
- device.sector_size = sectorsize;
- device.fd = 0;
- device.total_bytes = block_count;
- device.bytes_used = 0;
-
- ret = btrfs_add_device(trans, root, &device);
+ uuid_generate(device->uuid);
+ device->devid = 0;
+ device->type = 0;
+ device->io_width = io_width;
+ device->io_align = io_align;
+ device->sector_size = sectorsize;
+ device->fd = 0;
+ device->total_bytes = block_count;
+ device->bytes_used = 0;
+ device->total_ios = 0;
+ device->dev_root = root->fs_info->dev_root;
+
+ ret = btrfs_add_device(trans, root, device);
BUG_ON(ret);
total_bytes = btrfs_super_total_bytes(super) + block_count;
@@ -439,20 +448,21 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
memcpy(disk_super, super, sizeof(*disk_super));
- printf("adding device id %llu\n", (unsigned long long)device.devid);
- btrfs_set_stack_device_id(dev_item, device.devid);
- btrfs_set_stack_device_type(dev_item, device.type);
- btrfs_set_stack_device_io_align(dev_item, device.io_align);
- btrfs_set_stack_device_io_width(dev_item, device.io_width);
- btrfs_set_stack_device_sector_size(dev_item, device.sector_size);
- btrfs_set_stack_device_total_bytes(dev_item, device.total_bytes);
- btrfs_set_stack_device_bytes_used(dev_item, device.bytes_used);
- memcpy(&dev_item->uuid, device.uuid, BTRFS_DEV_UUID_SIZE);
+ printf("adding device id %llu\n", (unsigned long long)device->devid);
+ btrfs_set_stack_device_id(dev_item, device->devid);
+ btrfs_set_stack_device_type(dev_item, device->type);
+ btrfs_set_stack_device_io_align(dev_item, device->io_align);
+ btrfs_set_stack_device_io_width(dev_item, device->io_width);
+ btrfs_set_stack_device_sector_size(dev_item, device->sector_size);
+ btrfs_set_stack_device_total_bytes(dev_item, device->total_bytes);
+ btrfs_set_stack_device_bytes_used(dev_item, device->bytes_used);
+ memcpy(&dev_item->uuid, device->uuid, BTRFS_DEV_UUID_SIZE);
ret = pwrite(fd, buf, sectorsize, BTRFS_SUPER_INFO_OFFSET);
BUG_ON(ret != sectorsize);
- free(buf);
+ kfree(buf);
+ list_add(&device->dev_list, &root->fs_info->fs_devices->devices);
return 0;
}