pNFS: Use the standard I/O stateid when calling LAYOUTGET
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 11 Sep 2017 17:09:37 +0000 (13:09 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 12 Sep 2017 02:19:00 +0000 (22:19 -0400)
Instead of having a private method for copying the open/delegation stateid,
use the same call that is used for standard I/O through the MDS.

Note that this means we transmit the stateid with a zero seqid, avoiding
issues with NFS4ERR_OLD_STATEID.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/pnfs.c

index 7879ed8ceb76b52f1fd9b55ea90462d36554ae49..3bcd669a315237158dea7505bde6fd9f9dcfcec6 100644 (file)
@@ -1664,7 +1664,7 @@ pnfs_update_layout(struct inode *ino,
                .offset = pos,
                .length = count,
        };
-       unsigned pg_offset, seq;
+       unsigned pg_offset;
        struct nfs_server *server = NFS_SERVER(ino);
        struct nfs_client *clp = server->nfs_client;
        struct pnfs_layout_hdr *lo = NULL;
@@ -1754,10 +1754,14 @@ lookup_again:
                }
 
                first = true;
-               do {
-                       seq = read_seqbegin(&ctx->state->seqlock);
-                       nfs4_stateid_copy(&stateid, &ctx->state->stateid);
-               } while (read_seqretry(&ctx->state->seqlock, seq));
+               if (nfs4_select_rw_stateid(ctx->state,
+                                       iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
+                                       NULL, &stateid, NULL) != 0) {
+                       trace_pnfs_update_layout(ino, pos, count,
+                                       iomode, lo, lseg,
+                                       PNFS_UPDATE_LAYOUT_INVALID_OPEN);
+                       goto out_unlock;
+               }
        } else {
                nfs4_stateid_copy(&stateid, &lo->plh_stateid);
        }