]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/nfs/nfs4proc.c
NFSv4: Handle NFS4ERR_DELAY and NFS4ERR_GRACE in nfs4_open_delegation_recall
[karo-tx-linux.git] / fs / nfs / nfs4proc.c
index 26431cf62ddbc393fd5fe1e432742be37d06e12e..c7856a1cef0698fa40e1643737bb8964aa4eaf6f 100644 (file)
@@ -1046,6 +1046,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
                /* Save the delegation */
                nfs4_stateid_copy(&stateid, &delegation->stateid);
                rcu_read_unlock();
+               nfs_release_seqid(opendata->o_arg.seqid);
                ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
                if (ret != 0)
                        goto out;
@@ -1379,6 +1380,12 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state
                        case -ENOMEM:
                                err = 0;
                                goto out;
+                       case -NFS4ERR_DELAY:
+                       case -NFS4ERR_GRACE:
+                               set_bit(NFS_DELEGATED_STATE, &state->flags);
+                               ssleep(1);
+                               err = -EAGAIN;
+                               goto out;
                }
                set_bit(NFS_DELEGATED_STATE, &state->flags);
                err = nfs4_handle_exception(server, err, &exception);
@@ -5024,6 +5031,12 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
                                nfs4_schedule_stateid_recovery(server, state);
                                err = 0;
                                goto out;
+                       case -NFS4ERR_DELAY:
+                       case -NFS4ERR_GRACE:
+                               set_bit(NFS_DELEGATED_STATE, &state->flags);
+                               ssleep(1);
+                               err = -EAGAIN;
+                               goto out;
                        case -ENOMEM:
                        case -NFS4ERR_DENIED:
                                /* kill_proc(fl->fl_pid, SIGLOST, 1); */