On Wed, Jun 30, 2010 at 11:19 AM, Boaz Harrosh <bharrosh@xxxxxxxxxxx> wrote: > On 06/23/2010 10:21 PM, andros@xxxxxxxxxx wrote: >> From: Andy Adamson <andros@xxxxxxxxxx> >> >> Redo pnfs4_proc_layoutget() logic to match the other async operations that call >> nfs4_wait_for_completion_rpc_task. >> >> pnfs_get_layout_done passes session and delay errors. Handle them with the >> generic error handlers. >> >> Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> >> --- >> fs/nfs/nfs4proc.c | 45 +++++++++++++++++++++++++++++---------------- >> 1 files changed, 29 insertions(+), 16 deletions(-) >> >> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c >> index 35e8a56..6283996 100644 >> --- a/fs/nfs/nfs4proc.c >> +++ b/fs/nfs/nfs4proc.c >> @@ -5446,6 +5446,10 @@ static void nfs4_pnfs_layoutget_done(struct rpc_task *task, void *calldata) >> return; >> >> pnfs_get_layout_done(lgp, task->tk_status); >> + >> + if (nfs4_async_handle_error(task, server, NULL, NULL) == -EAGAIN) >> + nfs_restart_rpc(task, server->nfs_client); >> + > > Andy high. > > In pnfs_get_layout_done() it is working hard to do "lgp->status = XXX" > > I never understood, what gets to look at that later on? HI Boaz _pnfs4_proc_layoutget will return it if it is set, then send_layoutget returns it to pnfs_update_layout. -->Andy > > Thanks > Boaz > >> dprintk("<-- %s\n", __func__); >> } >> >> @@ -5471,10 +5475,9 @@ static const struct rpc_call_ops nfs4_pnfs_layoutget_call_ops = { >> * and deal with retries. >> * Currently we can't since we release lgp and its contents. >> */ >> -int pnfs4_proc_layoutget(struct nfs4_pnfs_layoutget *lgp) >> +static int _pnfs4_proc_layoutget(struct nfs4_pnfs_layoutget *lgp) >> { >> - struct inode *ino = lgp->args.inode; >> - struct nfs_server *server = NFS_SERVER(ino); >> + struct nfs_server *server = NFS_SERVER(lgp->args.inode); >> struct rpc_task *task; >> struct rpc_message msg = { >> .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PNFS_LAYOUTGET], >> @@ -5488,35 +5491,45 @@ int pnfs4_proc_layoutget(struct nfs4_pnfs_layoutget *lgp) >> .callback_data = lgp, >> .flags = RPC_TASK_ASYNC, >> }; >> - int status; >> + int status = 0; >> >> dprintk("--> %s\n", __func__); >> >> lgp->res.layout.buf = (void *)__get_free_page(GFP_NOFS); >> if (lgp->res.layout.buf == NULL) { >> nfs4_pnfs_layoutget_release(lgp); >> - status = -ENOMEM; >> - goto out; >> + return -ENOMEM; >> } >> >> lgp->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; >> task = rpc_run_task(&task_setup_data); >> - if (IS_ERR(task)) { >> - status = PTR_ERR(task); >> - goto out; >> - } >> + if (IS_ERR(task)) >> + return PTR_ERR(task); >> status = nfs4_wait_for_completion_rpc_task(task); >> - if (status == 0) { >> - status = lgp->status; >> - if (status == 0) >> - status = pnfs_layout_process(lgp); >> - } >> - rpc_put_task(task); >> + if (status != 0) >> + goto out; >> + status = lgp->status; >> + if (status != 0) >> + goto out; >> + status = pnfs_layout_process(lgp); >> out: >> + rpc_put_task(task); >> dprintk("<-- %s status=%d\n", __func__, status); >> return status; >> } >> >> +int pnfs4_proc_layoutget(struct nfs4_pnfs_layoutget *lgp) >> +{ >> + struct nfs_server *server = NFS_SERVER(lgp->args.inode); >> + struct nfs4_exception exception = { }; >> + int err; >> + do { >> + err = nfs4_handle_exception(server, _pnfs4_proc_layoutget(lgp), >> + &exception); >> + } while (exception.retry); >> + return err; >> +} >> + >> static void pnfs_layoutcommit_prepare(struct rpc_task *task, void *data) >> { >> struct pnfs_layoutcommit_data *ldata = > > -- > 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 > -- 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