From: Boaz Harrosh <bharrosh@panasas.com>
To: Jim Rees <rees@umich.edu>,
Trond Myklebust <Trond.Myklebust@netapp.com>,
Peng Tao <bergwolf@gmail.com>
Cc: <linux-nfs@vger.kernel.org>, peter honeyman <honey@citi.umich.edu>
Subject: Re: [PATCH v4 05/27] pnfs: let layoutcommit handle a list of lseg
Date: Thu, 28 Jul 2011 11:52:23 -0700 [thread overview]
Message-ID: <4E31AFE7.8010208@panasas.com> (raw)
In-Reply-To: <1311874276-1386-6-git-send-email-rees@umich.edu>
On 07/28/2011 10:30 AM, Jim Rees wrote:
> From: Peng Tao <bergwolf@gmail.com>
>
> There can be multiple lseg per file, so layoutcommit should be
> able to handle it.
>
Thanks Peng, Jim
Trond
I think this patch and the next one should be the minimal set
that I need for Stable.
Let me test Vanila 3.0 and I'll come back to you
Thanks
Boaz
> Signed-off-by: Peng Tao <peng_tao@emc.com>
> ---
> fs/nfs/nfs4proc.c | 8 +++++++-
> fs/nfs/pnfs.c | 34 +++++++++++++++++-----------------
> fs/nfs/pnfs.h | 2 ++
> include/linux/nfs_xdr.h | 2 +-
> 4 files changed, 27 insertions(+), 19 deletions(-)
>
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index ebb6f1a..af32d3d 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -5960,9 +5960,15 @@ nfs4_layoutcommit_done(struct rpc_task *task, void *calldata)
> static void nfs4_layoutcommit_release(void *calldata)
> {
> struct nfs4_layoutcommit_data *data = calldata;
> + struct pnfs_layout_segment *lseg, *tmp;
>
> /* Matched by references in pnfs_set_layoutcommit */
> - put_lseg(data->lseg);
> + list_for_each_entry_safe(lseg, tmp, &data->lseg_list, pls_lc_list) {
> + list_del_init(&lseg->pls_lc_list);
> + if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT,
> + &lseg->pls_flags))
> + put_lseg(lseg);
> + }
> put_rpccred(data->cred);
> kfree(data);
> }
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 201165e..e2c1eb4 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -235,6 +235,7 @@ static void
> init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg)
> {
> INIT_LIST_HEAD(&lseg->pls_list);
> + INIT_LIST_HEAD(&lseg->pls_lc_list);
> atomic_set(&lseg->pls_refcount, 1);
> smp_mb();
> set_bit(NFS_LSEG_VALID, &lseg->pls_flags);
> @@ -1361,16 +1362,17 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> EXPORT_SYMBOL_GPL(pnfs_generic_pg_readpages);
>
> /*
> - * Currently there is only one (whole file) write lseg.
> + * There can be multiple RW segments.
> */
> -static struct pnfs_layout_segment *pnfs_list_write_lseg(struct inode *inode)
> +static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp)
> {
> - struct pnfs_layout_segment *lseg, *rv = NULL;
> + struct pnfs_layout_segment *lseg;
>
> - list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list)
> - if (lseg->pls_range.iomode == IOMODE_RW)
> - rv = lseg;
> - return rv;
> + list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
> + if (lseg->pls_range.iomode == IOMODE_RW &&
> + test_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
> + list_add(&lseg->pls_lc_list, listp);
> + }
> }
>
> void
> @@ -1382,14 +1384,16 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata)
>
> spin_lock(&nfsi->vfs_inode.i_lock);
> if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
> - /* references matched in nfs4_layoutcommit_release */
> - get_lseg(wdata->lseg);
> + mark_as_dirty = true;
> nfsi->layout->plh_lc_cred =
> get_rpccred(wdata->args.context->state->owner->so_cred);
> - mark_as_dirty = true;
> dprintk("%s: Set layoutcommit for inode %lu ",
> __func__, wdata->inode->i_ino);
> }
> + if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &wdata->lseg->pls_flags)) {
> + /* references matched in nfs4_layoutcommit_release */
> + get_lseg(wdata->lseg);
> + }
> if (end_pos > nfsi->layout->plh_lwb)
> nfsi->layout->plh_lwb = end_pos;
> spin_unlock(&nfsi->vfs_inode.i_lock);
> @@ -1416,7 +1420,6 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
> {
> struct nfs4_layoutcommit_data *data;
> struct nfs_inode *nfsi = NFS_I(inode);
> - struct pnfs_layout_segment *lseg;
> struct rpc_cred *cred;
> loff_t end_pos;
> int status = 0;
> @@ -1434,17 +1437,15 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
> goto out;
> }
>
> + INIT_LIST_HEAD(&data->lseg_list);
> spin_lock(&inode->i_lock);
> if (!test_and_clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
> spin_unlock(&inode->i_lock);
> kfree(data);
> goto out;
> }
> - /*
> - * Currently only one (whole file) write lseg which is referenced
> - * in pnfs_set_layoutcommit and will be found.
> - */
> - lseg = pnfs_list_write_lseg(inode);
> +
> + pnfs_list_write_lseg(inode, &data->lseg_list);
>
> end_pos = nfsi->layout->plh_lwb;
> cred = nfsi->layout->plh_lc_cred;
> @@ -1456,7 +1457,6 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
> spin_unlock(&inode->i_lock);
>
> data->args.inode = inode;
> - data->lseg = lseg;
> data->cred = cred;
> nfs_fattr_init(&data->fattr);
> data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask;
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index ac86c36..bddd8b9 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -36,10 +36,12 @@
> enum {
> NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */
> NFS_LSEG_ROC, /* roc bit received from server */
> + NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */
> };
>
> struct pnfs_layout_segment {
> struct list_head pls_list;
> + struct list_head pls_lc_list;
> struct pnfs_layout_range pls_range;
> atomic_t pls_refcount;
> unsigned long pls_flags;
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index a07b682..21f333e 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -273,7 +273,7 @@ struct nfs4_layoutcommit_res {
> struct nfs4_layoutcommit_data {
> struct rpc_task task;
> struct nfs_fattr fattr;
> - struct pnfs_layout_segment *lseg;
> + struct list_head lseg_list;
> struct rpc_cred *cred;
> struct nfs4_layoutcommit_args args;
> struct nfs4_layoutcommit_res res;
next prev parent reply other threads:[~2011-07-28 18:52 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-28 17:30 [PATCH v4 00/27] add block layout driver to pnfs client Jim Rees
2011-07-28 17:30 ` [PATCH v4 01/27] pnfs: GETDEVICELIST Jim Rees
2011-07-28 17:30 ` [PATCH v4 02/27] pnfs: add set-clear layoutdriver interface Jim Rees
2011-07-28 17:30 ` [PATCH v4 03/27] pnfs: save layoutcommit lwb at layout header Jim Rees
2011-07-28 17:30 ` [PATCH v4 04/27] pnfs: save layoutcommit cred " Jim Rees
2011-07-28 17:30 ` [PATCH v4 05/27] pnfs: let layoutcommit handle a list of lseg Jim Rees
2011-07-28 18:52 ` Boaz Harrosh [this message]
2011-07-28 17:30 ` [PATCH v4 06/27] pnfs: use lwb as layoutcommit length Jim Rees
2011-07-28 17:30 ` [PATCH v4 07/27] NFS41: save layoutcommit cred in layout header init Jim Rees
2011-07-28 17:30 ` [PATCH v4 08/27] pnfs: ask for layout_blksize and save it in nfs_server Jim Rees
2011-07-28 17:30 ` [PATCH v4 09/27] pnfs: cleanup_layoutcommit Jim Rees
2011-07-28 18:26 ` Boaz Harrosh
2011-07-29 3:16 ` Jim Rees
2011-07-28 17:30 ` [PATCH v4 10/27] pnfsblock: add blocklayout Kconfig option, Makefile, and stubs Jim Rees
2011-07-28 17:31 ` [PATCH v4 11/27] pnfsblock: use pageio_ops api Jim Rees
2011-07-28 17:31 ` [PATCH v4 12/27] pnfsblock: basic extent code Jim Rees
2011-07-28 17:31 ` [PATCH v4 13/27] pnfsblock: add device operations Jim Rees
2011-07-28 17:31 ` [PATCH v4 14/27] pnfsblock: remove " Jim Rees
2011-07-28 17:31 ` [PATCH v4 15/27] pnfsblock: lseg alloc and free Jim Rees
2011-07-28 17:31 ` [PATCH v4 16/27] pnfsblock: merge extents Jim Rees
2011-07-28 17:31 ` [PATCH v4 17/27] pnfsblock: call and parse getdevicelist Jim Rees
2011-07-28 17:31 ` [PATCH v4 18/27] pnfsblock: xdr decode pnfs_block_layout4 Jim Rees
2011-07-28 17:31 ` [PATCH v4 19/27] pnfsblock: bl_find_get_extent Jim Rees
2011-07-28 17:31 ` [PATCH v4 20/27] pnfsblock: add extent manipulation functions Jim Rees
2011-07-28 17:31 ` [PATCH v4 21/27] pnfsblock: merge rw extents Jim Rees
2011-07-28 17:31 ` [PATCH v4 22/27] pnfsblock: encode_layoutcommit Jim Rees
2011-07-28 17:31 ` [PATCH v4 23/27] pnfsblock: cleanup_layoutcommit Jim Rees
2011-07-28 17:31 ` [PATCH v4 24/27] pnfsblock: bl_read_pagelist Jim Rees
2011-07-28 17:31 ` [PATCH v4 25/27] pnfsblock: bl_write_pagelist Jim Rees
2011-07-28 17:31 ` [PATCH v4 26/27] pnfsblock: note written INVAL areas for layoutcommit Jim Rees
2011-07-28 17:31 ` [PATCH v4 27/27] pnfsblock: write_pagelist handle zero invalid extents Jim Rees
2011-07-29 15:51 ` [PATCH v4 00/27] add block layout driver to pnfs client Christoph Hellwig
2011-07-29 17:45 ` Peng Tao
2011-07-29 18:44 ` Christoph Hellwig
2011-07-29 18:54 ` Jim Rees
2011-07-29 19:01 ` Christoph Hellwig
2011-07-29 19:13 ` Jim Rees
2011-07-30 1:09 ` Trond Myklebust
2011-07-30 3:26 ` Jim Rees
2011-07-30 14:25 ` Peng Tao
2011-08-01 21:10 ` Trond Myklebust
2011-08-01 22:35 ` Trond Myklebust
2011-08-01 22:57 ` Andy Adamson
2011-08-01 23:11 ` Trond Myklebust
2011-08-02 17:30 ` Trond Myklebust
2011-08-02 18:50 ` [PATCH v2 1/2] NFSv4.1: Fix the callback 'highest_used_slotid' behaviour Trond Myklebust
2011-08-02 18:50 ` [PATCH v2 2/2] NFSv4.1: Return NFS4ERR_BADSESSION to callbacks during session resets Trond Myklebust
2011-08-03 8:52 ` [PATCH v2 1/2] NFSv4.1: Fix the callback 'highest_used_slotid' behaviour Peng Tao
2011-08-02 2:21 ` [PATCH v4 00/27] add block layout driver to pnfs client Jim Rees
2011-08-02 2:29 ` Myklebust, Trond
2011-08-02 3:23 ` Jim Rees
2011-08-02 12:28 ` Trond Myklebust
2011-08-02 12:56 ` Jim Rees
2011-08-03 1:48 ` Jim Rees
2011-08-03 2:07 ` Myklebust, Trond
[not found] ` <2E1EB2CF9ED1CB4AA966F0EB76EAB4430A778AE2-hX7t0kiaRRrlMGe9HJ1VYQK/GNPrWCqfQQ4Iyu8u01E@public.gmane.org>
2011-08-03 2:11 ` Jim Rees
2011-08-03 2:38 ` Jim Rees
2011-08-03 8:43 ` Peng Tao
2011-08-03 11:49 ` Jim Rees
2011-08-03 11:53 ` Jim Rees
2011-08-03 13:59 ` Peng Tao
2011-08-03 14:11 ` Jim Rees
2011-07-30 14:18 ` Jim Rees
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E31AFE7.8010208@panasas.com \
--to=bharrosh@panasas.com \
--cc=Trond.Myklebust@netapp.com \
--cc=bergwolf@gmail.com \
--cc=honey@citi.umich.edu \
--cc=linux-nfs@vger.kernel.org \
--cc=rees@umich.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.