X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=c3dee13c61714c50342fe6370b2782b7aa9fe327;hp=68cccdfddb70535f58c248798839fff5338ba656;hb=13a0a61d037f2cc09e7997a96ce5822b9317883b;hpb=f8d26c1db9a260597828685c7f62e1b29e78285f diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 68cccdf..c3dee13 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -341,6 +341,17 @@ static char *next_mnt(void **v, char *p) return me->mnt_dir; } +/* True iff e1 is a child of e2 and e2 has crossmnt set: */ +static bool subexport(struct exportent *e1, struct exportent *e2) +{ + char *p1 = e1->e_path, *p2 = e2->e_path; + int l2 = strlen(p2); + + return e2->e_flags & NFSEXP_CROSSMOUNT + && strncmp(p1, p2, l2) == 0 + && p1[l2] == '/'; +} + static void nfsd_fh(FILE *f) { /* request are: @@ -550,13 +561,14 @@ static void nfsd_fh(FILE *f) if (!client_check(exp->m_client, ai)) continue; } - /* It's a match !! */ - if (!found) { + if (!found || subexport(&exp->m_export, found)) { found = &exp->m_export; + free(found_path); found_path = strdup(path); if (found_path == NULL) goto out; - } else if (strcmp(found->e_path, exp->m_export.e_path)!= 0) + } else if (strcmp(found->e_path, exp->m_export.e_path) + && !subexport(found, &exp->m_export)) { xlog(L_WARNING, "%s and %s have same filehandle for %s, using first", found_path, path, dom);