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>
This commit is contained in:
committed by
Philipp Reisner
parent
85719573dd
commit
c36c3ced69
@@ -796,12 +796,16 @@ enum {
|
|||||||
* if any of those fail, we set this flag atomically
|
* if any of those fail, we set this flag atomically
|
||||||
* from the endio callback */
|
* from the endio callback */
|
||||||
__EE_WAS_ERROR,
|
__EE_WAS_ERROR,
|
||||||
|
|
||||||
|
/* This ee has a pointer to a digest instead of a block id */
|
||||||
|
__EE_HAS_DIGEST,
|
||||||
};
|
};
|
||||||
#define EE_CALL_AL_COMPLETE_IO (1<<__EE_CALL_AL_COMPLETE_IO)
|
#define EE_CALL_AL_COMPLETE_IO (1<<__EE_CALL_AL_COMPLETE_IO)
|
||||||
#define EE_MAY_SET_IN_SYNC (1<<__EE_MAY_SET_IN_SYNC)
|
#define EE_MAY_SET_IN_SYNC (1<<__EE_MAY_SET_IN_SYNC)
|
||||||
#define EE_IS_BARRIER (1<<__EE_IS_BARRIER)
|
#define EE_IS_BARRIER (1<<__EE_IS_BARRIER)
|
||||||
#define EE_RESUBMITTED (1<<__EE_RESUBMITTED)
|
#define EE_RESUBMITTED (1<<__EE_RESUBMITTED)
|
||||||
#define EE_WAS_ERROR (1<<__EE_WAS_ERROR)
|
#define EE_WAS_ERROR (1<<__EE_WAS_ERROR)
|
||||||
|
#define EE_HAS_DIGEST (1<<__EE_HAS_DIGEST)
|
||||||
|
|
||||||
/* global flag bits */
|
/* global flag bits */
|
||||||
enum {
|
enum {
|
||||||
|
@@ -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)
|
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);
|
drbd_pp_free(mdev, e->pages);
|
||||||
D_ASSERT(atomic_read(&e->pending_bios) == 0);
|
D_ASSERT(atomic_read(&e->pending_bios) == 0);
|
||||||
D_ASSERT(hlist_unhashed(&e->colision));
|
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_size = digest_size;
|
||||||
di->digest = (((char *)di)+sizeof(struct digest_info));
|
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)
|
if (drbd_recv(mdev, di->digest, digest_size) != digest_size)
|
||||||
goto out_free_e;
|
goto out_free_e;
|
||||||
|
|
||||||
e->digest = di;
|
|
||||||
if (h->command == P_CSUM_RS_REQUEST) {
|
if (h->command == P_CSUM_RS_REQUEST) {
|
||||||
D_ASSERT(mdev->agreed_pro_version >= 89);
|
D_ASSERT(mdev->agreed_pro_version >= 89);
|
||||||
e->w.cb = w_e_end_csum_rs_req;
|
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;
|
return TRUE;
|
||||||
|
|
||||||
out_free_e:
|
out_free_e:
|
||||||
kfree(di);
|
|
||||||
put_ldev(mdev);
|
put_ldev(mdev);
|
||||||
drbd_free_ee(mdev, e);
|
drbd_free_ee(mdev, e);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@@ -1052,9 +1052,6 @@ int w_e_end_csum_rs_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dec_unacked(mdev);
|
dec_unacked(mdev);
|
||||||
|
|
||||||
kfree(di);
|
|
||||||
|
|
||||||
move_to_net_ee_or_free(mdev, e);
|
move_to_net_ee_or_free(mdev, e);
|
||||||
|
|
||||||
if (unlikely(!ok))
|
if (unlikely(!ok))
|
||||||
@@ -1145,9 +1142,6 @@ int w_e_end_ov_reply(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dec_unacked(mdev);
|
dec_unacked(mdev);
|
||||||
|
|
||||||
kfree(di);
|
|
||||||
|
|
||||||
if (!eq)
|
if (!eq)
|
||||||
drbd_ov_oos_found(mdev, e->sector, e->size);
|
drbd_ov_oos_found(mdev, e->sector, e->size);
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user