aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-26 00:15:08 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:19:34 -0400
commit5655c4d940ba8dd32250ab1e4ba3db785943a28e (patch)
treeeca7458b04f89420efe1fdfe576488f9cd6814b9
parentc0fba36880288afbeca872298c970fb4abb76464 (diff)
rbd: fix image id leak in initial probe
If a format 2 image id is found for an image being mapped, but the subsequent probe of the image fails, rbd_dev_probe() quits without freeing the image id. Fix that. Also drop a redundant hunk of code in rbd_dev_image_id(). Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 0ddcbe584a1f..815c174661a8 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4800,17 +4800,21 @@ static int rbd_dev_probe(struct rbd_device *rbd_dev)
4800 ret = rbd_dev_v1_probe(rbd_dev); 4800 ret = rbd_dev_v1_probe(rbd_dev);
4801 else 4801 else
4802 ret = rbd_dev_v2_probe(rbd_dev); 4802 ret = rbd_dev_v2_probe(rbd_dev);
4803 if (ret) { 4803 if (ret)
4804 dout("probe failed, returning %d\n", ret); 4804 goto out_err;
4805
4806 return ret;
4807 }
4808 4805
4809 ret = rbd_dev_probe_finish(rbd_dev); 4806 ret = rbd_dev_probe_finish(rbd_dev);
4810 if (ret) 4807 if (ret)
4811 rbd_header_free(&rbd_dev->header); 4808 rbd_header_free(&rbd_dev->header);
4812 4809
4813 return ret; 4810 return ret;
4811out_err:
4812 kfree(rbd_dev->spec->image_id);
4813 rbd_dev->spec->image_id = NULL;
4814
4815 dout("probe failed, returning %d\n", ret);
4816
4817 return ret;
4814} 4818}
4815 4819
4816static ssize_t rbd_add(struct bus_type *bus, 4820static ssize_t rbd_add(struct bus_type *bus,