aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2009-06-17 16:22:58 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2009-06-17 16:22:58 -0400
commitd5122201a7f90b2aa73092f158b84d1d74f1134d (patch)
tree7d2c55cd74dd31b5977861d0bc71b31424dc68ed /fs
parent01c3f05228ce7fc19baa103e4e4bf6c1b5062a53 (diff)
NFSv4: Move error handling out of the delegation generic code
The NFSv4 delegation recovery code is required by the protocol to handle more errors. Rather than add NFSv4.0 specific errors into 'generic' delegation code, we should move the error handling into the NFSv4 layer. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/delegation.c18
-rw-r--r--fs/nfs/nfs4proc.c15
2 files changed, 16 insertions, 17 deletions
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index 968225a88015..d4f669f0683e 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -68,7 +68,7 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
68{ 68{
69 struct inode *inode = state->inode; 69 struct inode *inode = state->inode;
70 struct file_lock *fl; 70 struct file_lock *fl;
71 int status; 71 int status = 0;
72 72
73 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { 73 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
74 if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK))) 74 if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK)))
@@ -76,21 +76,9 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
76 if (nfs_file_open_context(fl->fl_file) != ctx) 76 if (nfs_file_open_context(fl->fl_file) != ctx)
77 continue; 77 continue;
78 status = nfs4_lock_delegation_recall(state, fl); 78 status = nfs4_lock_delegation_recall(state, fl);
79 if (status >= 0) 79 if (status < 0)
80 continue; 80 break;
81 switch (status) {
82 default:
83 printk(KERN_ERR "%s: unhandled error %d.\n",
84 __func__, status);
85 case -NFS4ERR_EXPIRED:
86 /* kill_proc(fl->fl_pid, SIGLOST, 1); */
87 case -NFS4ERR_STALE_CLIENTID:
88 nfs4_schedule_state_recovery(NFS_SERVER(inode)->nfs_client);
89 goto out_err;
90 }
91 } 81 }
92 return 0;
93out_err:
94 return status; 82 return status;
95} 83}
96 84
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 4674f8092da8..d326193c9785 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -3630,8 +3630,19 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
3630 goto out; 3630 goto out;
3631 do { 3631 do {
3632 err = _nfs4_do_setlk(state, F_SETLK, fl, 0); 3632 err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
3633 if (err != -NFS4ERR_DELAY) 3633 switch (err) {
3634 break; 3634 default:
3635 printk(KERN_ERR "%s: unhandled error %d.\n",
3636 __func__, err);
3637 case 0:
3638 goto out;
3639 case -NFS4ERR_EXPIRED:
3640 case -NFS4ERR_STALE_CLIENTID:
3641 nfs4_schedule_state_recovery(server->nfs_client);
3642 goto out;
3643 case -NFS4ERR_DELAY:
3644 break;
3645 }
3635 err = nfs4_handle_exception(server, err, &exception); 3646 err = nfs4_handle_exception(server, err, &exception);
3636 } while (exception.retry); 3647 } while (exception.retry);
3637out: 3648out: