You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.3 KiB
158 lines
5.3 KiB
7 years ago
|
commit 710a492fda68092a02d6360d7a185f6a4dcaea85
|
||
|
Author: NeilBrown <neilb@suse.de>
|
||
|
Date: Thu Feb 26 14:10:35 2015 -0500
|
||
|
|
||
|
exports.man: improve documentation of 'nohide' and 'crossmnt'
|
||
|
|
||
|
- note that 'nohide' is irrelevant for NFSv4
|
||
|
- note that children on a 'crossmnt' filesystem cannot be unexported
|
||
|
- note that 'nocrossmnt' is a valid option, but probably not useful.
|
||
|
|
||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||
|
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||
|
|
||
|
diff --git a/utils/exportfs/exports.man b/utils/exportfs/exports.man
|
||
|
index 59358e6..9309246 100644
|
||
|
--- a/utils/exportfs/exports.man
|
||
|
+++ b/utils/exportfs/exports.man
|
||
|
@@ -218,16 +218,46 @@ This option can be very useful in some situations, but it should be
|
||
|
used with due care, and only after confirming that the client system
|
||
|
copes with the situation effectively.
|
||
|
|
||
|
-The option can be explicitly disabled with
|
||
|
+The option can be explicitly disabled for NFSv2 and NFSv3 with
|
||
|
.IR hide .
|
||
|
+
|
||
|
+This option is not relevant when NFSv4 is use. NFSv4 never hides
|
||
|
+subordinate filesystems. Any filesystem that is exported will be
|
||
|
+visible where expected when using NFSv4.
|
||
|
.TP
|
||
|
-.IR crossmnt
|
||
|
+.I crossmnt
|
||
|
This option is similar to
|
||
|
.I nohide
|
||
|
-but it makes it possible for clients to move from the filesystem marked
|
||
|
-with crossmnt to exported filesystems mounted on it. Thus when a child
|
||
|
-filesystem "B" is mounted on a parent "A", setting crossmnt on "A" has
|
||
|
-the same effect as setting "nohide" on B.
|
||
|
+but it makes it possible for clients to access all filesystems mounted
|
||
|
+on a filesystem marked with
|
||
|
+.IR crossmnt .
|
||
|
+Thus when a child filesystem "B" is mounted on a parent "A", setting
|
||
|
+crossmnt on "A" has a similar effect to setting "nohide" on B.
|
||
|
+
|
||
|
+With
|
||
|
+.I nohide
|
||
|
+the child filesystem needs to be explicitly exported. With
|
||
|
+.I crossmnt
|
||
|
+it need not. If a child of a
|
||
|
+.I crossmnt
|
||
|
+file is not explicitly exported, then it will be implicitly exported
|
||
|
+with the same export options as the parent, except for
|
||
|
+.IR fsid= .
|
||
|
+This makes it impossible to
|
||
|
+.B not
|
||
|
+export a child of a
|
||
|
+.I crossmnt
|
||
|
+filesystem. If some but not all subordinate filesystems of a parent
|
||
|
+are to be exported, then they must be explicitly exported and the
|
||
|
+parent should not have
|
||
|
+.I crossmnt
|
||
|
+set.
|
||
|
+
|
||
|
+The
|
||
|
+.I nocrossmnt
|
||
|
+option can explictly disable
|
||
|
+.I crossmnt
|
||
|
+if it was previously set. This is rarely useful.
|
||
|
.TP
|
||
|
.IR no_subtree_check
|
||
|
This option disables subtree checking, which has mild security
|
||
|
|
||
|
commit b7341b19d62481504f1820414159009535d37809
|
||
|
Author: NeilBrown <neilb@suse.de>
|
||
|
Date: Wed Feb 25 16:47:56 2015 -0500
|
||
|
|
||
|
mountd: fix next_mnt handling for "/"
|
||
|
|
||
|
If the (exported) path passed to next_mnt() is simply "/", next_mnt()
|
||
|
will not report any children, as none start with "/" followed by a '/'.
|
||
|
So make a special case for strlen(p)==1. In that case, return all
|
||
|
children.
|
||
|
|
||
|
This gives correct handling if only "/" is exported.
|
||
|
|
||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||
|
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||
|
|
||
|
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
|
||
|
index 1430aee..23af4a9 100644
|
||
|
--- a/utils/mountd/cache.c
|
||
|
+++ b/utils/mountd/cache.c
|
||
|
@@ -365,7 +365,7 @@ static char *next_mnt(void **v, char *p)
|
||
|
*v = f;
|
||
|
} else
|
||
|
f = *v;
|
||
|
- while ((me = getmntent(f)) != NULL &&
|
||
|
+ while ((me = getmntent(f)) != NULL && l > 1 &&
|
||
|
(strncmp(me->mnt_dir, p, l) != 0 ||
|
||
|
me->mnt_dir[l] != '/'))
|
||
|
;
|
||
|
|
||
|
commit 7e27d4a542bf97e0ddc1036010e1b2d218a01c2b
|
||
|
Author: Vivek Trivedi <t.vivek@samsung.com>
|
||
|
Date: Wed Sep 16 11:14:03 2015 -0400
|
||
|
|
||
|
mountd: fix mount issue due to comparison with uninitialized uuid
|
||
|
|
||
|
Fix mount issue due to comparison of uninitialized variable
|
||
|
u(uuid) with parsed->fhuuid when uuid_by_path return 0.
|
||
|
|
||
|
/tmp/usb
|
||
|
192.168.1.0/16(ro,no_root_squash,no_subtree_check,fsid=0)
|
||
|
/tmp/usb/sda1 192.168.1.0/16(ro,no_root_squash,no_subtree_check)
|
||
|
/tmp/usb/sdb1 192.168.1.0/16(ro,no_root_squash,no_subtree_check)
|
||
|
|
||
|
mount -t nfs -o nolock,nfsvers=3 192.168.1.2:/tmp/usb/sda1 /tmp/sda1
|
||
|
mount -t nfs -o nolock,nfsvers=3 192.168.1.2:/tmp/usb/sdb1 /tmp/sdb1
|
||
|
|
||
|
results in below mountd error:
|
||
|
mountd: /tmp/usb and /tmp/usb/sdb1 have same filehandle for
|
||
|
192.168.1.0/16, using first
|
||
|
|
||
|
when uuid_by_path returned 0, by chance, garbage value of u was same as
|
||
|
parsed->fhuuid(of sdb1), and comparison of these resulted in above
|
||
|
error.
|
||
|
|
||
|
Signed-off-by: Vivek Trivedi <t.vivek@samsung.com>
|
||
|
Reviewed-by: Amit Sahrawat <a.sahrawat@samsung.com>
|
||
|
Signed-off-by: Steve Dickson <steved@redhat.com>
|
||
|
|
||
|
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
|
||
|
index 9a1bb27..1430aee 100644
|
||
|
--- a/utils/mountd/cache.c
|
||
|
+++ b/utils/mountd/cache.c
|
||
|
@@ -547,18 +547,17 @@ static bool match_fsid(struct parsed_fsid *parsed, nfs_export *exp, char *path)
|
||
|
if (!is_mountpoint(path))
|
||
|
return false;
|
||
|
check_uuid:
|
||
|
- if (exp->m_export.e_uuid)
|
||
|
+ if (exp->m_export.e_uuid) {
|
||
|
get_uuid(exp->m_export.e_uuid, parsed->uuidlen, u);
|
||
|
+ if (memcmp(u, parsed->fhuuid, parsed->uuidlen) == 0)
|
||
|
+ return true;
|
||
|
+ }
|
||
|
else
|
||
|
for (type = 0;
|
||
|
uuid_by_path(path, type, parsed->uuidlen, u);
|
||
|
type++)
|
||
|
if (memcmp(u, parsed->fhuuid, parsed->uuidlen) == 0)
|
||
|
return true;
|
||
|
-
|
||
|
- if (memcmp(u, parsed->fhuuid, parsed->uuidlen) != 0)
|
||
|
- return false;
|
||
|
- return true;
|
||
|
}
|
||
|
/* Well, unreachable, actually: */
|
||
|
return false;
|