From: Andy Adamson <andros@xxxxxxxxxx> Use the zero stateid if nfs4_select_rw_stateid indicates a lost lock (-EIO) Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> --- fs/nfs/nfs4proc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index de8e7f5..efe940c 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2458,18 +2458,22 @@ static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, truncate = (sattr->ia_valid & ATTR_SIZE) ? true : false; fmode = truncate ? FMODE_WRITE : FMODE_READ; - if (nfs4_copy_delegation_stateid(&arg.stateid, inode, fmode)) { - /* Use that stateid */ - } else if (truncate && state != NULL && nfs4_valid_open_stateid(state)) { + if (nfs4_copy_delegation_stateid(&arg.stateid, inode, fmode)) + /* Use delegation stateid */ + goto do_call; + if (truncate && state != NULL && nfs4_valid_open_stateid(state)) { struct nfs_lockowner lockowner = { .l_owner = current->files, .l_pid = current->tgid, }; - nfs4_select_rw_stateid(&arg.stateid, state, FMODE_WRITE, - &lockowner); - } else - nfs4_stateid_copy(&arg.stateid, &zero_stateid); + /* Use zero stateid if lock is lost (-EIO fall through) */ + if (nfs4_select_rw_stateid(&arg.stateid, state, FMODE_WRITE, + &lockowner) != -EIO) + goto do_call; + } + nfs4_stateid_copy(&arg.stateid, &zero_stateid); +do_call: status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); if (status == 0 && state != NULL) renew_lease(server, timestamp); -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html