X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=2f13f03ec9a61247228d3c4e347488c7393e3af5;hp=734ddd8f5ea5d50d5493ec90c212462b5ef7480a;hb=291ea6c6470d4f3aa177044bc9755880c997d3d4;hpb=323d1c4d69b65ab36d951aca8473ceb02171ab08 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",