From e9aabb545faa218b8555422c7a296e393db22f24 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Wed, 7 Mar 2012 16:39:06 -0500 Subject: [PATCH] --- yaml --- r: 294543 b: refs/heads/master c: 3114ea7a24d3264c090556a2444fc6d2c06176d4 h: refs/heads/master i: 294541: b0dd72ab689103fbad5fb25f19eb92203a306886 294539: de1b5566880a812f7f070528c081dddacbb6768b 294535: b25aa275c1b413a5ac21405eab22c93c2cdb1a2e 294527: b468bf97d9f900a23098d0b24a717daf1c4f9fbf v: v3 --- [refs] | 2 +- trunk/fs/nfs/nfs4_fs.h | 1 + trunk/fs/nfs/nfs4proc.c | 13 ++++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index f085c684a8b9..974259b8d4c9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cf470c3e004efe16d73dc8ba9b29bdc9a5327cda +refs/heads/master: 3114ea7a24d3264c090556a2444fc6d2c06176d4 diff --git a/trunk/fs/nfs/nfs4_fs.h b/trunk/fs/nfs/nfs4_fs.h index 026878cb2698..d1989e3f23c3 100644 --- a/trunk/fs/nfs/nfs4_fs.h +++ b/trunk/fs/nfs/nfs4_fs.h @@ -182,6 +182,7 @@ struct nfs4_exception { long timeout; int retry; struct nfs4_state *state; + struct inode *inode; }; struct nfs4_state_recovery_ops { diff --git a/trunk/fs/nfs/nfs4proc.c b/trunk/fs/nfs/nfs4proc.c index 32e0d08a9771..a8dd04db764f 100644 --- a/trunk/fs/nfs/nfs4proc.c +++ b/trunk/fs/nfs/nfs4proc.c @@ -262,18 +262,28 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc { struct nfs_client *clp = server->nfs_client; struct nfs4_state *state = exception->state; + struct inode *inode = exception->inode; int ret = errorcode; exception->retry = 0; switch(errorcode) { case 0: return 0; + case -NFS4ERR_OPENMODE: + if (nfs_have_delegation(inode, FMODE_READ)) { + nfs_inode_return_delegation(inode); + exception->retry = 1; + return 0; + } + if (state == NULL) + break; + nfs4_schedule_stateid_recovery(server, state); + goto wait_on_recovery; case -NFS4ERR_DELEG_REVOKED: case -NFS4ERR_ADMIN_REVOKED: case -NFS4ERR_BAD_STATEID: if (state != NULL) nfs_remove_bad_delegation(state->inode); - case -NFS4ERR_OPENMODE: if (state == NULL) break; nfs4_schedule_stateid_recovery(server, state); @@ -1939,6 +1949,7 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, struct nfs_server *server = NFS_SERVER(inode); struct nfs4_exception exception = { .state = state, + .inode = inode, }; int err; do {