From: Chuck Lever <cel@kernel.org>
To: Calum Mackay <calum.mackay@oracle.com>
Cc: <linux-nfs@vger.kernel.org>
Subject: [PATCH v1 4/8] pynfs: add tests for SETATTR by a delegation holder
Date: Thu, 8 Oct 2026 11:47:25 -0400 [thread overview]
Message-ID: <20261008154729.77787-5-cel@kernel.org> (raw)
In-Reply-To: <20261008154729.77787-1-cel@kernel.org>
A client that holds a delegation and then changes the file's mode
does not conflict with itself, so the server has no reason to recall
that delegation. A server that recalls it anyway costs the client
its delegation on every chmod, and no test checks for that.
Add DELEG30 and DELEG31, which take a write and a read delegation
and send a mode-changing SETATTR from the same session. Each fails
if a CB_RECALL arrives within two seconds or if TEST_STATEID no
longer accepts the delegation stateid. A server that does not grant
the delegation type the test asks for gets UNSUPPORTED, not a
failure.
Signed-off-by: Chuck Lever <cel@kernel.org>
---
nfs4.1/server41tests/st_delegation.py | 59 +++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/nfs4.1/server41tests/st_delegation.py b/nfs4.1/server41tests/st_delegation.py
index 8addde6c4fbf..198555ce9b9d 100644
--- a/nfs4.1/server41tests/st_delegation.py
+++ b/nfs4.1/server41tests/st_delegation.py
@@ -800,3 +800,62 @@ def testClaimFHAfterRecall(t, env):
if not passed:
fail(results)
print(results)
+
+def _check_deleg_stateid(sess, stateid):
+ res = sess.compound([op.test_stateid([stateid])])
+ check(res)
+ status = res.resarray[0].tsr_status_codes[0]
+ if status != NFS4_OK:
+ fail("TEST_STATEID on the delegation stateid returned %s" %
+ nfsstat4[status])
+
+def _testHolderSetattr(t, env, access, deleg_type):
+ recall = threading.Event()
+ def pre_hook(arg, env):
+ env.notify = recall.set
+ def post_hook(arg, env, res):
+ return res
+ name = env.testname(t)
+ sess1 = env.c1.new_client_session(b"%s_1" % name)
+ sess1.client.cb_pre_hook(OP_CB_RECALL, pre_hook)
+ sess1.client.cb_post_hook(OP_CB_RECALL, post_hook)
+
+ fh, stateid, deleg = __create_file_with_deleg(sess1, name, access)
+ if deleg.delegation_type != deleg_type:
+ _delegreturn(sess1, fh, deleg)
+ t.fail_support("Wanted %s, got %s" %
+ (open_delegation_type4[deleg_type], _deleg_desc(deleg)))
+
+ res = sess1.compound([op.putfh(fh),
+ op.setattr(nfs4lib.state00, {FATTR4_MODE: 0o600})])
+ recalled = recall.wait(2)
+ if recalled or res.status != NFS4_OK:
+ _delegreturn(sess1, fh, deleg)
+ if recalled:
+ fail("SETATTR by the delegation holder recalled its delegation")
+ check(res)
+ _check_deleg_stateid(sess1, deleg.stateid)
+
+ _delegreturn(sess1, fh, deleg)
+ res = close_file(sess1, fh, stateid=stateid)
+ check(res)
+
+def testWriteDelegHolderSetattr(t, env):
+ """SETATTR by the holder of a write delegation must not recall it
+
+ FLAGS: writedelegations deleg all
+ CODE: DELEG31
+ """
+ _testHolderSetattr(t, env, OPEN4_SHARE_ACCESS_BOTH |
+ OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG,
+ OPEN_DELEGATE_WRITE)
+
+def testReadDelegHolderSetattr(t, env):
+ """SETATTR by the holder of a read delegation must not recall it
+
+ FLAGS: deleg all
+ CODE: DELEG32
+ """
+ _testHolderSetattr(t, env, OPEN4_SHARE_ACCESS_READ |
+ OPEN4_SHARE_ACCESS_WANT_READ_DELEG,
+ OPEN_DELEGATE_READ)
--
2.55.0
next prev parent reply other threads:[~2026-10-08 15:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-08 15:47 [PATCH v1 0/8] Test the WANT_*_DELEG OPEN flags Chuck Lever
2026-10-08 15:47 ` [PATCH v1 1/8] pynfs: add test for OPEN(CLAIM_FH) with WANT_READ_DELEG Chuck Lever
2026-10-09 7:58 ` Substituting WANT_DELEGATION with OPEN(CLAIM_FH)? " Lionel Cons
2026-10-08 15:47 ` [PATCH v1 2/8] pynfs: add test for OPEN(CLAIM_FH) delegation request on an open file Chuck Lever
2026-10-08 15:47 ` [PATCH v1 3/8] pynfs: add test for a delegation request after a recall Chuck Lever
2026-10-08 15:47 ` Chuck Lever [this message]
2026-10-08 15:47 ` [PATCH v1 5/8] pynfs: add test for WANT_OPEN_XOR_DELEGATION through CLAIM_FH Chuck Lever
2026-10-08 15:47 ` [PATCH v1 6/8] pynfs: add test for a CLAIM_FH delegation that outlives its open Chuck Lever
2026-10-08 15:47 ` [PATCH v1 7/8] pynfs: add tests for delegation upgrade and downgrade wants Chuck Lever
2026-10-08 15:47 ` [PATCH v1 8/8] pynfs: add test for OPEN with WANT_CANCEL Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261008154729.77787-5-cel@kernel.org \
--to=cel@kernel.org \
--cc=calum.mackay@oracle.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox