nfsd_fh: if two exports are possible, choose the one without V4ROOT
authorNeilBrown <neilb@suse.de>
Tue, 1 May 2012 19:22:57 +0000 (15:22 -0400)
committerSteve Dickson <steved@redhat.com>
Tue, 1 May 2012 19:29:59 +0000 (15:29 -0400)
When nfsd_fh it looking for an export for a particular
client and file-handle, it might find two exports for the same path:
one with NFSEXP_V4ROOT, one with out.

As nfsd_fh calls cache_export_ent to give the export information to
the kernel it much choose the same export that auth_authenticate
chooses for get_rootfh which it also passes cache_export_ent (via
cache_export).
i.e. it must choose the non-V4ROOT on where possible.

Also change
   strcmp(foo, bar)
to
   strcmp(foo, bar) == 0
because I have a pathological fear of the former.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/mountd/cache.c

index b01c0bd..0af6404 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;
+                               }
                        }
                }
        }