]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
Handle 'crossmnt' when kernel asked for export options for a directory.
[nfs-utils.git] / utils / mountd / cache.c
index 734ddd8f5ea5d50d5493ec90c212462b5ef7480a..2f13f03ec9a61247228d3c4e347488c7393e3af5 100644 (file)
@@ -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",