summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2012-03-26 16:22:00 +0200
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 16:58:20 +0100
commit9dab3842b5bfffc20135ea56f147e5fe2857be40 (patch)
tree7eeee6d6602f27aeaf7ea0dbda41380f2b439666
parenta6a7d4f0c12d3e04d96cca58b95bb0358101a078 (diff)
drbd: fix memleak in error path in bm_rw and drbd_bm_write_range
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r--drivers/block/drbd/drbd_bitmap.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c
index ef6a79b46dfa..e343817bc69e 100644
--- a/drivers/block/drbd/drbd_bitmap.c
+++ b/drivers/block/drbd/drbd_bitmap.c
@@ -1075,8 +1075,8 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned flags, unsigned lazy_w
if (!get_ldev_if_state(mdev, D_ATTACHING)) { /* put is in bm_aio_ctx_destroy() */
dev_err(DEV, "ASSERT FAILED: get_ldev_if_state() == 1 in bm_rw()\n");
- err = -ENODEV;
- goto out;
+ kfree(ctx);
+ return -ENODEV;
}
if (!ctx->flags)
@@ -1156,7 +1156,6 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned flags, unsigned lazy_w
dev_info(DEV, "%s (%lu bits) marked out-of-sync by on disk bit-map.\n",
ppsize(ppb, now << (BM_BLOCK_SHIFT-10)), now);
-out:
kref_put(&ctx->kref, &bm_aio_ctx_destroy);
return err;
}
@@ -1237,8 +1236,8 @@ int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(loc
if (!get_ldev_if_state(mdev, D_ATTACHING)) { /* put is in bm_aio_ctx_destroy() */
dev_err(DEV, "ASSERT FAILED: get_ldev_if_state() == 1 in drbd_bm_write_page()\n");
- err = -ENODEV;
- goto out;
+ kfree(ctx);
+ return -ENODEV;
}
bm_page_io_async(ctx, idx, WRITE_SYNC);
@@ -1251,7 +1250,6 @@ int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(loc
mdev->bm_writ_cnt++;
err = atomic_read(&ctx->in_flight) ? -EIO : ctx->error;
- out:
kref_put(&ctx->kref, &bm_aio_ctx_destroy);
return err;
}