drbd: fix memleak in error path in bm_rw and drbd_bm_write_range
authorLars Ellenberg <lars.ellenberg@linbit.com>
Mon, 26 Mar 2012 14:22:00 +0000 (16:22 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:58:20 +0000 (16:58 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_bitmap.c

index ef6a79b..e343817 100644 (file)
@@ -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;
 }