Commit 7ce4eef7 authored by Alex Elder's avatar Alex Elder

rbd: set mapping read-only flag in rbd_add()

The rbd_dev->mapping field for a parent image is not meaningful.
Since rbd_image_probe() is used both for images being mapped and
their parents, it doesn't make sense to set that flag in that
function.

So move the setting of the mapping.read_only flag out of
rbd_dev_image_probe() and into rbd_add() instead.

This resolves:
    http://tracker.ceph.com/issues/4940Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent 5b2ab72d
...@@ -358,7 +358,7 @@ static ssize_t rbd_add(struct bus_type *bus, const char *buf, ...@@ -358,7 +358,7 @@ static ssize_t rbd_add(struct bus_type *bus, const char *buf,
size_t count); size_t count);
static ssize_t rbd_remove(struct bus_type *bus, const char *buf, static ssize_t rbd_remove(struct bus_type *bus, const char *buf,
size_t count); size_t count);
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool read_only); static int rbd_dev_image_probe(struct rbd_device *rbd_dev);
static struct bus_attribute rbd_bus_attrs[] = { static struct bus_attribute rbd_bus_attrs[] = {
__ATTR(add, S_IWUSR, NULL, rbd_add), __ATTR(add, S_IWUSR, NULL, rbd_add),
...@@ -4549,7 +4549,7 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev) ...@@ -4549,7 +4549,7 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
if (!parent) if (!parent)
goto out_err; goto out_err;
ret = rbd_dev_image_probe(parent, true); ret = rbd_dev_image_probe(parent);
if (ret < 0) if (ret < 0)
goto out_err; goto out_err;
rbd_dev->parent = parent; rbd_dev->parent = parent;
...@@ -4671,10 +4671,9 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev) ...@@ -4671,10 +4671,9 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev)
/* /*
* Probe for the existence of the header object for the given rbd * Probe for the existence of the header object for the given rbd
* device. For format 2 images this includes determining the image * device.
* id.
*/ */
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool read_only) static int rbd_dev_image_probe(struct rbd_device *rbd_dev)
{ {
int ret; int ret;
int tmp; int tmp;
...@@ -4709,12 +4708,6 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool read_only) ...@@ -4709,12 +4708,6 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool read_only)
if (ret) if (ret)
goto err_out_probe; goto err_out_probe;
/* If we are mapping a snapshot it must be marked read-only */
if (rbd_dev->spec->snap_id != CEPH_NOSNAP)
read_only = true;
rbd_dev->mapping.read_only = read_only;
ret = rbd_dev_probe_parent(rbd_dev); ret = rbd_dev_probe_parent(rbd_dev);
if (ret) if (ret)
goto err_out_probe; goto err_out_probe;
...@@ -4795,10 +4788,16 @@ static ssize_t rbd_add(struct bus_type *bus, ...@@ -4795,10 +4788,16 @@ static ssize_t rbd_add(struct bus_type *bus,
rbdc = NULL; /* rbd_dev now owns this */ rbdc = NULL; /* rbd_dev now owns this */
spec = NULL; /* rbd_dev now owns this */ spec = NULL; /* rbd_dev now owns this */
rc = rbd_dev_image_probe(rbd_dev, read_only); rc = rbd_dev_image_probe(rbd_dev);
if (rc < 0) if (rc < 0)
goto err_out_rbd_dev; goto err_out_rbd_dev;
/* If we are mapping a snapshot it must be marked read-only */
if (rbd_dev->spec->snap_id != CEPH_NOSNAP)
read_only = true;
rbd_dev->mapping.read_only = read_only;
rc = rbd_dev_device_setup(rbd_dev); rc = rbd_dev_device_setup(rbd_dev);
if (!rc) if (!rc)
return count; return count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment