[LTP] [PATCH] Add test for file truncation over NFS

Martin Doucha mdoucha@suse.cz
Tue Feb 13 15:02:11 CET 2024


Some older kernels have a bug in NFS where the client caches that
a file does not exist after unsuccessful access to it and then
does not pass O_TRUNC flag to the server even though the file may
have been created by another client in the mean time. This may result
in new data being merged with old file contents instead of replacing
them.

Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
 runtest/net.nfs                           | 11 ++++++++
 testcases/network/nfs/nfs_stress/nfs09.sh | 34 +++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100755 testcases/network/nfs/nfs_stress/nfs09.sh

diff --git a/runtest/net.nfs b/runtest/net.nfs
index 9c1c5c63e..af2a64174 100644
--- a/runtest/net.nfs
+++ b/runtest/net.nfs
@@ -83,6 +83,17 @@ nfs08_v40_ip6t nfs08.sh -6 -v 4 -t tcp
 nfs08_v41_ip6t nfs08.sh -6 -v 4.1 -t tcp
 nfs08_v42_ip6t nfs08.sh -6 -v 4.2 -t tcp
 
+nfs09_v30_ip4u nfs09.sh -v 3 -t udp
+nfs09_v30_ip4t nfs09.sh -v 3 -t tcp
+nfs09_v40_ip4t nfs09.sh -v 4 -t tcp
+nfs09_v41_ip4t nfs09.sh -v 4.1 -t tcp
+nfs09_v42_ip4t nfs09.sh -v 4.2 -t tcp
+nfs09_v30_ip6u nfs09.sh -6 -v 3 -t udp
+nfs09_v30_ip6t nfs09.sh -6 -v 3 -t tcp
+nfs09_v40_ip6t nfs09.sh -6 -v 4 -t tcp
+nfs09_v41_ip6t nfs09.sh -6 -v 4.1 -t tcp
+nfs09_v42_ip6t nfs09.sh -6 -v 4.2 -t tcp
+
 nfslock01_v30_ip4u nfslock01.sh -v 3 -t udp
 nfslock01_v30_ip4t nfslock01.sh -v 3 -t tcp
 nfslock01_v40_ip4t nfslock01.sh -v 4 -t tcp
diff --git a/testcases/network/nfs/nfs_stress/nfs09.sh b/testcases/network/nfs/nfs_stress/nfs09.sh
new file mode 100755
index 000000000..88c1a1ec5
--- /dev/null
+++ b/testcases/network/nfs/nfs_stress/nfs09.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2024 SUSE LLC <mdoucha@suse.cz>
+#
+# DESCRIPTION: Check that stale NFS client cache does not prevent file
+# truncation.
+#
+# 1. Through NFS, access metadata of a file that does not exist
+# 2. Create the file on the remote end (bypassing NFS)
+# 3. Through NFS, try to overwrite the file with shorter data
+
+TST_TESTFUNC="do_test"
+
+do_test()
+{
+	local local_file="testfile"
+	local remote_file="$(nfs_get_remote_path)/$local_file"
+	local testmsg='File truncated'
+	local data
+
+	EXPECT_FAIL "ls -l '$local_file'"
+	tst_rhost_run -c "echo -n 'File rewritten not' >'$remote_file'"
+	echo -n "$testmsg" >"$local_file"
+	data=$(tst_rhost_run -c "cat '$remote_file'")
+
+	if [ "$data" != "$testmsg" ]; then
+		tst_res TFAIL "Wrong file contents, expected '$testmsg', got '$data'"
+	else
+		tst_res TPASS "File was truncated correctly"
+	fi
+}
+
+. nfs_lib.sh
+tst_run
-- 
2.42.1



More information about the ltp mailing list