diff options
author | Alex Elder <elder@inktank.com> | 2013-05-06 10:51:29 -0400 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-05-08 18:00:00 -0400 |
commit | f35a4dee14c31dc00807f3bcd59cc7a6959f63d7 (patch) | |
tree | f0919e92b27e9e9c556afa66e2ca69cdd601226c | |
parent | 51344a38ba2033be18a4ec23e318845caeccdc04 (diff) |
rbd: set the mapping size and features later
Defer setting the size and features fields of a mapped image until
after the Linux disk structure is set up. Set the capacity of the
disk after that.
Rearrange the definition of rbd_image_header, separating the fields
that are set only once from those that can be updated.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | drivers/block/rbd.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index b5cac7931ffc..a05b6e5dc362 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -100,21 +100,20 @@ | |||
100 | * block device image metadata (in-memory version) | 100 | * block device image metadata (in-memory version) |
101 | */ | 101 | */ |
102 | struct rbd_image_header { | 102 | struct rbd_image_header { |
103 | /* These four fields never change for a given rbd image */ | 103 | /* These six fields never change for a given rbd image */ |
104 | char *object_prefix; | 104 | char *object_prefix; |
105 | u64 features; | ||
106 | __u8 obj_order; | 105 | __u8 obj_order; |
107 | __u8 crypt_type; | 106 | __u8 crypt_type; |
108 | __u8 comp_type; | 107 | __u8 comp_type; |
108 | u64 stripe_unit; | ||
109 | u64 stripe_count; | ||
110 | u64 features; /* Might be changeable someday? */ | ||
109 | 111 | ||
110 | /* The remaining fields need to be updated occasionally */ | 112 | /* The remaining fields need to be updated occasionally */ |
111 | u64 image_size; | 113 | u64 image_size; |
112 | struct ceph_snap_context *snapc; | 114 | struct ceph_snap_context *snapc; |
113 | char *snap_names; | 115 | char *snap_names; /* format 1 only */ |
114 | u64 *snap_sizes; | 116 | u64 *snap_sizes; /* format 1 only */ |
115 | |||
116 | u64 stripe_unit; | ||
117 | u64 stripe_count; | ||
118 | }; | 117 | }; |
119 | 118 | ||
120 | /* | 119 | /* |
@@ -4637,10 +4636,6 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
4637 | { | 4636 | { |
4638 | int ret; | 4637 | int ret; |
4639 | 4638 | ||
4640 | ret = rbd_dev_mapping_set(rbd_dev); | ||
4641 | if (ret) | ||
4642 | return ret; | ||
4643 | |||
4644 | /* generate unique id: find highest unique id, add one */ | 4639 | /* generate unique id: find highest unique id, add one */ |
4645 | rbd_dev_id_get(rbd_dev); | 4640 | rbd_dev_id_get(rbd_dev); |
4646 | 4641 | ||
@@ -4662,13 +4657,17 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
4662 | if (ret) | 4657 | if (ret) |
4663 | goto err_out_blkdev; | 4658 | goto err_out_blkdev; |
4664 | 4659 | ||
4665 | ret = rbd_bus_add_dev(rbd_dev); | 4660 | ret = rbd_dev_mapping_set(rbd_dev); |
4666 | if (ret) | 4661 | if (ret) |
4667 | goto err_out_disk; | 4662 | goto err_out_disk; |
4663 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); | ||
4664 | |||
4665 | ret = rbd_bus_add_dev(rbd_dev); | ||
4666 | if (ret) | ||
4667 | goto err_out_mapping; | ||
4668 | 4668 | ||
4669 | /* Everything's ready. Announce the disk to the world. */ | 4669 | /* Everything's ready. Announce the disk to the world. */ |
4670 | 4670 | ||
4671 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); | ||
4672 | set_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); | 4671 | set_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); |
4673 | add_disk(rbd_dev->disk); | 4672 | add_disk(rbd_dev->disk); |
4674 | 4673 | ||
@@ -4677,6 +4676,8 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
4677 | 4676 | ||
4678 | return ret; | 4677 | return ret; |
4679 | 4678 | ||
4679 | err_out_mapping: | ||
4680 | rbd_dev_mapping_clear(rbd_dev); | ||
4680 | err_out_disk: | 4681 | err_out_disk: |
4681 | rbd_free_disk(rbd_dev); | 4682 | rbd_free_disk(rbd_dev); |
4682 | err_out_blkdev: | 4683 | err_out_blkdev: |