rbd: don't establish watch for read-only mappings
authorIlya Dryomov <idryomov@gmail.com>
Tue, 12 Nov 2019 19:20:04 +0000 (20:20 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 25 Nov 2019 10:44:03 +0000 (11:44 +0100)
With exclusive lock out of the way, watch is the only thing left that
prevents a read-only mapping from being used with read-only OSD caps.

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 c5a5613..2a22bc2 100644 (file)
@@ -6961,6 +6961,24 @@ static int rbd_dev_header_name(struct rbd_device *rbd_dev)
        return ret;
 }
 
+static void rbd_print_dne(struct rbd_device *rbd_dev, bool is_snap)
+{
+       if (!is_snap) {
+               pr_info("image %s/%s%s%s does not exist\n",
+                       rbd_dev->spec->pool_name,
+                       rbd_dev->spec->pool_ns ?: "",
+                       rbd_dev->spec->pool_ns ? "/" : "",
+                       rbd_dev->spec->image_name);
+       } else {
+               pr_info("snap %s/%s%s%s@%s does not exist\n",
+                       rbd_dev->spec->pool_name,
+                       rbd_dev->spec->pool_ns ?: "",
+                       rbd_dev->spec->pool_ns ? "/" : "",
+                       rbd_dev->spec->image_name,
+                       rbd_dev->spec->snap_name);
+       }
+}
+
 static void rbd_dev_image_release(struct rbd_device *rbd_dev)
 {
        rbd_dev_unprobe(rbd_dev);
@@ -6979,6 +6997,7 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev)
  */
 static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
 {
+       bool need_watch = !rbd_is_ro(rbd_dev);
        int ret;
 
        /*
@@ -6995,22 +7014,21 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
        if (ret)
                goto err_out_format;
 
-       if (!depth) {
+       if (need_watch) {
                ret = rbd_register_watch(rbd_dev);
                if (ret) {
                        if (ret == -ENOENT)
-                               pr_info("image %s/%s%s%s does not exist\n",
-                                       rbd_dev->spec->pool_name,
-                                       rbd_dev->spec->pool_ns ?: "",
-                                       rbd_dev->spec->pool_ns ? "/" : "",
-                                       rbd_dev->spec->image_name);
+                               rbd_print_dne(rbd_dev, false);
                        goto err_out_format;
                }
        }
 
        ret = rbd_dev_header_info(rbd_dev);
-       if (ret)
+       if (ret) {
+               if (ret == -ENOENT && !need_watch)
+                       rbd_print_dne(rbd_dev, false);
                goto err_out_watch;
+       }
 
        /*
         * If this image is the one being mapped, we have pool name and
@@ -7024,12 +7042,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
                ret = rbd_spec_fill_names(rbd_dev);
        if (ret) {
                if (ret == -ENOENT)
-                       pr_info("snap %s/%s%s%s@%s does not exist\n",
-                               rbd_dev->spec->pool_name,
-                               rbd_dev->spec->pool_ns ?: "",
-                               rbd_dev->spec->pool_ns ? "/" : "",
-                               rbd_dev->spec->image_name,
-                               rbd_dev->spec->snap_name);
+                       rbd_print_dne(rbd_dev, true);
                goto err_out_probe;
        }
 
@@ -7061,7 +7074,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
 err_out_probe:
        rbd_dev_unprobe(rbd_dev);
 err_out_watch:
-       if (!depth)
+       if (need_watch)
                rbd_unregister_watch(rbd_dev);
 err_out_format:
        rbd_dev->image_format = 0;