aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs3proc.c
diff options
context:
space:
mode:
authorChuck Lever <cel@netapp.com>2006-03-20 13:44:14 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-03-20 13:44:14 -0500
commit006ea73e5fa82915d0ac7a3f15ee7c688433236d (patch)
tree0f522982fe3d01a74f1ad9f5f713cbd10a6b09bd /fs/nfs/nfs3proc.c
parent91d5b47023b608227d605d1e916b29dd0215bff7 (diff)
NFS: add hooks to account for NFSERR_JUKEBOX errors
Make an inode or an nfs_server struct available in the logic that handles JUKEBOX/DELAY type errors so the NFS client can account for them. This patch is split out from the main nfs iostat patch to highlight minor architectural changes required to support this statistic. Test plan: None. Signed-off-by: Chuck Lever <cel@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs3proc.c')
-rw-r--r--fs/nfs/nfs3proc.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index ed67567f0556..7204ba5b2bf8 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -19,6 +19,8 @@
19#include <linux/smp_lock.h> 19#include <linux/smp_lock.h>
20#include <linux/nfs_mount.h> 20#include <linux/nfs_mount.h>
21 21
22#include "iostat.h"
23
22#define NFSDBG_FACILITY NFSDBG_PROC 24#define NFSDBG_FACILITY NFSDBG_PROC
23 25
24extern struct rpc_procinfo nfs3_procedures[]; 26extern struct rpc_procinfo nfs3_procedures[];
@@ -58,10 +60,11 @@ nfs3_rpc_call_wrapper(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, i
58 nfs3_rpc_wrapper(clnt, msg, flags) 60 nfs3_rpc_wrapper(clnt, msg, flags)
59 61
60static int 62static int
61nfs3_async_handle_jukebox(struct rpc_task *task) 63nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode)
62{ 64{
63 if (task->tk_status != -EJUKEBOX) 65 if (task->tk_status != -EJUKEBOX)
64 return 0; 66 return 0;
67 nfs_inc_stats(inode, NFSIOS_DELAY);
65 task->tk_status = 0; 68 task->tk_status = 0;
66 rpc_restart_call(task); 69 rpc_restart_call(task);
67 rpc_delay(task, NFS_JUKEBOX_RETRY_TIME); 70 rpc_delay(task, NFS_JUKEBOX_RETRY_TIME);
@@ -447,7 +450,7 @@ nfs3_proc_unlink_done(struct dentry *dir, struct rpc_task *task)
447 struct rpc_message *msg = &task->tk_msg; 450 struct rpc_message *msg = &task->tk_msg;
448 struct nfs_fattr *dir_attr; 451 struct nfs_fattr *dir_attr;
449 452
450 if (nfs3_async_handle_jukebox(task)) 453 if (nfs3_async_handle_jukebox(task, dir->d_inode))
451 return 1; 454 return 1;
452 if (msg->rpc_argp) { 455 if (msg->rpc_argp) {
453 dir_attr = (struct nfs_fattr*)msg->rpc_resp; 456 dir_attr = (struct nfs_fattr*)msg->rpc_resp;
@@ -748,7 +751,7 @@ static void nfs3_read_done(struct rpc_task *task, void *calldata)
748{ 751{
749 struct nfs_read_data *data = calldata; 752 struct nfs_read_data *data = calldata;
750 753
751 if (nfs3_async_handle_jukebox(task)) 754 if (nfs3_async_handle_jukebox(task, data->inode))
752 return; 755 return;
753 /* Call back common NFS readpage processing */ 756 /* Call back common NFS readpage processing */
754 if (task->tk_status >= 0) 757 if (task->tk_status >= 0)
@@ -786,7 +789,7 @@ static void nfs3_write_done(struct rpc_task *task, void *calldata)
786{ 789{
787 struct nfs_write_data *data = calldata; 790 struct nfs_write_data *data = calldata;
788 791
789 if (nfs3_async_handle_jukebox(task)) 792 if (nfs3_async_handle_jukebox(task, data->inode))
790 return; 793 return;
791 if (task->tk_status >= 0) 794 if (task->tk_status >= 0)
792 nfs_post_op_update_inode(data->inode, data->res.fattr); 795 nfs_post_op_update_inode(data->inode, data->res.fattr);
@@ -833,7 +836,7 @@ static void nfs3_commit_done(struct rpc_task *task, void *calldata)
833{ 836{
834 struct nfs_write_data *data = calldata; 837 struct nfs_write_data *data = calldata;
835 838
836 if (nfs3_async_handle_jukebox(task)) 839 if (nfs3_async_handle_jukebox(task, data->inode))
837 return; 840 return;
838 if (task->tk_status >= 0) 841 if (task->tk_status >= 0)
839 nfs_post_op_update_inode(data->inode, data->res.fattr); 842 nfs_post_op_update_inode(data->inode, data->res.fattr);