From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jeff.layton@primarydata.com>
Cc: Christoph Hellwig <hch@infradead.org>, linux-nfs@vger.kernel.org
Subject: Re: nfsd4_locku / nfs4_free_lock_stateid question
Date: Tue, 15 Jul 2014 10:50:29 -0400 [thread overview]
Message-ID: <20140715145029.GI17956@fieldses.org> (raw)
In-Reply-To: <20140715081334.654473fd@tlielax.poochiereds.net>
On Tue, Jul 15, 2014 at 08:13:34AM -0400, Jeff Layton wrote:
> On Sun, 13 Jul 2014 05:19:19 -0700
> Christoph Hellwig <hch@infradead.org> wrote:
>
> > On Sun, Jul 13, 2014 at 08:05:41AM -0400, Jeff Layton wrote:
> > > It is weird, but I don't think it really matters as the filp is only
> > > really used as a way to get to the inode -- it really doesn't matter
> > > which struct file we use there. find_any_file will both take a
> > > reference to and return the file, which is then eventually fput in
> > > filp_close, so there should be no refcount leak or anything.
> > >
> > > The weirdness all comes from the vfs-layer file locking interfaces,
> > > many of which take a struct file argument when they really would be
> > > fine with a struct inode. Maybe one of these days we can get around to
> > > cleaning that up.
> >
> > If filesystems get the file passed we should assume that they actually
> > use it. In fact AFS does, but it's not NFS exportable at the moment,
> > and ceph does in a debug printk. I'd be much happier to waste a pointer
> > in the lock stateid to avoid this inconsistant interface. And it would
> > allow to kill find_any_fileas well..
> >
>
> I started looking at this this morning...
>
> FWIW, I don't see where AFS uses the struct file for anything
> non-trivial in the filp_close codepaths. afs_do_unlk doesn't seem to do
> much with it, and I don't see a ->flush operation for AFS. Am I missing
> something there?
>
> Here's what I think this change would look like. It builds but is
> otherwise untested, and the commit log is sort of half-assed right now.
> It should get slotted on top of this patch in the series:
>
> nfsd: do filp_close in sc_free callback for lock stateids
>
> I'm not sure this really improves anything.
>
> For one thing, we can only store a single struct file, but there's no
> guarantee that the locks represented by the lock stateid all used that
> file.
Right, so after this patch st_file means "the last file used by a lock
operation using this lock stateid"?
> Also, find_any_file is rather cheap, so I don't see this helping
> performance much.
>
> Given that, is this really worth the extra memory? Thoughts?
I'm not convinced it is. But I understand that we're imposing a weird
assumption on the lock interface: "if you're exportable, you should use
the struct file we passed you only to get the inode".
It's out of scope for this work now, but I wonder whether my
f9d7562fdb9d "nfsd4: share file descriptors between stateid's" was a
mistake. It also seemed potentially surprising to filesystems that we
could write or write-lock using a struct file originally opened for
read, but maybe that wasn't really a problem.
> @@ -4866,8 +4849,10 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
> case NFS4_READW_LT:
> spin_lock(&fp->fi_lock);
> filp = find_readable_file_locked(fp);
> - if (filp)
> + if (filp) {
> + swap(lock_stp->st_file, filp);
> get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ);
I haven't checked carefully, but in the case of a new lock stateid, is
st_file going to be NULL, in which case this is going to cause the
openmode check following this case statement to fail?
--b.
next prev parent reply other threads:[~2014-07-15 14:50 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-13 11:00 nfsd4_locku / nfs4_free_lock_stateid question Christoph Hellwig
2014-07-13 12:05 ` Jeff Layton
2014-07-13 12:19 ` Christoph Hellwig
2014-07-13 13:50 ` Jeff Layton
2014-07-15 12:13 ` Jeff Layton
2014-07-15 14:50 ` J. Bruce Fields [this message]
2014-07-15 15:53 ` Christoph Hellwig
2014-07-15 16:56 ` 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=20140715145029.GI17956@fieldses.org \
--to=bfields@fieldses.org \
--cc=hch@infradead.org \
--cc=jeff.layton@primarydata.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox