Do to a bug in generic client: Return of NFS_FILE_SYNC from write_done will render the system useless. When returning NFS_UNSTABLE the generic layer then returns with a call to objlayout_commit. At the outpost a successful nfs_commit_complete() should be called and PNFS_ATTEMPTED returned. Since nfs_commit_complete cannot be called from within objlayout_commit. It is scheduled on an rpc task to be called asynchronously. TODO: All this is good code, actually needed and missing from obio_osd. What's missing is the actual call to osd_flush() and the completion call on request return. Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx> --- fs/nfs/objlayout/objio_osd.c | 2 +- fs/nfs/objlayout/objlayout.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c index 315f8c6..4e266a2 100644 --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c @@ -852,7 +852,7 @@ static ssize_t _write_done(struct objio_state *ios) if (likely(!ret)) { /* FIXME: should be based on the OSD's persistence model * See OSD2r05 Section 4.13 Data persistence model */ - ios->ol_state.committed = NFS_FILE_SYNC; + ios->ol_state.committed = NFS_UNSTABLE; //NFS_FILE_SYNC; status = ios->length; } else { status = ret; diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c index 880d987..60f64b7 100644 --- a/fs/nfs/objlayout/objlayout.c +++ b/fs/nfs/objlayout/objlayout.c @@ -287,15 +287,30 @@ objlayout_io_set_result(struct objlayout_io_state *state, unsigned index, } } +static void _rpc_commit_complete(struct work_struct *work) +{ + struct rpc_task *task; + struct nfs_write_data *wdata; + + dprintk("%s enter\n", __func__); + task = container_of(work, struct rpc_task, u.tk_work); + wdata = container_of(task, struct nfs_write_data, task); + + pnfs_client_ops->nfs_commit_complete(wdata); +} + /* * Commit data remotely on OSDs */ enum pnfs_try_status objlayout_commit(struct pnfs_layout_type *pnfslay, int sync, - struct nfs_write_data *data) + struct nfs_write_data *wdata) { int status = PNFS_ATTEMPTED; + + INIT_WORK(&wdata->task.u.tk_work, _rpc_commit_complete); + schedule_work(&wdata->task.u.tk_work); dprintk("%s: Return %d\n", __func__, status); return status; } -- 1.6.6.1 -- 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