summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-03-19 11:52:30 +1100
committerNeil Brown <neilb@suse.de>2007-03-19 11:52:30 +1100
commit291ea6c6470d4f3aa177044bc9755880c997d3d4 (patch)
treeb11fdf807ac63a89ee1bc9bb1ecee3d3444250da
parent323d1c4d69b65ab36d951aca8473ceb02171ab08 (diff)
downloadnfs-utils-291ea6c6470d4f3aa177044bc9755880c997d3d4.tar.gz
nfs-utils-291ea6c6470d4f3aa177044bc9755880c997d3d4.tar.xz
nfs-utils-291ea6c6470d4f3aa177044bc9755880c997d3d4.zip
Handle 'crossmnt' when kernel asked for export options for a directory.
If the kernel finds a mountpoint below a 'crossmnt' export, it will ask mounted what export options to use. With this patch it will return the same export options as for the top 'crossmnt' export unless more specific options have been given.
-rw-r--r--utils/mountd/cache.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 734ddd8..2f13f03 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -515,11 +515,36 @@ void nfsd_export(FILE *f)
for (exp = exportlist[i]; exp; exp = exp->m_next) {
if (!client_member(dom, exp->m_client->m_hostname))
continue;
- if (strcmp(path, exp->m_export.e_path))
+ if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) {
+ /* if path is a mountpoint below e_path, then OK */
+ int l = strlen(exp->m_export.e_path);
+ if (strcmp(path, exp->m_export.e_path) == 0 ||
+ (strncmp(path, exp->m_export.e_path, l) == 0 &&
+ path[l] == '/' &&
+ is_mountpoint(path)))
+ /* ok */;
+ else
+ continue;
+ } else if (strcmp(path, exp->m_export.e_path) != 0)
continue;
if (!found) {
found = exp;
found_type = i;
+ continue;
+ }
+ /* If one is a CROSSMOUNT, then prefer the longest path */
+ if (((found->m_export.e_flags & NFSEXP_CROSSMOUNT) ||
+ (found->m_export.e_flags & NFSEXP_CROSSMOUNT)) &&
+ strlen(found->m_export.e_path) !=
+ strlen(found->m_export.e_path)) {
+
+ if (strlen(exp->m_export.e_path) >
+ strlen(found->m_export.e_path)) {
+ found = exp;
+ found_type = i;
+ }
+ continue;
+
} else if (found_type == i && found->m_warned == 0) {
xlog(L_WARNING, "%s exported to both %s and %s, "
"arbitrarily choosing options from first",