Whamcloud - gitweb
LU-16043 osc: allow error for write on CL_FSYNC_DISCARD 32/48032/4
authorVladimir Saveliev <vladimir.saveliev@hpe.com>
Wed, 26 Jul 2023 13:09:18 +0000 (16:09 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 6 Sep 2023 06:16:57 +0000 (06:16 +0000)
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 <vladimir.saveliev@hpe.com>
Change-Id: I0aae0dc470ba0371964e7643a6d84b19a1b4e106
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/48032
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osc/osc_io.c
lustre/target/tgt_handler.c
lustre/tests/sanity.sh

index 93b708b..215cb38 100644 (file)
@@ -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;
index aab4309..13868c3 100644 (file)
@@ -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;
 
index 7009ab2..6425fc4 100755 (executable)
@@ -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