aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-05-06 10:51:29 -0400
committerAlex Elder <elder@inktank.com>2013-05-08 18:00:00 -0400
commitf35a4dee14c31dc00807f3bcd59cc7a6959f63d7 (patch)
treef0919e92b27e9e9c556afa66e2ca69cdd601226c
parent51344a38ba2033be18a4ec23e318845caeccdc04 (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.c27
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 */
102struct rbd_image_header { 102struct 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
4679err_out_mapping:
4680 rbd_dev_mapping_clear(rbd_dev);
4680err_out_disk: 4681err_out_disk:
4681 rbd_free_disk(rbd_dev); 4682 rbd_free_disk(rbd_dev);
4682err_out_blkdev: 4683err_out_blkdev: