diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2012-03-26 16:22:00 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 16:58:20 +0100 |
commit | 9dab3842b5bfffc20135ea56f147e5fe2857be40 (patch) | |
tree | 7eeee6d6602f27aeaf7ea0dbda41380f2b439666 | |
parent | a6a7d4f0c12d3e04d96cca58b95bb0358101a078 (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.c | 10 |
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; } |