Linux NFS development
 help / color / mirror / Atom feed
* [PATCH 1/1] NFSv4: can_open_cached needs to be called with so_lock
@ 2021-04-30  5:09 Dai Ngo
  2021-04-30 12:42 ` Trond Myklebust
  0 siblings, 1 reply; 6+ messages in thread
From: Dai Ngo @ 2021-04-30  5:09 UTC (permalink / raw)
  To: trondmy; +Cc: linux-nfs

Currently can_open_cached accesses the openstate's flags without the
so_lock and also does not update the flags of the cached state. This
results in the openstate's flags be out of sync which can cause the
file to be closed prematurely.

This patch adds the missing so_lock around the call to can_open_cached
and also updates the openstate's flags if the cached openstate is used.

Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
---
 fs/nfs/nfs4proc.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index c65c4b41e2c1..2464e77c51f9 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2410,9 +2410,15 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
 	if (data->state != NULL) {
 		struct nfs_delegation *delegation;
 
+		spin_lock(&data->state->owner->so_lock);
 		if (can_open_cached(data->state, data->o_arg.fmode,
-					data->o_arg.open_flags, claim))
+				data->o_arg.open_flags, claim)) {
+			update_open_stateflags(data->state, data->o_arg.fmode);
+			spin_unlock(&data->state->owner->so_lock);
 			goto out_no_action;
+		}
+		spin_unlock(&data->state->owner->so_lock);
+
 		rcu_read_lock();
 		delegation = nfs4_get_valid_delegation(data->state->inode);
 		if (can_open_delegated(delegation, data->o_arg.fmode, claim))
-- 
2.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-04-30 19:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-30  5:09 [PATCH 1/1] NFSv4: can_open_cached needs to be called with so_lock Dai Ngo
2021-04-30 12:42 ` Trond Myklebust
2021-04-30 16:19   ` dai.ngo
2021-04-30 17:24   ` dai.ngo
2021-04-30 17:56     ` Trond Myklebust
2021-04-30 19:10       ` dai.ngo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox