From: "J. Bruce Fields" <bfields@citi.umich.edu>
To: Neil Brown <neilb@suse.de>
Cc: Steve Dickson <steved@redhat.com>, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 3/3] mountd: fix crossmnt options in v2/v3 case
Date: Sun, 7 Mar 2010 16:58:26 -0500 [thread overview]
Message-ID: <20100307215826.GA14104@fieldses.org> (raw)
In-Reply-To: <20100308082516.260e5f70-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
On Mon, Mar 08, 2010 at 08:25:16AM +1100, Neil Brown wrote:
> On Sun, 7 Mar 2010 15:08:01 -0500
> "J. Bruce Fields" <bfields@citi.umich.edu> wrote:
>
> > The extra cache entries added here all get the options of the parent
> > export. This is incorrect, since once of the children may be explicitly
> > exported with different options, and the parent crossmnt shouldn't
> > override the explicit child export.
> >
> > What's more, this is unnecessary, since in the newcache case we'll
> > request these on demand when we need them.
>
> Are you sure that removing this doesn't break something else?
Maybe so--thanks for looking at this.
> It was explicitly added in commit 323d1c4d69b65ab36d, apparently for a good
> reason.
>
> Also, it shouldn't be causing the problem described as cache_export_ent
> should only be called where 'exp' is the lowest (furthest from the root)
> export for any directory in 'path'.
Hm. Is nfsd_fh() following that rule?
> So any child mounts that are found should not be explicitly exported.
>
> This code is needed to handle a case where you have
> /a /a/b /a/b/c all mount points, /a is exported with crossmnt,
> and a mount request comes in for /a/b/c (or /a/b).
> mountd needs to get the filehandle for /a/b/c, so that filesystem must be
> exported to the kernel.
Yes, I didn't look carefully enough. I think I must have assumed the
first dump_to_cache did that. But wouldn't it be sufficient to just do:
dump_to_cache(f, domain, path, e_path);
(as in the below) instead of also running through all the parents?
> We cannot really on upcalls filling in that
> information as doing so would cause mountd to deadlock - it asks the kernel
> for a filehandle, the kernel asks it for export information, and mountd is
> single-threaded...
Don't we have this problem already, then? The export cache really is
just a cache, and we should be prepared for a given entry to be purged
at any time.
--b.
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 7dec468..f682a9b 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -810,53 +810,13 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
if (!f)
return -1;
- err = dump_to_cache(f, domain, exp->e_path, exp);
+ err = dump_to_cache(f, domain, path, exp);
if (err) {
xlog(L_WARNING,
"Cannot export %s, possibly unsupported filesystem or"
" fsid= required", exp->e_path);
}
- while (err == 0 && (exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
- /* really an 'if', but we can break out of
- * a 'while' more easily */
- /* Look along 'path' for other filesystems
- * and export them with the same options
- */
- struct stat stb;
- int l = strlen(exp->e_path);
- int dev;
-
- if (strlen(path) <= l || path[l] != '/' ||
- strncmp(exp->e_path, path, l) != 0)
- break;
- if (stat(exp->e_path, &stb) != 0)
- break;
- dev = stb.st_dev;
- while(path[l] == '/') {
- char c;
- /* errors for submount should fail whole filesystem */
- int err2;
-
- l++;
- while (path[l] != '/' && path[l])
- l++;
- c = path[l];
- path[l] = 0;
- err2 = lstat(path, &stb);
- path[l] = c;
- if (err2 < 0)
- break;
- if (stb.st_dev == dev)
- continue;
- dev = stb.st_dev;
- path[l] = 0;
- dump_to_cache(f, domain, path, exp);
- path[l] = c;
- }
- break;
- }
-
fclose(f);
return err;
}
next prev parent reply other threads:[~2010-03-07 21:57 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-28 10:06 Problems with crossmnt since 1.2.1 Iustin Pop
[not found] ` <20100228100643.GG26178-kWFYwFCQMdQkLqoNrXjPMti2O/JbrIOy@public.gmane.org>
2010-03-01 20:40 ` J. Bruce Fields
2010-03-01 21:13 ` Iustin Pop
[not found] ` <20100301211306.GA16341-kWFYwFCQMdQkLqoNrXjPMti2O/JbrIOy@public.gmane.org>
2010-03-01 21:39 ` J. Bruce Fields
2010-03-01 21:41 ` Iustin Pop
[not found] ` <20100301214116.GB16341-kWFYwFCQMdQkLqoNrXjPMti2O/JbrIOy@public.gmane.org>
2010-03-01 21:52 ` J. Bruce Fields
2010-03-02 3:20 ` J. Bruce Fields
2010-03-07 19:54 ` Iustin Pop
[not found] ` <20100307195449.GE9237-kWFYwFCQMdQkLqoNrXjPMti2O/JbrIOy@public.gmane.org>
2010-03-07 20:06 ` J. Bruce Fields
2010-03-07 20:07 ` [PATCH 1/3] mountd: fix path comparison for v4 crossmnt J. Bruce Fields
2010-03-07 20:08 ` [PATCH 2/3] mountd: trivial: name parameters for clarity J. Bruce Fields
2010-03-07 20:08 ` [PATCH 3/3] mountd: fix crossmnt options in v2/v3 case J. Bruce Fields
2010-03-07 21:25 ` Neil Brown
[not found] ` <20100308082516.260e5f70-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-07 21:58 ` J. Bruce Fields [this message]
2010-03-07 23:10 ` Neil Brown
[not found] ` <20100308101014.14e635b2-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2010-03-08 18:21 ` J. Bruce Fields
2010-03-08 18:23 ` J. Bruce Fields
2010-03-08 18:30 ` Chuck Lever
2010-03-08 18:41 ` J. Bruce Fields
2010-03-08 18:45 ` Chuck Lever
2010-03-08 19:56 ` Steve Dickson
2010-03-08 20:04 ` [PATCH 2/3] mountd: trivial: name parameters for clarity Steve Dickson
2010-03-08 20:04 ` [PATCH 1/3] mountd: fix path comparison for v4 crossmnt Steve Dickson
2010-03-08 20:28 ` Problems with crossmnt since 1.2.1 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=20100307215826.GA14104@fieldses.org \
--to=bfields@citi.umich.edu \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=steved@redhat.com \
/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.