rbd: ask for a weaker incompat mask for read-only mappings
authorIlya Dryomov <idryomov@gmail.com>
Tue, 5 Nov 2019 14:38:46 +0000 (15:38 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 25 Nov 2019 10:44:03 +0000 (11:44 +0100)
For a read-only mapping, ask for a set of features that make the image
only unwritable rather than both unreadable and unwritable by a client
that doesn't understand them.  As of today, the difference between them
for krbd is journaling (JOURNALING) and live migration (MIGRATING).

get_features method supports read_only parameter since hammer, ceph.git
commit 6176ec5fde2a ("librbd: differentiate between R/O vs R/W RBD
features").

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Jason Dillaman <dillaman@redhat.com>
Reviewed-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
drivers/block/rbd.c

index 3d8342b..3a40b5f 100644 (file)
@@ -5669,9 +5669,12 @@ out:
 }
 
 static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
-               u64 *snap_features)
+                                    bool read_only, u64 *snap_features)
 {
-       __le64 snapid = cpu_to_le64(snap_id);
+       struct {
+               __le64 snap_id;
+               u8 read_only;
+       } features_in;
        struct {
                __le64 features;
                __le64 incompat;
@@ -5679,9 +5682,12 @@ static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
        u64 unsup;
        int ret;
 
+       features_in.snap_id = cpu_to_le64(snap_id);
+       features_in.read_only = read_only;
+
        ret = rbd_obj_method_sync(rbd_dev, &rbd_dev->header_oid,
                                  &rbd_dev->header_oloc, "get_features",
-                                 &snapid, sizeof(snapid),
+                                 &features_in, sizeof(features_in),
                                  &features_buf, sizeof(features_buf));
        dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
        if (ret < 0)
@@ -5709,7 +5715,8 @@ static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
 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);
+                                        rbd_is_ro(rbd_dev),
+                                        &rbd_dev->header.features);
 }
 
 /*