From bdd7ad3787beebcf55340f7ebb495d42002516d2 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Acharya Date: Wed, 22 Nov 2017 15:12:26 +0530 Subject: cluster/ec: EC DISCARD doesn't punch hole properly Problem: DISCARD operation on EC volume was punching hole of lesser size than the specified size in some cases. Solution: EC was not handling punch hole for tail part in some cases. Updated the code to handle it appropriately. BUG: 1516206 Change-Id: If3e69e417c3e5034afee04e78f5f78855e65f932 Signed-off-by: Sunil Kumar Acharya --- xlators/cluster/ec/src/ec-inode-write.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'xlators/cluster/ec/src/ec-inode-write.c') diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index 2f8170d1ac0..afdb50c826e 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -1145,11 +1145,13 @@ void ec_update_discard_write(ec_fop_data_t *fop, uintptr_t mask) error = ec_update_write (fop, mask, off_head, fop->user_size); } else { size_head = fop->int32; - size_tail = (fop->user_size - fop->int32) % ec->stripe_size; + size_tail = (off_head + fop->user_size) % ec->stripe_size; off_tail = off_head + fop->user_size - size_tail; if (size_head) { error = ec_update_write (fop, mask, off_head, size_head); - goto out; + if (error) { + goto out; + } } if (size_tail) { error = ec_update_write (fop, mask, off_tail, size_tail); -- cgit