diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2017-01-25 12:16:22 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2017-02-20 06:16:14 -0500 |
commit | 263423f8adf4acbdc4fd26ed5b35f4a6408bc0ab (patch) | |
tree | e4fd15b54785a9134977259346cd01e67bc988c9 | |
parent | 5bc3fb177548503735bcc35fe98475d883740ecb (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.c | 25 |
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 | ||
981 | static 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 | |||
5852 | out_err: | 5864 | out_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 | ||