From 050c2fb23b1f98745305a3dfe3062ea5a66dfdb4 Mon Sep 17 00:00:00 2001 From: Vladimir Saveliev Date: Wed, 26 Jul 2023 16:09:18 +0300 Subject: [PATCH] LU-16043 osc: allow error for write on CL_FSYNC_DISCARD If case of CL_FSYNC_DISCARD error is allowed for write of osc object. Otherwise, the included test fails in rm with: (osc_page.c:174:osc_page_delete()) Trying to teardown failed: -16 (osc_page.c:175:osc_page_delete()) ASSERTION( 0 ) failed: (osc_page.c:175:osc_page_delete()) LBUG Test-Parameters: trivial testlist=sanity env=ONLY=907 HPE-bug-id: LUS-10410 Signed-off-by: Vladimir Saveliev Change-Id: I0aae0dc470ba0371964e7643a6d84b19a1b4e106 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/48032 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Patrick Farrell Reviewed-by: Andrew Perepechko Reviewed-by: Oleg Drokin --- lustre/osc/osc_io.c | 7 +++++++ lustre/target/tgt_handler.c | 2 +- lustre/tests/sanity.sh | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lustre/osc/osc_io.c b/lustre/osc/osc_io.c index 93b708b..215cb38 100644 --- a/lustre/osc/osc_io.c +++ b/lustre/osc/osc_io.c @@ -971,6 +971,13 @@ static int osc_io_fsync_start(const struct lu_env *env, result = osc_cache_writeback_range(env, osc, start, end, 0, fio->fi_mode == CL_FSYNC_DISCARD); + if (result < 0 && fio->fi_mode == CL_FSYNC_DISCARD) { + CDEBUG(D_CACHE, + "%s: ignore error %d on discarding "DFID":[%lu-%lu]\n", + cli_name(osc_cli(osc)), result, PFID(fio->fi_fid), + start, end); + result = 0; + } if (result > 0) { fio->fi_nr_written += result; result = 0; diff --git a/lustre/target/tgt_handler.c b/lustre/target/tgt_handler.c index aab4309..13868c3 100644 --- a/lustre/target/tgt_handler.c +++ b/lustre/target/tgt_handler.c @@ -2678,7 +2678,7 @@ int tgt_brw_write(struct tgt_session_info *tsi) if (CFS_FAIL_CHECK(OBD_FAIL_OST_ENOSPC)) RETURN(err_serious(-ENOSPC)); if (CFS_FAIL_TIMEOUT(OBD_FAIL_OST_EROFS, 1)) - RETURN(err_serious(-EROFS)); + RETURN(err_serious(cfs_fail_val ? -cfs_fail_val : -EROFS)); req->rq_bulk_write = 1; diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 7009ab2..6425fc4 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -30801,6 +30801,24 @@ test_906() { } run_test 906 "Simple test for io_uring I/O engine via fio" +test_907() { + local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1) + + # set stripe size to max rpc size + $LFS setstripe -i 0 -c 2 -S $((max_pages * PAGE_SIZE)) $DIR/$tfile + $LFS getstripe $DIR/$tfile +#define OBD_FAIL_OST_EROFS 0x216 + do_facet ost1 "$LCTL set_param fail_val=3 fail_loc=0x80000216" + + local bs=$((max_pages * PAGE_SIZE / 16)) + + # write full one stripe and one block + dd if=/dev/zero of=$DIR/$tfile bs=$bs count=17 || error "dd failed" + + rm $DIR/$tfile || error "rm failed" +} +run_test 907 "write rpc error during unlink" + complete_test $SECONDS [ -f $EXT2_DEV ] && rm $EXT2_DEV || true check_and_cleanup_lustre -- 1.8.3.1