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: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
7402a4fedc
commit
d9aba2b40d
2 changed files with 12 additions and 5 deletions
|
@ -1064,8 +1064,7 @@ int nfs4_select_rw_stateid(struct nfs4_state *state,
|
||||||
* choose to use.
|
* choose to use.
|
||||||
*/
|
*/
|
||||||
goto out;
|
goto out;
|
||||||
nfs4_copy_open_stateid(dst, state);
|
ret = nfs4_copy_open_stateid(dst, state) ? 0 : -EAGAIN;
|
||||||
ret = 0;
|
|
||||||
out:
|
out:
|
||||||
if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
|
if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
|
||||||
dst->seqid = 0;
|
dst->seqid = 0;
|
||||||
|
|
|
@ -1915,6 +1915,7 @@ lookup_again:
|
||||||
* stateid.
|
* stateid.
|
||||||
*/
|
*/
|
||||||
if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) {
|
if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) {
|
||||||
|
int status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The first layoutget for the file. Need to serialize per
|
* The first layoutget for the file. Need to serialize per
|
||||||
|
@ -1934,13 +1935,20 @@ lookup_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
first = true;
|
first = true;
|
||||||
if (nfs4_select_rw_stateid(ctx->state,
|
status = nfs4_select_rw_stateid(ctx->state,
|
||||||
iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
|
iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
|
||||||
NULL, &stateid, NULL) != 0) {
|
NULL, &stateid, NULL);
|
||||||
|
if (status != 0) {
|
||||||
trace_pnfs_update_layout(ino, pos, count,
|
trace_pnfs_update_layout(ino, pos, count,
|
||||||
iomode, lo, lseg,
|
iomode, lo, lseg,
|
||||||
PNFS_UPDATE_LAYOUT_INVALID_OPEN);
|
PNFS_UPDATE_LAYOUT_INVALID_OPEN);
|
||||||
goto out_unlock;
|
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 {
|
} else {
|
||||||
nfs4_stateid_copy(&stateid, &lo->plh_stateid);
|
nfs4_stateid_copy(&stateid, &lo->plh_stateid);
|
||||||
|
|
Loading…
Reference in a new issue