2007-11-23 02:50:36

by NeilBrown

[permalink] [raw]
Subject: Re: [NFS] nfs-utils crossmnt/fsid bug

On Wednesday September 5, [email protected] wrote:
> With an exports entry like
>
> /exports *.citi.umich.edu(rw,crossmnt,fsid=0)
>
> and some other stuff mounted under /exports, I get an odd situation
> where listing /exports/submnt/ shows me the contents of /exports/.
>
> I looks to me like what's happening is that the new code to
> automatically export filesystems under crossmnt exports is exporting
> those directories with the fsid option turned on, with the result that
> the root of each of those subdirectories ends up with the same
> filehandle as the root of /exports, and the hilarity ensues. But I
> haven't tried a patch yet.
>
> Does that make sense? I assume we should just clear the fsid flag on
> submounts, as it's never going to make sense, and leave the logic
> otherwise intact.
>
> --b.

Thanks for noticing and reporting this.

Does this (untested, but it compiles) patch seem right?

NeilBrown

--------
When exported a filesystems with option inherited (by the crossmnt
option) from a higherlevel filesystem, ignore filesystem specific
options like FSID and explicit UUID.

Signed-off-by: NeilBrown <[email protected]>

diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index fd317cd..ff56b9f 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -565,20 +565,29 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
qword_print(f, path);
qword_printint(f, time(0)+30*60);
if (exp) {
- qword_printint(f, exp->e_flags);
+ int different_fs = 0;
+ struct stat stb1, stb2;
+ if (stat(path, &stb1) == 0 &&
+ stat(exp->e_path, &stb2) == 0 &&
+ stb1.st_dev != stb2.st_dev)
+ different_fs = 1;
+ if (different_fs)
+ qword_printint(f, exp->e_flags & ~NFSEXP_FSID);
+ else
+ qword_printint(f, exp->e_flags);
qword_printint(f, exp->e_anonuid);
qword_printint(f, exp->e_anongid);
qword_printint(f, exp->e_fsid);
write_fsloc(f, exp, path);
write_secinfo(f, exp);
#if USE_BLKID
- if (exp->e_uuid == NULL) {
+ if (exp->e_uuid == NULL || different_fs) {
char u[16];
if (get_uuid(path, NULL, 16, u)) {
qword_print(f, "uuid");
qword_printhex(f, u, 16);
}
- } else if (exp->e_uuid) {
+ } else {
qword_print(f, "uuid");
qword_printhex(f, exp->e_uuid, 16);
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs
_______________________________________________
Please note that [email protected] is being discontinued.
Please subscribe to [email protected] instead.
http://vger.kernel.org/vger-lists.html#linux-nfs