From: Benny Halevy <bhalevy@panasas.com>
To: Fred Isaman <iisaman@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 06/18] pnfs_submit: nfs4_layoutreturn_release should not reference results
Date: Thu, 11 Nov 2010 17:16:54 +0200 [thread overview]
Message-ID: <4CDC08E6.9070909@panasas.com> (raw)
In-Reply-To: <1288884151-11128-7-git-send-email-iisaman@netapp.com>
On 2010-11-04 17:22, Fred Isaman wrote:
> Since the release function may be called without sending any RPC,
> it must should not refer to any of the result fields. This is
^^^^^^
must not
> better accomplished in the rpc_done function.
>
> In the process, this basically reverts the commit
> "pnfs: do not change layout stateid when dropping layouts."
Not exactly, as the !lrp->res.valid noop case is now handled with
the same outcome, just implemented differently.
Otherwise, this patch looks good.
Benny
>
> Signed-off-by: Fred Isaman <iisaman@netapp.com>
> ---
> fs/nfs/nfs4proc.c | 17 ++++++++++++++---
> fs/nfs/nfs4xdr.c | 1 -
> fs/nfs/pnfs.c | 23 ++---------------------
> fs/nfs/pnfs.h | 3 ++-
> include/linux/nfs_xdr.h | 1 -
> 5 files changed, 18 insertions(+), 27 deletions(-)
>
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 8d3965c..de3ed2f 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -5596,9 +5596,20 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
> server = NFS_SERVER(lrp->args.inode);
> else
> server = NULL;
> - if (nfs4_async_handle_error(task, server, NULL, lrp->clp) == -EAGAIN)
> + if (nfs4_async_handle_error(task, server, NULL, lrp->clp) == -EAGAIN) {
> nfs_restart_rpc(task, lrp->clp);
> + return;
> + }
> + if ((task->tk_status == 0) && (lrp->args.return_type == RETURN_FILE)) {
> + struct pnfs_layout_hdr *lo = NFS_I(lrp->args.inode)->layout;
>
> + spin_lock(&lo->inode->i_lock);
> + if (lrp->res.lrs_present)
> + pnfs_set_layout_stateid(lo, &lrp->res.stateid);
> + else
> + pnfs_invalidate_layout_stateid(lo);
> + spin_unlock(&lo->inode->i_lock);
> + }
> dprintk("<-- %s\n", __func__);
> }
>
> @@ -5607,8 +5618,8 @@ static void nfs4_layoutreturn_release(void *calldata)
> struct nfs4_layoutreturn *lrp = calldata;
>
> dprintk("--> %s return_type %d\n", __func__, lrp->args.return_type);
> -
> - pnfs_layoutreturn_release(lrp);
> + if (lrp->args.return_type == RETURN_FILE)
> + put_layout_hdr(lrp->args.inode);
> kfree(calldata);
> dprintk("<-- %s\n", __func__);
> }
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index b71a482..10a6f4a 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -5286,7 +5286,6 @@ static int decode_layoutreturn(struct xdr_stream *xdr,
> p = xdr_inline_decode(xdr, 4);
> if (unlikely(!p))
> goto out_overflow;
> - res->valid = true;
> res->lrs_present = be32_to_cpup(p);
> if (res->lrs_present)
> status = decode_stateid(xdr, &res->stateid);
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 34f6914..44f4f30 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -449,7 +449,7 @@ pnfs_destroy_all_layouts(struct nfs_client *clp)
> *
> * lo->stateid could be the open stateid, in which case we just use what given.
> */
> -static void
> +void
> pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
> const nfs4_stateid *new)
> {
> @@ -587,25 +587,6 @@ pnfs_return_layout_barrier(struct nfs_inode *nfsi,
> return ret;
> }
>
> -void
> -pnfs_layoutreturn_release(struct nfs4_layoutreturn *lrp)
> -{
> - struct pnfs_layout_hdr *lo;
> -
> - if (lrp->args.return_type != RETURN_FILE)
> - return;
> - lo = NFS_I(lrp->args.inode)->layout;
> - spin_lock(&lrp->args.inode->i_lock);
> - if (!lrp->res.valid)
> - ; /* forgetful model internal release */
> - else if (!lrp->res.lrs_present)
> - pnfs_invalidate_layout_stateid(lo);
> - else
> - pnfs_set_layout_stateid(lo, &lrp->res.stateid);
> - put_layout_hdr_locked(lo); /* Matched in _pnfs_return_layout */
> - spin_unlock(&lrp->args.inode->i_lock);
> -}
> -
> static int
> return_layout(struct inode *ino, struct pnfs_layout_range *range,
> enum pnfs_layoutreturn_type type, struct pnfs_layout_hdr *lo,
> @@ -675,7 +656,7 @@ _pnfs_return_layout(struct inode *ino, struct pnfs_layout_range *range,
> list_for_each_entry_safe(lseg, tmp, &lo->segs, fi_list)
> if (should_free_lseg(lseg, &arg))
> mark_lseg_invalid(lseg, &tmp_list);
> - /* Reference matched in pnfs_layoutreturn_release */
> + /* Reference matched in nfs4_layoutreturn_release */
> get_layout_hdr_locked(lo);
> spin_unlock(&ino->i_lock);
> pnfs_free_lseg_list(&tmp_list);
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index de4eaa8..f0232f5 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -201,10 +201,11 @@ void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *,
> struct nfs_open_context *, struct list_head *);
> void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
> int pnfs_layout_process(struct nfs4_layoutget *lgp);
> -void pnfs_layoutreturn_release(struct nfs4_layoutreturn *lpr);
> void pnfs_destroy_layout(struct nfs_inode *);
> void pnfs_destroy_all_layouts(struct nfs_client *);
> void put_layout_hdr(struct inode *inode);
> +void pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
> + const nfs4_stateid *new);
> void pnfs_copy_layout_stateid(nfs4_stateid *dst, struct pnfs_layout_hdr *lo);
> void pnfs_get_layout_stateid(nfs4_stateid *dst, struct pnfs_layout_hdr *lo,
> struct nfs4_state *open_state);
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 0ee7cce..ebe11d3 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -270,7 +270,6 @@ struct nfs4_layoutreturn_args {
>
> struct nfs4_layoutreturn_res {
> struct nfs4_sequence_res seq_res;
> - bool valid; /* internal, true if received reply */
> u32 lrs_present;
> nfs4_stateid stateid;
> };
next prev parent reply other threads:[~2010-11-11 15:16 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-04 15:22 [PATCH 00/18] rewrite of CB_LAYOUTRECALL and layoutstate code Fred Isaman
2010-11-04 15:22 ` [PATCH 01/18] NFSv4.1: Callback share session between ops Fred Isaman
2010-11-10 13:37 ` Benny Halevy
2010-11-10 13:41 ` [PATCH] SQUASHME: pnfs-submit: fixups for nfsv4.1 callbacks Benny Halevy
2010-11-10 14:53 ` Fred Isaman
2010-11-04 15:22 ` [PATCH 02/18] pnfs-submit: change pnfs_layout_segment refcounting from kref to atomic_t Fred Isaman
2010-11-04 15:22 ` [PATCH 03/18] pnfs-submit: remove _pnfs_can_return_lseg call from pnfs_clear_lseg_list Fred Isaman
2010-11-10 14:35 ` Benny Halevy
2010-11-10 14:46 ` Fred Isaman
2010-11-11 7:00 ` Benny Halevy
2010-11-11 13:52 ` Fred Isaman
2010-11-11 14:39 ` Benny Halevy
2010-11-04 15:22 ` [PATCH 04/18] pnfs-submit: change layout state seqlock to a spinlock Fred Isaman
2010-11-11 15:00 ` Benny Halevy
2010-11-11 15:09 ` Fred Isaman
2010-11-04 15:22 ` [PATCH 05/18] pnfs-submit: layoutreturn' rpc_call_op functions need to handle bulk returns Fred Isaman
2010-11-11 15:01 ` Benny Halevy
2010-11-04 15:22 ` [PATCH 06/18] pnfs_submit: nfs4_layoutreturn_release should not reference results Fred Isaman
2010-11-11 15:16 ` Benny Halevy [this message]
2010-11-04 15:22 ` [PATCH 07/18] pnfs-submit: reorganize struct cb_layoutrecallargs Fred Isaman
2010-11-04 15:22 ` [PATCH 08/18] pnfs-submit: rename lo->state to lo->plh_flags Fred Isaman
2010-11-04 15:22 ` [PATCH 09/18] pnfs-submit: change pnfs_layout_hdr refcount to atomic_t Fred Isaman
2010-11-04 15:22 ` [PATCH 10/18] pnfs-submit: argument to should_free_lseg changed from lseg to range Fred Isaman
2010-11-04 15:22 ` [PATCH 11/18] pnfs-submit: remove unnecessary field lgp->status Fred Isaman
2010-11-04 15:22 ` [PATCH 12/18] pnfs-submit: remove RPC_ASSASSINATED(task) checks Fred Isaman
2010-11-04 15:22 ` [PATCH 13/18] pnfs-submit: rewrite of layout state handling and cb_layoutrecall Fred Isaman
2010-11-04 15:22 ` [PATCH 14/18] pnfs-submit: increase number of outstanding CB_LAYOUTRECALLS we can handle Fred Isaman
2010-11-04 15:22 ` [PATCH 15/18] pnfs-submit: roc add layoutreturn op to close compound Fred Isaman
2010-11-04 15:22 ` [PATCH 16/18] pnfs-submit refactor layoutcommit xdr structures Fred Isaman
2010-11-04 15:22 ` [PATCH 17/18] pnfs-submit refactor pnfs_layoutcommit_setup Fred Isaman
2010-11-04 15:22 ` [PATCH 18/18] pnfs_submit: roc add layoutcommit op to close compound Fred Isaman
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=4CDC08E6.9070909@panasas.com \
--to=bhalevy@panasas.com \
--cc=iisaman@netapp.com \
--cc=linux-nfs@vger.kernel.org \
/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.