On Tue, Jul 07, 2020 at 09:28:05AM -0400, bfields wrote: > From: "J. Bruce Fields" <bfields@xxxxxxxxxx> > > We recently fixed lease breaking so that a client's actions won't break > its own delegations. > > But we still have an unnecessary self-conflict when granting > delegations: a client's own write opens will prevent us from handing out > a read delegation even when no other client has the file open for write. > > Fix that by turning off the checks for conflicting opens under > vfs_setlease, and instead performing those checks in the nfsd code. I'm testing this with pynfs. --b. commit f9f2b68d2f17 Author: J. Bruce Fields <bfields@xxxxxxxxxx> Date: Tue Jul 7 10:03:24 2020 -0400 DELEG22: grant delegs on write opens too Even when the client has write opens, the server can still grant delegations. (Didn't add the "all" flag since this behavior is optional. Then again, so is most delegation-granting behavior. Some day we should think about how to report optional behavior so that we can still for example identify regressions in a given implementation even when the behavior we're regressing to isn't strictly incorrect.) Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxx> diff --git a/nfs4.0/servertests/st_delegation.py b/nfs4.0/servertests/st_delegation.py index e7ebcc5a2c67..875dbc94ded1 100644 --- a/nfs4.0/servertests/st_delegation.py +++ b/nfs4.0/servertests/st_delegation.py @@ -745,3 +745,32 @@ def testServerSelfConflict(t, env): newcount = c.cb_server.opcounts[OP_CB_RECALL] if newcount > count: t.fail("Unnecessary delegation recall") + +def testServerSelfConflict2(t,env): + """DELEGATION test + + Test that we can still get a delegation even when we have the + file open for write from the same client. + + FLAGS: delegations + CODE: DELEG22 + """ + c = env.c1 + c.init_connection(b'pynfs%i_%s' % (os.getpid(), t.word()), cb_ident=0) + time.sleep(0.5) + res = c.create_file(t.word(), c.homedir+[t.word()], + access = OPEN4_SHARE_ACCESS_BOTH, + deny = OPEN4_SHARE_DENY_NONE) + check(res) + fh, stateid = c.confirm(t.word(), res) + deleg_info = res.resarray[-2].switch.switch.delegation + if deleg_info.delegation_type != OPEN_DELEGATE_NONE: + return + res = c.open_file(t.word(), c.homedir+[t.word()], + access=OPEN4_SHARE_ACCESS_BOTH, + deny = OPEN4_SHARE_DENY_NONE) + check(res) + fh, stateid = c.confirm(t.word(), res) + deleg_info = res.resarray[-2].switch.switch.delegation + if deleg_info.delegation_type == OPEN_DELEGATE_NONE: + t.fail("Could not get delegation")