From 42c52069cada6837df34a02638717dff709e5a0e Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Wed, 13 Jan 2021 18:48:54 +0300 Subject: [PATCH] LU-14286 osd-ldiskfs: don't read unwritten blocks which were allocated using fallocate(2), instead fill the pages with zeroes. Add a test to verify that fallocated blocks read as zeroes. Signed-off-by: Alex Zhuravlev Change-Id: I9c0c90f93fd33f26f834144e225b2643cf9fffb7 Reviewed-on: https://review.whamcloud.com/41216 Reviewed-by: Andreas Dilger Reviewed-by: Arshad Hussain Tested-by: jenkins Tested-by: Maloo --- lustre/osd-ldiskfs/osd_io.c | 8 ++++++++ lustre/tests/sanity.sh | 24 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 77843ff..66db3f5 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1156,6 +1156,14 @@ cont_map: total++; break; } + if ((map.m_flags & LDISKFS_MAP_UNWRITTEN) && + !create) { + /* don't try to read allocated, but + * unwritten blocks, instead fill the + * patches with zeros in osd_do_bio() */ + *(blocks + total) = 0; + continue; + } *(blocks + total) = map.m_pblk + c; /* unmap any possible underlying * metadata from the block device diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index ff2db35..fcde344 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -13406,6 +13406,7 @@ test_150a() { local TF="$TMP/$tfile" + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed" cp $TF $DIR/$tfile cancel_lru_locks $OSC @@ -13428,9 +13429,6 @@ test_150a() { echo "12345" >>$DIR/$tfile cancel_lru_locks $OSC cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)" - - rm -f $TF - true } run_test 150a "truncate/append tests" @@ -13439,10 +13437,27 @@ test_150b() { [ $OST1_VERSION -lt $(version_code 2.13.50) ] && skip "Need OST version at least 2.13.53" touch $DIR/$tfile + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" check_fallocate $DIR/$tfile || error "fallocate failed" } run_test 150b "Verify fallocate (prealloc) functionality" +test_150bb() { + [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend" + [ $OST1_VERSION -lt $(version_code 2.13.50) ] && + skip "Need OST version at least 2.13.53" + touch $DIR/$tfile + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" + dd if=/dev/urandom of=$DIR/$tfile bs=1M count=20 || error "dd failed" + > $DIR/$tfile + fallocate -l $((1048576 * 20)) $DIR/$tfile || error "fallocate failed" + local sum=($(md5sum $DIR/$tfile)) + local expect="8f4e33f3dc3e414ff94e5fb6905cba8c" + + [[ "${sum[0]}" == "$expect" ]] || error "fallocated file is not zero" +} +run_test 150bb "Verify fallocate zeroes space" + test_150c() { local bytes local want @@ -13451,6 +13466,7 @@ test_150c() { [ $OST1_VERSION -lt $(version_code 2.13.50) ] && skip "Need OST version at least 2.13.53" + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tfile || error "setstripe failed" fallocate -l ${OSTCOUNT}m $DIR/$tfile || error "fallocate failed" sync; sync_all_data @@ -13489,6 +13505,7 @@ test_150d() { [ $OST1_VERSION -lt $(version_code 2.13.50) ] && skip "Need OST version at least 2.13.53" + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tdir || error "setstripe failed" fallocate -o 1G -l ${OSTCOUNT}m $DIR/$tdir || error "fallocate failed" sync; sync_all_data @@ -13510,6 +13527,7 @@ test_150e() { echo "df before:" $LFS df + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" $LFS setstripe -c${OSTCOUNT} $DIR/$tfile || error "$LFS setstripe -c${OSTCOUNT} $DIR/$tfile failed" -- 1.8.3.1