NFSv4: Add support for OPEN4_RESULT_NO_OPEN_STATEID
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 17 Jun 2024 01:21:34 +0000 (21:21 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 17:47:26 +0000 (13:47 -0400)
If the server returns a delegation stateid only, then don't try to set
an open stateid.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4proc.c

index adf4fc8610f6e539f5da796686cff7209a6a7496..5b18aac0b34a5d28889219bf7a6a2511472c5603 100644 (file)
@@ -2035,8 +2035,11 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)
                                data->o_arg.claim,
                                &data->o_res.delegation);
 
-       if (!update_open_stateid(state, &data->o_res.stateid,
-                               NULL, data->o_arg.fmode))
+       if (!(data->o_res.rflags & NFS4_OPEN_RESULT_NO_OPEN_STATEID)) {
+               if (!update_open_stateid(state, &data->o_res.stateid,
+                                        NULL, data->o_arg.fmode))
+                       return ERR_PTR(-EAGAIN);
+       } else if (!update_open_stateid(state, NULL, NULL, data->o_arg.fmode))
                return ERR_PTR(-EAGAIN);
        refcount_inc(&state->count);
 
@@ -2105,8 +2108,13 @@ _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
                                data->o_arg.claim,
                                &data->o_res.delegation);
 
-       if (!update_open_stateid(state, &data->o_res.stateid,
-                               NULL, data->o_arg.fmode)) {
+       if (!(data->o_res.rflags & NFS4_OPEN_RESULT_NO_OPEN_STATEID)) {
+               if (!update_open_stateid(state, &data->o_res.stateid,
+                                        NULL, data->o_arg.fmode)) {
+                       nfs4_put_open_state(state);
+                       state = ERR_PTR(-EAGAIN);
+               }
+       } else if (!update_open_stateid(state, NULL, NULL, data->o_arg.fmode)) {
                nfs4_put_open_state(state);
                state = ERR_PTR(-EAGAIN);
        }