diff options
| -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 | } |
