diff options
author | Alex Elder <elder@inktank.com> | 2013-04-26 00:15:08 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:19:34 -0400 |
commit | 5655c4d940ba8dd32250ab1e4ba3db785943a28e (patch) | |
tree | eca7458b04f89420efe1fdfe576488f9cd6814b9 | |
parent | c0fba36880288afbeca872298c970fb4abb76464 (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.c | 14 |
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; |
4811 | out_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 | ||
4816 | static ssize_t rbd_add(struct bus_type *bus, | 4820 | static ssize_t rbd_add(struct bus_type *bus, |