diff options
author | Sunil Kumar Acharya <sheggodu@redhat.com> | 2017-11-22 15:12:26 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-11-29 14:43:10 +0000 |
commit | 098a5ec1a30f69ec1bbea89f14b4a7a9212d5e20 (patch) | |
tree | 6589adf4c35725f3071f58ed2ab66507431fc8b9 | |
parent | 4e33ea6e469f8812813f5616dee2e9628e2fc474 (diff) |
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 <sheggodu@redhat.com>
BUG: 1518257
Change-Id: If3e69e417c3e5034afee04e78f5f78855e65f932
Signed-off-by: Sunil Kumar Acharya <sheggodu@redhat.com>
-rw-r--r-- | tests/basic/ec/ec-discard.t | 10 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 6 |
2 files changed, 13 insertions, 3 deletions
diff --git a/tests/basic/ec/ec-discard.t b/tests/basic/ec/ec-discard.t index 4a44cecf0a9..001f4498c86 100644 --- a/tests/basic/ec/ec-discard.t +++ b/tests/basic/ec/ec-discard.t @@ -137,6 +137,15 @@ TEST md5_sum=`get_md5_sum $B0/test_file` EXPECT $md5_sum get_md5_sum $M0/test_file TEST rm -f $B0/test_file $M0/test_file +#Offset and Size not at boundary covering a stripe +TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8 +TEST cp $B0/test_file $M0/test_file +TEST fallocate -p -o 1500 -l 3000 $B0/test_file +TEST fallocate -p -o 1500 -l 3000 $M0/test_file +TEST md5_sum=`get_md5_sum $B0/test_file` +EXPECT $md5_sum get_md5_sum $M0/test_file +TEST rm -f $B0/test_file $M0/test_file + #Offset and Size not at boundary TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8 TEST cp $B0/test_file $M0/test_file @@ -144,7 +153,6 @@ TEST fallocate -p -o 1000 -l 3072 $B0/test_file TEST fallocate -p -o 1000 -l 3072 $M0/test_file TEST md5_sum=`get_md5_sum $B0/test_file` EXPECT $md5_sum get_md5_sum $M0/test_file -#TEST rm -f $B0/test_file $M0/test_file #Data Corruption Tests #Kill brick1 and brick2 diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index ae5120226e3..2c1165b8b42 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -1144,11 +1144,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); |