diff options
author | Alex Elder <elder@inktank.com> | 2012-07-03 17:01:19 -0400 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2012-10-01 15:30:53 -0400 |
commit | 1e1301998ee80d9a8cc09297906293f16f8a6064 (patch) | |
tree | ef5bea9e51f57a0e833a78e2531368e56d1610a4 /drivers/block | |
parent | 9d475de5d12af8ac4c2101807e0a889ac7389c5a (diff) |
rbd: get the object prefix for a v2 rbd image
The object prefix of an rbd format 2 image is fetched from the
server using a "get_object_prefix" method.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/rbd.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 061c62496fea..64a4dd5f6f2b 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -66,7 +66,8 @@ | |||
66 | 66 | ||
67 | #define RBD_SNAP_HEAD_NAME "-" | 67 | #define RBD_SNAP_HEAD_NAME "-" |
68 | 68 | ||
69 | #define RBD_IMAGE_ID_LEN_MAX 64 | 69 | #define RBD_IMAGE_ID_LEN_MAX 64 |
70 | #define RBD_OBJ_PREFIX_LEN_MAX 64 | ||
70 | 71 | ||
71 | /* | 72 | /* |
72 | * An RBD device name will be "rbd#", where the "rbd" comes from | 73 | * An RBD device name will be "rbd#", where the "rbd" comes from |
@@ -2168,6 +2169,43 @@ static int rbd_dev_v2_image_size(struct rbd_device *rbd_dev) | |||
2168 | &rbd_dev->header.image_size); | 2169 | &rbd_dev->header.image_size); |
2169 | } | 2170 | } |
2170 | 2171 | ||
2172 | static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) | ||
2173 | { | ||
2174 | void *reply_buf; | ||
2175 | int ret; | ||
2176 | void *p; | ||
2177 | |||
2178 | reply_buf = kzalloc(RBD_OBJ_PREFIX_LEN_MAX, GFP_KERNEL); | ||
2179 | if (!reply_buf) | ||
2180 | return -ENOMEM; | ||
2181 | |||
2182 | ret = rbd_req_sync_exec(rbd_dev, rbd_dev->header_name, | ||
2183 | "rbd", "get_object_prefix", | ||
2184 | NULL, 0, | ||
2185 | reply_buf, RBD_OBJ_PREFIX_LEN_MAX, | ||
2186 | CEPH_OSD_FLAG_READ, NULL); | ||
2187 | dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret); | ||
2188 | if (ret < 0) | ||
2189 | goto out; | ||
2190 | |||
2191 | p = reply_buf; | ||
2192 | rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, | ||
2193 | p + RBD_OBJ_PREFIX_LEN_MAX, | ||
2194 | NULL, GFP_NOIO); | ||
2195 | |||
2196 | if (IS_ERR(rbd_dev->header.object_prefix)) { | ||
2197 | ret = PTR_ERR(rbd_dev->header.object_prefix); | ||
2198 | rbd_dev->header.object_prefix = NULL; | ||
2199 | } else { | ||
2200 | dout(" object_prefix = %s\n", rbd_dev->header.object_prefix); | ||
2201 | } | ||
2202 | |||
2203 | out: | ||
2204 | kfree(reply_buf); | ||
2205 | |||
2206 | return ret; | ||
2207 | } | ||
2208 | |||
2171 | /* | 2209 | /* |
2172 | * Scan the rbd device's current snapshot list and compare it to the | 2210 | * Scan the rbd device's current snapshot list and compare it to the |
2173 | * newly-received snapshot context. Remove any existing snapshots | 2211 | * newly-received snapshot context. Remove any existing snapshots |
@@ -2695,6 +2733,12 @@ static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) | |||
2695 | ret = rbd_dev_v2_image_size(rbd_dev); | 2733 | ret = rbd_dev_v2_image_size(rbd_dev); |
2696 | if (ret < 0) | 2734 | if (ret < 0) |
2697 | goto out_err; | 2735 | goto out_err; |
2736 | |||
2737 | /* Get the object prefix (a.k.a. block_name) for the image */ | ||
2738 | |||
2739 | ret = rbd_dev_v2_object_prefix(rbd_dev); | ||
2740 | if (ret < 0) | ||
2741 | goto out_err; | ||
2698 | rbd_dev->image_format = 2; | 2742 | rbd_dev->image_format = 2; |
2699 | 2743 | ||
2700 | dout("discovered version 2 image, header name is %s\n", | 2744 | dout("discovered version 2 image, header name is %s\n", |
@@ -2704,6 +2748,8 @@ static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) | |||
2704 | out_err: | 2748 | out_err: |
2705 | kfree(rbd_dev->header_name); | 2749 | kfree(rbd_dev->header_name); |
2706 | rbd_dev->header_name = NULL; | 2750 | rbd_dev->header_name = NULL; |
2751 | kfree(rbd_dev->header.object_prefix); | ||
2752 | rbd_dev->header.object_prefix = NULL; | ||
2707 | 2753 | ||
2708 | return ret; | 2754 | return ret; |
2709 | } | 2755 | } |