Linux NFS development
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: NeilBrown <neilb@suse.de>
Cc: Steve Dickson <SteveD@redhat.com>, NFS <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH] mountd: Fix is_subdirectory again.
Date: Mon, 6 May 2013 11:04:28 -0400	[thread overview]
Message-ID: <20130506150428.GD15476@fieldses.org> (raw)
In-Reply-To: <20130506144413.46b6f37b@notabene.brown>

On Mon, May 06, 2013 at 02:44:13PM +1000, NeilBrown wrote:
> On Thu, 2 May 2013 11:16:34 -0400 "J. Bruce Fields" <bfields@fieldses.org>
> wrote:
> 
> > On Thu, May 02, 2013 at 05:05:11PM +1000, NeilBrown wrote:
> > > 
> > > 
> > > Hi Steve,
> > >  I just noticed
> > > 
> > > commit ebe2826ca571a3959c3b5c8e29686c621f2775cf
> > > Author: Steve Dickson <steved@redhat.com>
> > > Date:   Sat Mar 23 10:30:17 2013 -0400
> > > 
> > >     mountd: regression in crossmounts
> > > 
> > > Sorry I missed the email you presumably sent me to let me know
> > > that I had caused a regression.
> > 
> > Yup.  The strategy around here is to bury people in email and trust they
> > have industrial-strength filtering.
> > 
> > And I could have added Neil on the cc: too and forgot, oops:
> > 
> > 	http://marc.info/?l=linux-nfs&m=136404930104976&w=2
> > 
> > > Here is the proper fix.
> > 
> > I'm dense.  I still had to scratch my head a while:
> > 
> > So: in a case like the one steved gives:
> > 
> > 	/home *(rw,fsid=0,crossmnt)
> > 	/home/fs1 *(rw,crossmnt)
> > 	/home/fs1/fs2/fs3 *(rw,nohide)
> > 
> > where nfsd_fh is asked to look for an export with fsid=0, it gets a
> > match on the export of /home.  But that loop there keeps going in case
> > it finds some better match.  In particular it considers any mountpoints
> > under /home as candidates, since /home has "crossmnt".  And they all
> > match too.  So it considers in sequence the possibilities:
> > 
> > 	(found=/export of /home, found_path=/home)
> > 	(found=/export of /home, found_path=/home/fs1)
> > 	(found=/export of /home, found_path=/home/fs1/fs2/fs3)
> > 
> > The subexport() test--designed to favor crossmnt exports which are
> > "closer" to the target filesystem--passes in each case, so we end up
> > taking the last.
> > 
> > So we pass down the longest path to the kernel, it does an export upcall
> > for that path, the hilarity ensues.
> > 
> > Anyway:
> > 
> > 	Acked-by: J. Bruce Fields <bfields@redhat.com>
> 
> Thanks.
> 
> > 
> > But this all still gives me a mild headache:
> > 
> > 	- it only works if we iterate through the submounts in the
> > 	  correct order?
> 
> Does it?  nfsd_fh() is trying to find the export for a given file handle.
>   For every export it tries that filesystem and (if CROSSMOUNT) ever
>   filesystem mounted below there.
>   It only considers filesystem for which the fsid matches.
>   Of those, it chooses the exp which is 'lowest' in the hierarchy.
> 
> I don't think the result of that can be dependant on order.

Well, my only point was that we depend on first trying the main export
and then the filesystems mounted below--as that's probably how it would
work under any reasonable organization of the code, I suppose that's not
so fragile.

> > 	- should fsid= be inherited by crossmnt anyway?
> 
> No...
> If you have an export with fsid=N,crossmnt and a filehandle arrives for
> fsid=N, then when we first look at that export match_fsid() will report a
> match and 'found' will be set.
> nfsd_fh() will loop around and try again for the next entry in /etc/mtab
> which is under that same filesystem.  It will get a match_fsid() as well but
> as subexport() will report "no" (as it is the same export), no change will be
> made to found.  It also will not report that "X and Y have same file handle
> for Z, using first" as the e_paths will match.

Oh, I see--you're right.

> So it works as is.  Maybe the code could be made clearer though.
> 
> 
> > 	- nfsd_fh() is too long, and the logic (with those extra loop
> > 	  control variables declared static inside the CROSSMOUNT case)
> > 	  could be more straightforward.
> 
> You have a history of taking my too-long functions and breaking them up into
> manageable bits (kernel commit 3211af1119174fbe8b).  Maybe you could try
> again :-)

Yeah, yeah, yeah.  Maybe the compulsion will take me some day.  For the
sake of several other pressing projects, hopefully not today.

--b.

  reply	other threads:[~2013-05-06 15:04 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-02  7:05 [PATCH] mountd: Fix is_subdirectory again NeilBrown
2013-05-02 15:16 ` J. Bruce Fields
2013-05-06  4:44   ` NeilBrown
2013-05-06 15:04     ` J. Bruce Fields [this message]
2013-05-07 16:01 ` Steve Dickson

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=20130506150428.GD15476@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=SteveD@redhat.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neilb@suse.de \
    /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