aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-07-03 17:01:19 -0400
committerAlex Elder <elder@inktank.com>2012-10-01 15:30:53 -0400
commit1e1301998ee80d9a8cc09297906293f16f8a6064 (patch)
treeef5bea9e51f57a0e833a78e2531368e56d1610a4 /drivers/block
parent9d475de5d12af8ac4c2101807e0a889ac7389c5a (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.c48
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
2172static 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
2203out:
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)
2704out_err: 2748out_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}