Commit d9aba2b4 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Don't use the zero stateid with layoutget



The NFSv4.1 protocol explicitly forbids us from using the zero stateid
together with layoutget, so when we see that nfs4_select_rw_stateid()
is unable to return a valid delegation, lock or open stateid, then
we should initiate recovery and retry.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 7402a4fe
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1064,8 +1064,7 @@ int nfs4_select_rw_stateid(struct nfs4_state *state,
		 * choose to use.
		 */
		goto out;
	nfs4_copy_open_stateid(dst, state);
	ret = 0;
	ret = nfs4_copy_open_stateid(dst, state) ? 0 : -EAGAIN;
out:
	if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
		dst->seqid = 0;
+11 −3
Original line number Diff line number Diff line
@@ -1915,6 +1915,7 @@ lookup_again:
	 * stateid.
	 */
	if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) {
		int status;

		/*
		 * The first layoutget for the file. Need to serialize per
@@ -1934,13 +1935,20 @@ lookup_again:
		}

		first = true;
		if (nfs4_select_rw_stateid(ctx->state,
		status = nfs4_select_rw_stateid(ctx->state,
					iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
					NULL, &stateid, NULL) != 0) {
					NULL, &stateid, NULL);
		if (status != 0) {
			trace_pnfs_update_layout(ino, pos, count,
					iomode, lo, lseg,
					PNFS_UPDATE_LAYOUT_INVALID_OPEN);
			if (status != -EAGAIN)
				goto out_unlock;
			spin_unlock(&ino->i_lock);
			nfs4_schedule_stateid_recovery(server, ctx->state);
			pnfs_clear_first_layoutget(lo);
			pnfs_put_layout_hdr(lo);
			goto lookup_again;
		}
	} else {
		nfs4_stateid_copy(&stateid, &lo->plh_stateid);