summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder2012-07-03 23:01:19 +0200
committerAlex Elder2012-10-01 21:30:53 +0200
commitb1b5402aa9c4a9aeb8431886e41b0a1d127318d1 (patch)
treeb1a64ee08e120c156d563ea4eda617463d980b76 /drivers/block/rbd.c
parentrbd: get the object prefix for a v2 rbd image (diff)
downloadkernel-qcow2-linux-b1b5402aa9c4a9aeb8431886e41b0a1d127318d1.tar.gz
kernel-qcow2-linux-b1b5402aa9c4a9aeb8431886e41b0a1d127318d1.tar.xz
kernel-qcow2-linux-b1b5402aa9c4a9aeb8431886e41b0a1d127318d1.zip
rbd: get image features for a v2 image
The features values for an rbd format 2 image are fetched from the server using a "get_features" method. The same method is used for getting the features for a snapshot, so structure this addition with a generic helper routine that can get this information for either. The server will provide two 64-bit feature masks, one representing the features potentially in use for this image (or its snapshot), and one representing features that must be supported by the client in order to work with the image. For the time being, neither of these is really used so we keep things simple and just record the first feature vector. Once we start using these feature masks, what we record and what we expose to the user will most likely change. Signed-off-by: Alex Elder <elder@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 64a4dd5f6f2b..b8b8271bd9e2 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2206,6 +2206,40 @@ out:
return ret;
}
+static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
+ u64 *snap_features)
+{
+ __le64 snapid = cpu_to_le64(snap_id);
+ struct {
+ __le64 features;
+ __le64 incompat;
+ } features_buf = { 0 };
+ int ret;
+
+ ret = rbd_req_sync_exec(rbd_dev, rbd_dev->header_name,
+ "rbd", "get_features",
+ (char *) &snapid, sizeof (snapid),
+ (char *) &features_buf, sizeof (features_buf),
+ CEPH_OSD_FLAG_READ, NULL);
+ dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret);
+ if (ret < 0)
+ return ret;
+ *snap_features = le64_to_cpu(features_buf.features);
+
+ dout(" snap_id 0x%016llx features = 0x%016llx incompat = 0x%016llx\n",
+ (unsigned long long) snap_id,
+ (unsigned long long) *snap_features,
+ (unsigned long long) le64_to_cpu(features_buf.incompat));
+
+ return 0;
+}
+
+static int rbd_dev_v2_features(struct rbd_device *rbd_dev)
+{
+ return _rbd_dev_v2_snap_features(rbd_dev, CEPH_NOSNAP,
+ &rbd_dev->header.features);
+}
+
/*
* Scan the rbd device's current snapshot list and compare it to the
* newly-received snapshot context. Remove any existing snapshots
@@ -2739,6 +2773,12 @@ static int rbd_dev_v2_probe(struct rbd_device *rbd_dev)
ret = rbd_dev_v2_object_prefix(rbd_dev);
if (ret < 0)
goto out_err;
+
+ /* Get the features for the image */
+
+ ret = rbd_dev_v2_features(rbd_dev);
+ if (ret < 0)
+ goto out_err;
rbd_dev->image_format = 2;
dout("discovered version 2 image, header name is %s\n",