From: Andy Adamson <andros@xxxxxxxxxx> Prepare for adding the layoutcommit operation to the close compound on return-on-close. Have pnfs_layoutcommit_setup handle all the layoutcommit operation setup. Have pnfs_layoutcommit_inode handle all the layoutcommit compound setup. Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> Signed-off-by: Fred Isaman <iisaman@xxxxxxxxxx> --- fs/nfs/pnfs.c | 104 ++++++++++++++++++++++++++------------------------------- fs/nfs/pnfs.h | 3 ++ 2 files changed, 50 insertions(+), 57 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 0d5d95c..521ee9d 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -1252,97 +1252,87 @@ pnfs_try_to_commit(struct nfs_write_data *data, } /* - * Set up the argument/result storage required for the RPC call. + * Set up the arguments required for the RPC call. */ -static int +void pnfs_layoutcommit_setup(struct inode *inode, - struct nfs4_layoutcommit_data *data, - loff_t write_begin_pos, loff_t write_end_pos) + struct nfs4_layoutcommit_op_args *args, bool use_cred) { - struct nfs_server *nfss = NFS_SERVER(inode); - int result = 0; + struct nfs_inode *nfsi = NFS_I(inode); + loff_t write_begin_pos, write_end_pos; dprintk("--> %s\n", __func__); - data->inode = inode; - data->args.fh = NFS_FH(inode); - data->args.op.layout_type = nfss->pnfs_curr_ld->id; - data->res.fattr = &data->fattr; - nfs_fattr_init(&data->fattr); + assert_spin_locked(&inode->i_lock); - /* Set values from inode so it can be reset + /* + * Clear layoutcommit properties in the inode so + * new layoutcommit info can be generated */ - data->args.op.range.iomode = IOMODE_RW; - data->args.op.range.offset = write_begin_pos; - data->args.op.range.length = write_end_pos - write_begin_pos + 1; - data->args.op.lastbytewritten = min(write_end_pos, - i_size_read(inode) - 1); - data->args.bitmask = nfss->attr_bitmask; - data->res.server = nfss; - - dprintk("<-- %s Status %d\n", __func__, result); - return result; + write_begin_pos = nfsi->layout->write_begin_pos; + write_end_pos = nfsi->layout->write_end_pos; + nfsi->layout->write_begin_pos = 0; + nfsi->layout->write_end_pos = 0; + /* In the true case, caller has passed on the cred to another struct */ + if (use_cred == false) + put_rpccred(nfsi->layout->cred); + nfsi->layout->cred = NULL; + __clear_bit(NFS_LAYOUT_NEED_LCOMMIT, &nfsi->layout->plh_flags); + /* FIXME: figure out what to do here */ + pnfs_copy_layout_stateid(&args->stateid, nfsi->layout); + + args->layout_type = NFS_SERVER(inode)->pnfs_curr_ld->id; + + args->range.iomode = IOMODE_RW; + args->range.offset = write_begin_pos; + args->range.length = write_end_pos - write_begin_pos + 1; + args->lastbytewritten = min(write_end_pos, i_size_read(inode) - 1); } -/* Issue a async layoutcommit for an inode. +/* + * Issue a async layoutcommit for an inode. + * Returns 0 on success, negative value for error */ int pnfs_layoutcommit_inode(struct inode *inode, int sync) { struct nfs4_layoutcommit_data *data; - struct nfs_inode *nfsi = NFS_I(inode); - loff_t write_begin_pos; - loff_t write_end_pos; - - int status = 0; + int status = -ENOMEM; dprintk("%s Begin (sync:%d)\n", __func__, sync); - BUG_ON(!has_layout(nfsi)); - data = kzalloc(sizeof(*data), GFP_NOFS); if (!data) - return -ENOMEM; + goto out; + status = 0; spin_lock(&inode->i_lock); - if (!layoutcommit_needed(nfsi)) { + if (!layoutcommit_needed(NFS_I(inode))) { spin_unlock(&inode->i_lock); - goto out_free; + kfree(data); + goto out; } + /* Use the layoutcommit cred */ + data->args.cred = NFS_I(inode)->layout->cred; - /* Clear layoutcommit properties in the inode so - * new lc info can be generated - */ - write_begin_pos = nfsi->layout->write_begin_pos; - write_end_pos = nfsi->layout->write_end_pos; - data->args.cred = nfsi->layout->cred; - nfsi->layout->write_begin_pos = 0; - nfsi->layout->write_end_pos = 0; - nfsi->layout->cred = NULL; - __clear_bit(NFS_LAYOUT_NEED_LCOMMIT, &nfsi->layout->plh_flags); - pnfs_copy_layout_stateid(&data->args.op.stateid, nfsi->layout); + /* Set up layoutcommit operation args */ + pnfs_layoutcommit_setup(inode, &data->args.op, true); /* Reference for layoutcommit matched in pnfs_layoutcommit_release */ get_layout_hdr(NFS_I(inode)->layout); - spin_unlock(&inode->i_lock); - /* Set up layout commit args */ - status = pnfs_layoutcommit_setup(inode, data, write_begin_pos, - write_end_pos); - if (status) { - /* The layout driver failed to setup the layoutcommit */ - put_rpccred(data->args.cred); - put_layout_hdr(inode); - goto out_free; - } + data->args.fh = NFS_FH(inode); + data->args.bitmask = NFS_SERVER(inode)->attr_bitmask; + + data->inode = inode; + data->res.server = NFS_SERVER(inode); + data->res.fattr = &data->fattr; + nfs_fattr_init(&data->fattr); status = nfs4_proc_layoutcommit(data, sync); out: dprintk("%s end (err:%d)\n", __func__, status); return status; -out_free: - kfree(data); - goto out; } /* diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 3e04da8..a244b27 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -236,6 +236,9 @@ void nfs4_asynch_forget_layouts(struct pnfs_layout_hdr *lo, int notify_bit, atomic_t *notify_count, struct list_head *tmp_list); bool pnfs_roc(struct nfs4_closedata *data); +void pnfs_layoutcommit_setup(struct inode *inode, + struct nfs4_layoutcommit_op_args *args, + bool use_cred); static inline bool has_layout(struct nfs_inode *nfsi) -- 1.7.2.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