diff options
author | Mark Brown <broonie@kernel.org> | 2016-02-05 19:31:48 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-02-05 19:31:48 +0000 |
commit | 130faf3765d29c961be74f7245eb504a414a68e2 (patch) | |
tree | df25d9b427876e1b95a3ff8e9f38dddcfce26610 /drivers/block/rbd.c | |
parent | f90ae1b62bedd8b57966a7be68855f2d43170db6 (diff) | |
parent | 707e840c5e24bb2df1ea4e753964275e257ec816 (diff) |
Merge tag 'v3.18.26' into linux-linaro-lsk-v3.18lsk-v3.18-16.02
Linux 3.18.26
# gpg: Signature made Mon 25 Jan 2016 15:06:44 GMT using RSA key ID 97772CDC
# gpg: requesting key 97772CDC from hkp server the.earth.li
# gpg: key 97772CDC: public key "Sasha Levin <sasha.levin@oracle.com>" imported
# gpg: no ultimately trusted keys found
# gpg: Total number processed: 1
# gpg: imported: 1 (RSA: 1)
# gpg: Good signature from "Sasha Levin <sasha.levin@oracle.com>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: E27E 5D8A 3403 A2EF 6687 3BBC DEA6 6FF7 9777 2CDC
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 8f51d6e3883e..c546a93c0f8a 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3394,6 +3394,7 @@ static void rbd_handle_request(struct rbd_device *rbd_dev, struct request *rq) goto err_rq; } img_request->rq = rq; + snapc = NULL; /* img_request consumes a ref */ if (op_type == OBJ_OP_DISCARD) result = rbd_img_request_fill(img_request, OBJ_REQUEST_NODATA, @@ -5172,41 +5173,36 @@ out_err: static int rbd_dev_probe_parent(struct rbd_device *rbd_dev) { struct rbd_device *parent = NULL; - struct rbd_spec *parent_spec; - struct rbd_client *rbdc; int ret; if (!rbd_dev->parent_spec) return 0; - /* - * We need to pass a reference to the client and the parent - * spec when creating the parent rbd_dev. Images related by - * parent/child relationships always share both. - */ - parent_spec = rbd_spec_get(rbd_dev->parent_spec); - rbdc = __rbd_get_client(rbd_dev->rbd_client); - ret = -ENOMEM; - parent = rbd_dev_create(rbdc, parent_spec); - if (!parent) + parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec); + if (!parent) { + ret = -ENOMEM; goto out_err; + } + + /* + * Images related by parent/child relationships always share + * rbd_client and spec/parent_spec, so bump their refcounts. + */ + __rbd_get_client(rbd_dev->rbd_client); + rbd_spec_get(rbd_dev->parent_spec); ret = rbd_dev_image_probe(parent, false); if (ret < 0) goto out_err; + rbd_dev->parent = parent; atomic_set(&rbd_dev->parent_ref, 1); - return 0; + out_err: - if (parent) { - rbd_dev_unparent(rbd_dev); + rbd_dev_unparent(rbd_dev); + if (parent) rbd_dev_destroy(parent); - } else { - rbd_put_client(rbdc); - rbd_spec_put(parent_spec); - } - return ret; } |