Whamcloud - gitweb
LU-15670 clio: Disable lockless for DIO with O_APPEND 90/46890/4
authorShaun Tancheff <shaun.tancheff@hpe.com>
Tue, 22 Mar 2022 13:08:35 +0000 (08:08 -0500)
committerOleg Drokin <green@whamcloud.com>
Sun, 3 Apr 2022 16:08:58 +0000 (16:08 +0000)
Lockless O_DIRECT with O_APPEND can allow interleaved / racy
appends from concurrent I/O.

Disable lockless I/O when O_APPEND is set

HPE-bug-id: LUS-9776
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: I5c56f92c90e631c295f56e5958985f516e1990f8
Reviewed-on: https://review.whamcloud.com/46890
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/file.c
lustre/tests/sanity.sh

index 1912240..15ffe4e 100644 (file)
@@ -1664,6 +1664,8 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
 
        io = vvp_env_thread_io(env);
        if (file->f_flags & O_DIRECT) {
+               if (file->f_flags & O_APPEND)
+                       dio_lock = 1;
                if (!is_sync_kiocb(args->u.normal.via_iocb))
                        is_aio = true;
 
index 632faa9..30ac527 100755 (executable)
@@ -24294,11 +24294,20 @@ test_398a() { # LU-4198
 
        $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
 
-       # no lock cached, should use lockless IO and not enqueue new lock
+       # no lock cached, should use lockless DIO and not enqueue new lock
        dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
        lock_count=$($LCTL get_param -n \
                     ldlm.namespaces.$imp_name.lru_size)
        [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
+
+       $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
+
+       # no lock cached, should use locked DIO append
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct oflag=append \
+               conv=notrunc || error "DIO append failed"
+       lock_count=$($LCTL get_param -n \
+                    ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+       [[ $lock_count -ne 0 ]] || error "lock still must be held by DIO append"
 }
 run_test 398a "direct IO should cancel lock otherwise lockless"