summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
authorLars Ellenberg2010-08-11 20:42:55 +0200
committerPhilipp Reisner2010-10-14 18:38:16 +0200
commitc36c3ced692b38d0cf90a5e6f875be2f9ebbc037 (patch)
treee8384ed0c80e2ce057006d83944a299445811380 /drivers/block/drbd/drbd_receiver.c
parentdrbd: Replaced some casts by an union. Improved comments (diff)
downloadkernel-qcow2-linux-c36c3ced692b38d0cf90a5e6f875be2f9ebbc037.tar.gz
kernel-qcow2-linux-c36c3ced692b38d0cf90a5e6f875be2f9ebbc037.tar.xz
kernel-qcow2-linux-c36c3ced692b38d0cf90a5e6f875be2f9ebbc037.zip
drbd: let drbd_free_ee implicitly free any digest
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 0b03e3174f76..2f9320be4906 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -377,6 +377,8 @@ struct drbd_epoch_entry *drbd_alloc_ee(struct drbd_conf *mdev,
void drbd_free_ee(struct drbd_conf *mdev, struct drbd_epoch_entry *e)
{
+ if (e->flags & EE_HAS_DIGEST)
+ kfree(e->digest);
drbd_pp_free(mdev, e->pages);
D_ASSERT(atomic_read(&e->pending_bios) == 0);
D_ASSERT(hlist_unhashed(&e->colision));
@@ -2094,10 +2096,12 @@ static int receive_DataRequest(struct drbd_conf *mdev, struct p_header *h)
di->digest_size = digest_size;
di->digest = (((char *)di)+sizeof(struct digest_info));
+ e->digest = di;
+ e->flags |= EE_HAS_DIGEST;
+
if (drbd_recv(mdev, di->digest, digest_size) != digest_size)
goto out_free_e;
- e->digest = di;
if (h->command == P_CSUM_RS_REQUEST) {
D_ASSERT(mdev->agreed_pro_version >= 89);
e->w.cb = w_e_end_csum_rs_req;
@@ -2159,7 +2163,6 @@ static int receive_DataRequest(struct drbd_conf *mdev, struct p_header *h)
return TRUE;
out_free_e:
- kfree(di);
put_ldev(mdev);
drbd_free_ee(mdev, e);
return FALSE;