* [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 @ 2010-06-03 16:25 andros 2010-06-03 16:25 ` [PATCH 1/4] SQUASHME pnfs-submit: cleanup layoutcommit call andros 2010-06-03 17:11 ` [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 Boaz Harrosh 0 siblings, 2 replies; 7+ messages in thread From: andros @ 2010-06-03 16:25 UTC (permalink / raw) To: bhalevy; +Cc: linux-nfs Responded to comments. This is against the pnfs-submit branch of the 2.6.34 tree. They will need to be applied against the 2.6.35-rc1 tree which I can do after comments. A cleanup, and call the async error handler. 0001-SQUASHME-pnfs-submit-cleanup-layoutcommit-call.patch 0002-SQUASHME-pnfs-submit-handle-async-layoutcommit-erro.patch These next two patches moves the pnfs_layoutcommit_inode call to nfs_write_inode, and it is the only call other than in layoutreturn. (removed calls in __nfs4_close, nfs_commit_inode, nfs_wb_sync). 0003-SQUASHME-pnfs-remove-ifdef-around-layoutcommit_neede.patch 0004-SQUASHME-pnfs-submit-move-layoutcommit-to-nfs_write.patch pnfs_layoutcommit_inode is called after nfs_commit_unstable_pages() so that if LAYOUTCOMMIT fails, the unstable pages have been processed.. The error handlers (sync and async) call nfs4_map_errors, so unhandled errors (such as NFS4ERR_BADLAYOUT) get returned to nfs_write_ioode as -EIO. We will add code to the error handlers for errors such as NFS4ERR_BADLAYOUT that require us to stop using and free the layout, and redo the I/O through the MDS. Testing: With CONFIG_NFS_V4_1 set NFSv4.1/pnfs passed Connectathon against write enabled GFS2/pNFS. Note: there were exactly the same number of LAYOUTCOMMITS sent as were sent with pnfs_layoutcommit_inode being called from __nfs4_close (never happened), nfs_commit_inode and nfs_wb_sync. V4.0 mount passes Connectathon tests With CONFIG_NFS_V4_1 not set V4.0 mount passes Connectathon tests -->Andy ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] SQUASHME pnfs-submit: cleanup layoutcommit call 2010-06-03 16:25 [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 andros @ 2010-06-03 16:25 ` andros 2010-06-03 16:25 ` [PATCH 2/4] SQUASHME pnfs-submit: handle async layoutcommit errors andros 2010-06-03 17:11 ` [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 Boaz Harrosh 1 sibling, 1 reply; 7+ messages in thread From: andros @ 2010-06-03 16:25 UTC (permalink / raw) To: bhalevy; +Cc: linux-nfs, Andy Adamson From: Andy Adamson <andros@netapp.com> pnfs_layoutcommit_inode prints its status upon exit. Signed-off-by: Andy Adamson <andros@netapp.com> --- fs/nfs/pnfs.c | 12 +++--------- 1 files changed, 3 insertions(+), 9 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 8cc4412..3e940ec 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -766,15 +766,9 @@ _pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range, !pnfs_return_layout_barrier(nfsi, &arg)); } - if (layoutcommit_needed(nfsi)) { - status = pnfs_layoutcommit_inode(ino, wait); - if (status) { - dprintk("%s: layoutcommit failed, status=%d. " - "Returning layout anyway\n", - __func__, status); - status = 0; - } - } + if (layoutcommit_needed(nfsi)) + /* Return layout even if layoutcommit fails */ + pnfs_layoutcommit_inode(ino, wait); } send_return: status = return_layout(ino, &arg, stateid, type, lo, wait); -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] SQUASHME pnfs-submit: handle async layoutcommit errors 2010-06-03 16:25 ` [PATCH 1/4] SQUASHME pnfs-submit: cleanup layoutcommit call andros @ 2010-06-03 16:25 ` andros 2010-06-03 16:25 ` [PATCH 3/4] SQUASHME pnfs remove ifdef around layoutcommit_needed andros 0 siblings, 1 reply; 7+ messages in thread From: andros @ 2010-06-03 16:25 UTC (permalink / raw) To: bhalevy; +Cc: linux-nfs, Andy Adamson From: Andy Adamson <andros@netapp.com> nfs4_async_handle_error handles session level and grace,delay errors. NOTE: Layout specific errors (NFS4ERR_BADIOMODE, NFS4ERR_BAD_LAYOUT, NFS4ERR_UNKNOWN_LAYOUTTYPE) need to be handled. Signed-off-by: Andy Adamson <andros@netapp.com> --- fs/nfs/nfs4proc.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 8b375a7..19ac602 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -5628,6 +5628,9 @@ pnfs_layoutcommit_rpc_done(struct rpc_task *task, void *calldata) pnfs_layoutcommit_done(data); nfs4_sequence_done(server, &data->res.seq_res, task->tk_status); + + if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) + nfs_restart_rpc(task, server->nfs_client); } static void pnfs_layoutcommit_release(void *lcdata) -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] SQUASHME pnfs remove ifdef around layoutcommit_needed 2010-06-03 16:25 ` [PATCH 2/4] SQUASHME pnfs-submit: handle async layoutcommit errors andros @ 2010-06-03 16:25 ` andros 2010-06-03 16:25 ` [PATCH 4/4] SQUASHME pnfs-submit: move layoutcommit to nfs_write_inode andros 0 siblings, 1 reply; 7+ messages in thread From: andros @ 2010-06-03 16:25 UTC (permalink / raw) To: bhalevy; +Cc: linux-nfs, Andy Adamson From: Andy Adamson <andros@netapp.com> Signed-off-by: Andy Adamson <andros@netapp.com> --- fs/nfs/inode.c | 2 -- include/linux/nfs4_pnfs.h | 8 ++++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index c93b756..086d46f 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -1106,7 +1106,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) !test_bit(NFS_INO_MOUNTPOINT, &nfsi->flags)) server->fsid = fattr->fsid; -#ifdef CONFIG_NFS_V4_1 /* * file needs layout commit, server attributes may be stale */ @@ -1115,7 +1114,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) __func__, inode->i_sb->s_id, inode->i_ino); return 0; } -#endif /* CONFIG_NFS_V4_1 */ /* * Update the read time so we don't revalidate too often. */ diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h index 84d2e95..c248ae9 100644 --- a/include/linux/nfs4_pnfs.h +++ b/include/linux/nfs4_pnfs.h @@ -86,6 +86,14 @@ layoutcommit_needed(struct nfs_inode *nfsi) return nfsi->lo_cred != NULL; } +#else /* CONFIG_NFS_V4_1 */ + +static inline bool +layoutcommit_needed(struct nfs_inode *nfsi) +{ + return 0; +} + #endif /* CONFIG_NFS_V4_1 */ struct pnfs_layout_segment { -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] SQUASHME pnfs-submit: move layoutcommit to nfs_write_inode 2010-06-03 16:25 ` [PATCH 3/4] SQUASHME pnfs remove ifdef around layoutcommit_needed andros @ 2010-06-03 16:25 ` andros 2010-06-08 16:01 ` Boaz Harrosh 0 siblings, 1 reply; 7+ messages in thread From: andros @ 2010-06-03 16:25 UTC (permalink / raw) To: bhalevy; +Cc: linux-nfs, Andy Adamson From: Andy Adamson <andros@netapp.com> The LAYOUTCOMMIT call indicates an update to the file meta data is needed, and should be called when clearing the I_DIRTY_SYNC state. A call to LAYOUTCOMMIT in nfs_write_inode replaces the calls in nfs_wb_all, nfs_commit_inode, and __nfs4_close. Signed-off-by: Andy Adamson <andros@netapp.com> --- fs/nfs/nfs4state.c | 2 -- fs/nfs/pnfs.h | 4 ++++ fs/nfs/write.c | 24 ++++++++++++------------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index d0dbdd4..e1207fa 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -589,8 +589,6 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state, fmode_t fm #ifdef CONFIG_NFS_V4_1 struct nfs_inode *nfsi = NFS_I(state->inode); - if (layoutcommit_needed(nfsi)) - pnfs_layoutcommit_inode(state->inode, wait); if (has_layout(nfsi) && nfsi->layout.roc_iomode) { struct nfs4_pnfs_layout_segment range; diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index c89be78..009393e 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -256,6 +256,10 @@ static inline int pnfs_use_rpc(struct nfs_server *nfss) return 1; } +static inline int pnfs_layoutcommit_inode(struct inode *inode, int sync) +{ + return 0; +} #endif /* CONFIG_NFS_V4_1 */ #endif /* FS_NFS_PNFS_H */ diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 0fd33cb..513b308 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -1489,13 +1489,6 @@ static int nfs_commit_inode(struct inode *inode, int how) wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT, nfs_wait_bit_killable, TASK_KILLABLE); -#ifdef CONFIG_NFS_V4_1 - if (may_wait && layoutcommit_needed(NFS_I(inode))) { - error = pnfs_layoutcommit_inode(inode, 1); - if (error < 0) - return error; - } -#endif /* CONFIG_NFS_V4_1 */ } else nfs_commit_clear_lock(NFS_I(inode)); out: @@ -1545,7 +1538,18 @@ static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_contr int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) { - return nfs_commit_unstable_pages(inode, wbc); + int ret; + ret = nfs_commit_unstable_pages(inode, wbc); + if (ret >= 0 && layoutcommit_needed(NFS_I(inode))) { + int err, sync = wbc->sync_mode; + + if (wbc->nonblocking || wbc->for_background) + sync = 0; + err = pnfs_layoutcommit_inode(inode, sync); + if (err < 0) + ret = err; + } + return ret; } /* @@ -1562,10 +1566,6 @@ int nfs_wb_all(struct inode *inode) }; ret = sync_inode(inode, &wbc); -#ifdef CONFIG_NFS_V4_1 - if (!ret && layoutcommit_needed(NFS_I(inode))) - ret = pnfs_layoutcommit_inode(inode, 1); -#endif return ret; } -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 4/4] SQUASHME pnfs-submit: move layoutcommit to nfs_write_inode 2010-06-03 16:25 ` [PATCH 4/4] SQUASHME pnfs-submit: move layoutcommit to nfs_write_inode andros @ 2010-06-08 16:01 ` Boaz Harrosh 0 siblings, 0 replies; 7+ messages in thread From: Boaz Harrosh @ 2010-06-08 16:01 UTC (permalink / raw) To: andros, Benny Halevy, NFS list On 06/03/2010 07:25 PM, andros@netapp.com wrote: > From: Andy Adamson <andros@netapp.com> > > The LAYOUTCOMMIT call indicates an update to the file meta data is needed, > and should be called when clearing the I_DIRTY_SYNC state. > > A call to LAYOUTCOMMIT in nfs_write_inode replaces the calls in nfs_wb_all, > nfs_commit_inode, and __nfs4_close. > > Signed-off-by: Andy Adamson <andros@netapp.com> This patch no longer applies on 2.6.35-rc2 in write.c at nfs_commit_inode. But it was easy enough to fix. (Benny tell me if you want a tree with these in) So I did a rough test "git clone linux" and cthon. It looks very good (few comments below) > --- > fs/nfs/nfs4state.c | 2 -- > fs/nfs/pnfs.h | 4 ++++ > fs/nfs/write.c | 24 ++++++++++++------------ > 3 files changed, 16 insertions(+), 14 deletions(-) > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c > index d0dbdd4..e1207fa 100644 > --- a/fs/nfs/nfs4state.c > +++ b/fs/nfs/nfs4state.c > @@ -589,8 +589,6 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state, fmode_t fm > #ifdef CONFIG_NFS_V4_1 > struct nfs_inode *nfsi = NFS_I(state->inode); > > - if (layoutcommit_needed(nfsi)) > - pnfs_layoutcommit_inode(state->inode, wait); > if (has_layout(nfsi) && nfsi->layout.roc_iomode) { > struct nfs4_pnfs_layout_segment range; > > diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h > index c89be78..009393e 100644 > --- a/fs/nfs/pnfs.h > +++ b/fs/nfs/pnfs.h > @@ -256,6 +256,10 @@ static inline int pnfs_use_rpc(struct nfs_server *nfss) > return 1; > } > > +static inline int pnfs_layoutcommit_inode(struct inode *inode, int sync) > +{ > + return 0; > +} > #endif /* CONFIG_NFS_V4_1 */ > Just for correctness this patch belongs to [patch 3/4], for it to compile independently. If they are all squashed then that does not matter. Just as a note. You might as well combine them. > #endif /* FS_NFS_PNFS_H */ > diff --git a/fs/nfs/write.c b/fs/nfs/write.c > index 0fd33cb..513b308 100644 > --- a/fs/nfs/write.c > +++ b/fs/nfs/write.c > @@ -1489,13 +1489,6 @@ static int nfs_commit_inode(struct inode *inode, int how) > wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT, > nfs_wait_bit_killable, > TASK_KILLABLE); > -#ifdef CONFIG_NFS_V4_1 > - if (may_wait && layoutcommit_needed(NFS_I(inode))) { > - error = pnfs_layoutcommit_inode(inode, 1); > - if (error < 0) > - return error; > - } > -#endif /* CONFIG_NFS_V4_1 */ > } else > nfs_commit_clear_lock(NFS_I(inode)); > out: > @@ -1545,7 +1538,18 @@ static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_contr > > int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) > { > - return nfs_commit_unstable_pages(inode, wbc); > + int ret; > + ret = nfs_commit_unstable_pages(inode, wbc); > + if (ret >= 0 && layoutcommit_needed(NFS_I(inode))) { > + int err, sync = wbc->sync_mode; > + > + if (wbc->nonblocking || wbc->for_background) > + sync = 0; > + err = pnfs_layoutcommit_inode(inode, sync); > + if (err < 0) > + ret = err; > + } > + return ret; > } > > /* > @@ -1562,10 +1566,6 @@ int nfs_wb_all(struct inode *inode) > }; > > ret = sync_inode(inode, &wbc); > -#ifdef CONFIG_NFS_V4_1 > - if (!ret && layoutcommit_needed(NFS_I(inode))) > - ret = pnfs_layoutcommit_inode(inode, 1); > -#endif > return ret; > } > Grate stuff. Boaz ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 2010-06-03 16:25 [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 andros 2010-06-03 16:25 ` [PATCH 1/4] SQUASHME pnfs-submit: cleanup layoutcommit call andros @ 2010-06-03 17:11 ` Boaz Harrosh 1 sibling, 0 replies; 7+ messages in thread From: Boaz Harrosh @ 2010-06-03 17:11 UTC (permalink / raw) To: andros; +Cc: bhalevy, linux-nfs On 06/03/2010 07:25 PM, andros@netapp.com wrote: > Responded to comments. > > This is against the pnfs-submit branch of the 2.6.34 tree. They will need to be > applied against the 2.6.35-rc1 tree which I can do after comments. > > A cleanup, and call the async error handler. > 0001-SQUASHME-pnfs-submit-cleanup-layoutcommit-call.patch > 0002-SQUASHME-pnfs-submit-handle-async-layoutcommit-erro.patch > > These next two patches moves the pnfs_layoutcommit_inode call to > nfs_write_inode, and it is the only call other than in layoutreturn. > (removed calls in __nfs4_close, nfs_commit_inode, nfs_wb_sync). > > 0003-SQUASHME-pnfs-remove-ifdef-around-layoutcommit_neede.patch > 0004-SQUASHME-pnfs-submit-move-layoutcommit-to-nfs_write.patch > > pnfs_layoutcommit_inode is called after nfs_commit_unstable_pages() so that > if LAYOUTCOMMIT fails, the unstable pages have been processed.. > > The error handlers (sync and async) call nfs4_map_errors, so unhandled > errors (such as NFS4ERR_BADLAYOUT) get returned to nfs_write_ioode as -EIO. > > We will add code to the error handlers for errors such as NFS4ERR_BADLAYOUT > that require us to stop using and free the layout, and redo the I/O through > the MDS. > > Testing: > With CONFIG_NFS_V4_1 set > NFSv4.1/pnfs passed Connectathon against write enabled GFS2/pNFS. Note: there > were exactly the same number of LAYOUTCOMMITS sent as were sent with > pnfs_layoutcommit_inode being called from __nfs4_close (never happened), > nfs_commit_inode and nfs_wb_sync. > > V4.0 mount passes Connectathon tests > > With CONFIG_NFS_V4_1 not set > > V4.0 mount passes Connectathon tests > > -->Andy > Hi Handy, I'll review this and Test on Sunday. Happy weekend. Thanks Boaz ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-06-08 16:01 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-06-03 16:25 [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 andros 2010-06-03 16:25 ` [PATCH 1/4] SQUASHME pnfs-submit: cleanup layoutcommit call andros 2010-06-03 16:25 ` [PATCH 2/4] SQUASHME pnfs-submit: handle async layoutcommit errors andros 2010-06-03 16:25 ` [PATCH 3/4] SQUASHME pnfs remove ifdef around layoutcommit_needed andros 2010-06-03 16:25 ` [PATCH 4/4] SQUASHME pnfs-submit: move layoutcommit to nfs_write_inode andros 2010-06-08 16:01 ` Boaz Harrosh 2010-06-03 17:11 ` [PATCH 0/4] pnfs-submit: cleanup layoutcommit verison 2 Boaz Harrosh
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).