]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
nfsd_fh: if two exports are possible, choose the one without V4ROOT
[nfs-utils.git] / utils / mountd / cache.c
index ac9cdbd2e0ed30fedcd03a368e1f79797cda3f35..0af640441b9b86eab0f0dd023f8ed985b4b4d410 100644 (file)
@@ -596,11 +596,20 @@ static void nfsd_fh(FILE *f)
                                found_path = strdup(path);
                                if (found_path == NULL)
                                        goto out;
-                       } else if (strcmp(found->e_path, exp->m_export.e_path)
+                       } else if (strcmp(found->e_path, exp->m_export.e_path) != 0
                                   && !subexport(found, &exp->m_export))
                        {
                                xlog(L_WARNING, "%s and %s have same filehandle for %s, using first",
                                     found_path, path, dom);
+                       } else {
+                               /* same path, if one is V4ROOT, choose the other */
+                               if (found->e_flags & NFSEXP_V4ROOT) {
+                                       found = &exp->m_export;
+                                       free(found_path);
+                                       found_path = strdup(path);
+                                       if (found_path == NULL)
+                                               goto out;
+                               }
                        }
                }
        }
@@ -772,10 +781,14 @@ lookup_export(char *dom, char *path, struct addrinfo *ai)
                                found_type = i;
                                continue;
                        }
-
-                       /* Always prefer non-V4ROOT mounts */
-                       if (found->m_export.e_flags & NFSEXP_V4ROOT)
+                       /* Always prefer non-V4ROOT exports */
+                       if (exp->m_export.e_flags & NFSEXP_V4ROOT)
                                continue;
+                       if (found->m_export.e_flags & NFSEXP_V4ROOT) {
+                               found = exp;
+                               found_type = i;
+                               continue;
+                       }
 
                        /* If one is a CROSSMOUNT, then prefer the longest path */
                        if (((found->m_export.e_flags & NFSEXP_CROSSMOUNT) ||