aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2017-01-25 12:16:22 -0500
committerIlya Dryomov <idryomov@gmail.com>2017-02-20 06:16:14 -0500
commit263423f8adf4acbdc4fd26ed5b35f4a6408bc0ab (patch)
treee4fd15b54785a9134977259346cd01e67bc988c9
parent5bc3fb177548503735bcc35fe98475d883740ecb (diff)
rbd: introduce rbd_init_layout()
Rather than initializing layout fields with some made up values in __rbd_dev_create(), move the initialization into rbd_init_layout() and call it after the header is actually populated. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Jason Dillaman <dillaman@redhat.com>
-rw-r--r--drivers/block/rbd.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 55e30db0576d..e7131c758118 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -978,6 +978,21 @@ static u32 rbd_obj_bytes(struct rbd_image_header *header)
978 return 1U << header->obj_order; 978 return 1U << header->obj_order;
979} 979}
980 980
981static void rbd_init_layout(struct rbd_device *rbd_dev)
982{
983 if (rbd_dev->header.stripe_unit == 0 ||
984 rbd_dev->header.stripe_count == 0) {
985 rbd_dev->header.stripe_unit = rbd_obj_bytes(&rbd_dev->header);
986 rbd_dev->header.stripe_count = 1;
987 }
988
989 rbd_dev->layout.stripe_unit = rbd_dev->header.stripe_unit;
990 rbd_dev->layout.stripe_count = rbd_dev->header.stripe_count;
991 rbd_dev->layout.object_size = rbd_obj_bytes(&rbd_dev->header);
992 rbd_dev->layout.pool_id = rbd_dev->spec->pool_id;
993 RCU_INIT_POINTER(rbd_dev->layout.pool_ns, NULL);
994}
995
981/* 996/*
982 * Fill an rbd image header with information from the given format 1 997 * Fill an rbd image header with information from the given format 1
983 * on-disk header. 998 * on-disk header.
@@ -1053,6 +1068,7 @@ static int rbd_header_from_disk(struct rbd_device *rbd_dev,
1053 if (first_time) { 1068 if (first_time) {
1054 header->object_prefix = object_prefix; 1069 header->object_prefix = object_prefix;
1055 header->obj_order = ondisk->options.order; 1070 header->obj_order = ondisk->options.order;
1071 rbd_init_layout(rbd_dev);
1056 } else { 1072 } else {
1057 ceph_put_snap_context(header->snapc); 1073 ceph_put_snap_context(header->snapc);
1058 kfree(header->snap_names); 1074 kfree(header->snap_names);
@@ -4804,12 +4820,6 @@ static struct rbd_device *__rbd_dev_create(struct rbd_client *rbdc,
4804 rbd_dev->rbd_client = rbdc; 4820 rbd_dev->rbd_client = rbdc;
4805 rbd_dev->spec = spec; 4821 rbd_dev->spec = spec;
4806 4822
4807 rbd_dev->layout.stripe_unit = 1 << RBD_MAX_OBJ_ORDER;
4808 rbd_dev->layout.stripe_count = 1;
4809 rbd_dev->layout.object_size = 1 << RBD_MAX_OBJ_ORDER;
4810 rbd_dev->layout.pool_id = spec->pool_id;
4811 RCU_INIT_POINTER(rbd_dev->layout.pool_ns, NULL);
4812
4813 return rbd_dev; 4823 return rbd_dev;
4814} 4824}
4815 4825
@@ -5848,12 +5858,13 @@ static int rbd_dev_v2_header_onetime(struct rbd_device *rbd_dev)
5848 goto out_err; 5858 goto out_err;
5849 } 5859 }
5850 5860
5861 rbd_init_layout(rbd_dev);
5851 return 0; 5862 return 0;
5863
5852out_err: 5864out_err:
5853 rbd_dev->header.features = 0; 5865 rbd_dev->header.features = 0;
5854 kfree(rbd_dev->header.object_prefix); 5866 kfree(rbd_dev->header.object_prefix);
5855 rbd_dev->header.object_prefix = NULL; 5867 rbd_dev->header.object_prefix = NULL;
5856
5857 return ret; 5868 return ret;
5858} 5869}
5859 5870