From: "J. Bruce Fields" <bfields@fieldses.org>
To: Andrew Elble <aweits@rit.edu>
Cc: linux-nfs@vger.kernel.org, jlayton@kernel.org
Subject: Re: [PATCH v2] nfsd: fix error handling in nfs4_set_delegation()
Date: Fri, 11 May 2018 17:30:05 -0400 [thread overview]
Message-ID: <20180511213005.GF3765@fieldses.org> (raw)
In-Reply-To: <20180509120249.62022-1-aweits@rit.edu>
On Wed, May 09, 2018 at 08:02:49AM -0400, Andrew Elble wrote:
> I noticed a memory corruption crash in nfsd in
> 4.17-rc1. This patch corrects the issue.
>
> Fix to return error if the delegation couldn't be hashed or there was
> a recall in progress. Use the existing error path instead of
> destroy_unhashed_delegation() for readability. Set the fields of the
> delegation to indicate that it does not need to be recalled.
>
> Signed-off-by: Andrew Elble <aweits@rit.edu>
> Fixes: 353601e7d323c ("nfsd: create a separate lease for each delegation")
> ---
> v2: typo in changelog, set delegation recall-suppression
> fs/nfsd/nfs4state.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 71b87738c015..20463944cd61 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -4372,12 +4372,26 @@ static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp,
> status = -EAGAIN;
> else
> status = hash_delegation_locked(dp, fp);
> + /*
> + * This delegation is doomed, tell the recall logic
> + * that it's being destroyed here.
> + */
> +
> + if (status) {
> + dp->dl_time++;
> + list_del_init(&dp->dl_recall_lru);
> + dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
> + }
I'm trying to figure out if this fixes an actual bug. The code should
be able to deal with a callback on an already unhashed delegation, so I
think you're right it would at worst just be an unnecessary recall.
This won't catch every such case (could be that nfsd4_cb_recall_prepare
already ran and we're too late), so I wonder if this is worth it.
More interesting to me is what exactly it would take to hit this
case.... Another thread would have to have succesfully hashed a
delegation for this client and file to make our hash_delegation_locked
fail. So there would be two leases for the same file and client, but
with different delegation pointers as the fl_owner. I *think* we handle
that OK. But it was likely problematic previously when we were still
using the file pointer as the fl_owner.
--b.
> spin_unlock(&fp->fi_lock);
> spin_unlock(&state_lock);
>
> if (status)
> - destroy_unhashed_deleg(dp);
> + goto out_unlock;
> +
> return dp;
> +
> +out_unlock:
> + vfs_setlease(fp->fi_deleg_file, F_UNLCK, NULL, (void **)&dp);
> out_clnt_odstate:
> put_clnt_odstate(dp->dl_clnt_odstate);
> out_stid:
> --
> 1.8.3.1
next prev parent reply other threads:[~2018-05-11 21:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-09 12:02 [PATCH v2] nfsd: fix error handling in nfs4_set_delegation() Andrew Elble
2018-05-11 21:30 ` J. Bruce Fields [this message]
2018-05-14 11:31 ` Andrew W Elble
2018-05-14 15:45 ` J. Bruce Fields
2018-05-23 12:31 ` Andrew W Elble
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=20180511213005.GF3765@fieldses.org \
--to=bfields@fieldses.org \
--cc=aweits@rit.edu \
--cc=jlayton@kernel.org \
--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.