Skip to content

Commit

Permalink
rbd: set mapping read-only flag in rbd_add()
Browse files Browse the repository at this point in the history
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/4940

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
  • Loading branch information
Alex Elder committed May 9, 2013
1 parent 5b2ab72 commit 7ce4eef
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ static ssize_t rbd_add(struct bus_type *bus, const char *buf,
size_t count);
static ssize_t rbd_remove(struct bus_type *bus, const char *buf,
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[] = {
__ATTR(add, S_IWUSR, NULL, rbd_add),
Expand Down Expand Up @@ -4549,7 +4549,7 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
if (!parent)
goto out_err;

ret = rbd_dev_image_probe(parent, true);
ret = rbd_dev_image_probe(parent);
if (ret < 0)
goto out_err;
rbd_dev->parent = parent;
Expand Down Expand Up @@ -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
* device. For format 2 images this includes determining the image
* id.
* device.
*/
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 tmp;
Expand Down Expand Up @@ -4709,12 +4708,6 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool read_only)
if (ret)
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);
if (ret)
goto err_out_probe;
Expand Down Expand Up @@ -4795,10 +4788,16 @@ static ssize_t rbd_add(struct bus_type *bus,
rbdc = 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)
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);
if (!rc)
return count;
Expand Down

0 comments on commit 7ce4eef

Please sign in to comment.