From: Kinglong Mee <kinglongmee@gmail.com>
To: Jeff Layton <jlayton@poochiereds.net>
Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, kinglongmee@gmail.com
Subject: Re: [PATCH v2 16/18] nfsd: add a fh_compose_shallow
Date: Sat, 8 Aug 2015 08:27:47 +0800 [thread overview]
Message-ID: <55C54D03.2050908@gmail.com> (raw)
In-Reply-To: <20150807142457.49d60500@synchrony.poochiereds.net>
On 8/8/2015 02:24, Jeff Layton wrote:
> On Fri, 7 Aug 2015 13:56:10 -0400
> Jeff Layton <jlayton@poochiereds.net> wrote:
>
>> On Fri, 7 Aug 2015 23:33:58 +0800
>> Kinglong Mee <kinglongmee@gmail.com> wrote:
>>
>>> On 8/6/2015 05:13, Jeff Layton wrote:
>>>> In a later patch, we'll need to be able to cook up a knfsd_fh from a
>>>> dentry/export combo. Usually nfsd works with svc_fh's, but that takes
>>>> a lot of extra baggage that we don't really need here.
>>>>
>>>> Add a routine that encodes the filehandle directly into a knfsd_fh
>>>> instead. Much like we have a fh_copy_shallow, the new routine is called
>>>> fh_compose_shallow.
>>>>
>>>> Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
>>>> ---
>>>> fs/nfsd/nfsfh.c | 112 +++++++++++++++++++++++++++++---------------------------
>>>> fs/nfsd/nfsfh.h | 2 +
>>>> 2 files changed, 60 insertions(+), 54 deletions(-)
>>>>
>>>> diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
>>>> index b601f291d825..ee6d4b746467 100644
>>>> --- a/fs/nfsd/nfsfh.c
>>>> +++ b/fs/nfsd/nfsfh.c
>>>> @@ -511,32 +511,64 @@ retry:
>>>> }
>>>>
>>>> __be32
>>>> -fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
>>>> - struct svc_fh *ref_fh)
>>>> +fh_compose_shallow(struct knfsd_fh *kfh, int maxsize, struct svc_export *exp,
>>>> + struct dentry *dentry, struct svc_fh *ref_fh)
>>>> {
>>>> - /* ref_fh is a reference file handle.
>>>> - * if it is non-null and for the same filesystem, then we should compose
>>>> - * a filehandle which is of the same version, where possible.
>>>> - * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca
>>>> - * Then create a 32byte filehandle using nfs_fhbase_old
>>>> - *
>>>> - */
>>>> + struct inode *inode = d_inode(dentry);
>>>> + dev_t ex_dev = exp_sb(exp)->s_dev;
>>>>
>>>> - struct inode * inode = d_inode(dentry);
>>>> - dev_t ex_dev = exp_sb(exp)->s_dev;
>>>> -
>>>> - dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %pd2, ino=%ld)\n",
>>>> - MAJOR(ex_dev), MINOR(ex_dev),
>>>> + dprintk("nfsd: %s(exp %02x:%02x/%ld %pd2, ino=%ld)\n",
>>>> + __func__, MAJOR(ex_dev), MINOR(ex_dev),
>>>> (long) d_inode(exp->ex_path.dentry)->i_ino,
>>>> - dentry,
>>>> - (inode ? inode->i_ino : 0));
>>>> + dentry, (inode ? inode->i_ino : 0));
>>>>
>>>> - /* Choose filehandle version and fsid type based on
>>>> - * the reference filehandle (if it is in the same export)
>>>> - * or the export options.
>>>> + /*
>>>> + * Choose filehandle version and fsid type based on the reference
>>>> + * filehandle (if it is in the same export) or the export options.
>>>> */
>>>> - set_version_and_fsid_type(&fhp->fh_handle, fhp->fh_maxsize,
>>>> - exp, ref_fh);
>>>> + set_version_and_fsid_type(kfh, maxsize, exp, ref_fh);
>>>> + if (kfh->fh_version == 0xca) {
>>>> + /* old style filehandle please */
>>>> + memset(&kfh->fh_base, 0, NFS_FHSIZE);
>>>> + kfh->fh_size = NFS_FHSIZE;
>>>> + kfh->ofh_dcookie = 0xfeebbaca;
>>>> + kfh->ofh_dev = old_encode_dev(ex_dev);
>>>> + kfh->ofh_xdev = kfh->ofh_dev;
>>>> + kfh->ofh_xino =
>>>> + ino_t_to_u32(d_inode(exp->ex_path.dentry)->i_ino);
>>>> + kfh->ofh_dirino = ino_t_to_u32(parent_ino(dentry));
>>>> + if (inode)
>>>> + _fh_update_old(dentry, exp, kfh);
>>>> + } else {
>>>> + kfh->fh_size = key_len(kfh->fh_fsid_type) + 4;
>>>> + kfh->fh_auth_type = 0;
>>>> +
>>>> + mk_fsid(kfh->fh_fsid_type, kfh->fh_fsid, ex_dev,
>>>> + d_inode(exp->ex_path.dentry)->i_ino,
>>>> + exp->ex_fsid, exp->ex_uuid);
>>>> +
>>>> + if (inode)
>>>> + _fh_update(kfh, maxsize, exp, dentry);
>>>> +
>>>> + if (kfh->fh_fileid_type == FILEID_INVALID)
>>>> + return nfserr_opnotsupp;
>>>> + }
>>>> + return nfs_ok;
>>>> +}
>>>> +
>>>> +/*
>>>> + * ref_fh is a reference file handle.
>>>> + * if it is non-null and for the same filesystem, then we should compose
>>>> + * a filehandle which is of the same version, where possible.
>>>> + * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca
>>>> + * Then create a 32byte filehandle using nfs_fhbase_old
>>>> + *
>>>> + */
>>>> +__be32
>>>> +fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
>>>> + struct svc_fh *ref_fh)
>>>> +{
>>>> + __be32 status;
>>>>
>>>> if (ref_fh == fhp)
>>>> fh_put(ref_fh);
>>>
>>> set_version_and_fsid_type will use fh_dentry in ref_fh,
>>> So it *must* be used with a valid ref_fh.
>>>
>>> With this patch, fh_put(ref_fh) will put fh_dentry and set to NULL!!!
>>>
>>> Also, pynfs4.1's LKPP1d failed as,
>>> LKPP1d st_lookupp.testLookupp : FAILURE
>>> LOOKUPP returned
>>> '\x01\x00\x07\x00\x02\x00\x00\x00\x00\x00\x00\x004\x93\x1f\x04L*C\x9b\x95L]\x83\x0f\xa4\xbe\x8c',
>>> expected '\x01\x00\x01\x00\x00\x00\x00\x00'
>>>
>>> Move set_version_and_fsid_type back, before fh_put(ref_fh).
>>>
>>> thanks,
>>> Kinglong Mee
>>>
>>
>> Ahh ok, it took me a minute but I see what you're saying now. Yes, this
>> is broken. I'll fix it, but I'm yet convinced that that is the best way.
>>
>> Thanks,
>> Jeff
>>
>
> Ok, I think this may be a better fix. I'll roll this into the original
> patch before I send the next respin, but wanted to send it along first
> to see whether you see any issue with it
>
> The idea here is to instead encode the filehandle first, and only do
> the fh_put for the ref_fh and take dentry/export references if that
> succeeds.
Must make sure the order as following,
set_version_and_fsid_type(fhp, exp, ref_fh);
if (ref_fh == fhp)
fh_put(ref_fh);
fhp->fh_dentry = dget(dentry); /* our internal copy */
fhp->fh_export = exp_get(exp);
>
> Does that look like a reasonable fix to you, or am I missing something?
> I'll also make sure I run pynfs against this before I submit the next
> iteration of the series.
I will look forward to it.
thanks,
Kinglong Mee
next prev parent reply other threads:[~2015-08-08 0:28 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-30 13:52 [PATCH 0/9] nfsd: open file caching for v2/3 Jeff Layton
2015-07-30 13:52 ` [PATCH] nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid Jeff Layton
2015-07-30 13:53 ` Jeff Layton
2015-07-30 15:51 ` Christoph Hellwig
2015-07-30 16:20 ` Jeff Layton
2015-07-30 16:34 ` Christoph Hellwig
2015-07-30 13:52 ` [PATCH 1/9] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-07-30 13:52 ` [PATCH 2/9] nfsd: move some file caching helpers to a common header Jeff Layton
2015-07-30 13:52 ` [PATCH 3/9] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-07-31 21:32 ` J. Bruce Fields
2015-07-31 22:27 ` Jeff Layton
2015-07-30 13:52 ` [PATCH 4/9] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-07-30 13:52 ` [PATCH 5/9] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-07-30 13:52 ` [PATCH 6/9] nfsd: hook up nfsd_read to the " Jeff Layton
2015-07-30 13:52 ` [PATCH 7/9] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-07-30 13:52 ` [PATCH 8/9] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-07-30 13:52 ` [PATCH 9/9] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13 ` [PATCH v2 00/18] nfsd: open file caching for v2/3 Jeff Layton
2015-08-05 21:13 ` [PATCH v2 01/18] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-08-09 7:12 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 02/18] nfsd: move some file caching helpers to a common header Jeff Layton
2015-08-07 15:25 ` Kinglong Mee
2015-08-07 17:07 ` Jeff Layton
2015-08-09 7:12 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 03/18] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-08-07 15:26 ` Kinglong Mee
2015-08-07 17:12 ` Jeff Layton
2015-08-09 7:14 ` Christoph Hellwig
2015-08-09 11:11 ` Jeff Layton
2015-08-10 8:26 ` Christoph Hellwig
2015-08-10 11:23 ` Jeff Layton
2015-08-10 12:10 ` Christoph Hellwig
2015-08-10 12:14 ` Jeff Layton
2015-08-10 14:33 ` J. Bruce Fields
2015-08-05 21:13 ` [PATCH v2 04/18] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-08-07 15:28 ` Kinglong Mee
2015-08-07 17:18 ` Jeff Layton
2015-08-08 0:14 ` Kinglong Mee
2015-08-08 10:36 ` Jeff Layton
2015-08-10 11:36 ` Kinglong Mee
2015-08-09 7:17 ` Christoph Hellwig
2015-08-09 11:19 ` Jeff Layton
2015-08-10 8:28 ` Christoph Hellwig
2015-08-10 11:31 ` Jeff Layton
2015-08-05 21:13 ` [PATCH v2 05/18] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 06/18] nfsd: hook up nfsd_read to the " Jeff Layton
2015-08-07 15:29 ` Kinglong Mee
2015-08-07 17:26 ` Jeff Layton
2015-08-08 0:19 ` Kinglong Mee
2015-08-05 21:13 ` [PATCH v2 07/18] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-08-05 21:13 ` [PATCH v2 08/18] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 09/18] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13 ` [PATCH v2 10/18] nfsd: handle NFSD_MAY_NOT_BREAK_LEASE in open file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 11/18] nfsd: hook nfsd_commit up to the nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 12/18] nfsd: move include of state.h from trace.c to trace.h Jeff Layton
2015-08-09 7:18 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 13/18] nfsd: add new tracepoints for nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 14/18] nfsd: have _fh_update take a knfsd_fh instead of a svc_fh Jeff Layton
2015-08-09 7:21 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 15/18] nfsd: have set_version_and_fsid_type take a knfsd_fh instead of svc_fh Jeff Layton
2015-08-09 7:21 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 16/18] nfsd: add a fh_compose_shallow Jeff Layton
2015-08-07 15:33 ` Kinglong Mee
2015-08-07 17:56 ` Jeff Layton
2015-08-07 18:24 ` Jeff Layton
2015-08-08 0:27 ` Kinglong Mee [this message]
2015-08-08 10:38 ` Jeff Layton
2015-08-05 21:13 ` [PATCH v2 17/18] nfsd: close cached files prior to a REMOVE or RENAME that would replace target Jeff Layton
2015-08-05 21:13 ` [PATCH v2 18/18] nfsd: call flush_delayed_fput from nfsd_file_close_fh Jeff Layton
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=55C54D03.2050908@gmail.com \
--to=kinglongmee@gmail.com \
--cc=bfields@fieldses.org \
--cc=jlayton@poochiereds.net \
--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.