X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=e4e2f228f848a458a9d6e30a3c6e02ef8b43bec1;hp=23e2344559bb3bec48583c3a15d0187c44c03a3d;hb=9ccfe0fa5a43dfc4453b09e328565a6c8f999fe4;hpb=8d52fc2691783dc9ef5bd9d9a1fa4c0ec33b20bc diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 23e2344..e4e2f22 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -215,8 +215,17 @@ int get_uuid(char *path, char *uuid, int uuidlen, char *u) if (path) { val = get_uuid_blkdev(path); - if (!val) - return 0; + if (!val) { + struct statfs64 st; + + if (statfs64(path, &st)) + return 0; + if (!st.f_fsid.__val[0] && !st.f_fsid.__val[1]) + return 0; + snprintf(fsid_val, 17, "%08x%08x", + st.f_fsid.__val[0], st.f_fsid.__val[1]); + val = fsid_val; + } } else { val = uuid; } @@ -385,7 +394,7 @@ void nfsd_fh(FILE *f) /* Now determine export point for this fsid/domain */ for (i=0 ; i < MCL_MAXTYPES; i++) { nfs_export *next_exp; - for (exp = exportlist[i]; exp; exp = next_exp) { + for (exp = exportlist[i].p_head; exp; exp = next_exp) { struct stat stb; char u[16]; char *path; @@ -555,7 +564,7 @@ static void write_fsloc(FILE *f, struct exportent *ep, char *path) release_replicas(servers); } -static void write_secinfo(FILE *f, struct exportent *ep) +static void write_secinfo(FILE *f, struct exportent *ep, int flag_mask) { struct sec_entry *p; @@ -569,7 +578,7 @@ static void write_secinfo(FILE *f, struct exportent *ep) qword_printint(f, p - ep->e_secinfo); for (p = ep->e_secinfo; p->flav; p++) { qword_printint(f, p->flav->fnum); - qword_printint(f, p->flags); + qword_printint(f, p->flags & flag_mask); } } @@ -581,16 +590,14 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex qword_printint(f, time(0)+30*60); if (exp) { int different_fs = strcmp(path, exp->e_path) != 0; - - if (different_fs) - qword_printint(f, exp->e_flags & ~NFSEXP_FSID); - else - qword_printint(f, exp->e_flags); + int flag_mask = different_fs ? ~NFSEXP_FSID : ~0; + + qword_printint(f, exp->e_flags & flag_mask); qword_printint(f, exp->e_anonuid); qword_printint(f, exp->e_anongid); qword_printint(f, exp->e_fsid); write_fsloc(f, exp, path); - write_secinfo(f, exp); + write_secinfo(f, exp, flag_mask); if (exp->e_uuid == NULL || different_fs) { char u[16]; if (get_uuid(path, NULL, 16, u)) { @@ -645,7 +652,7 @@ void nfsd_export(FILE *f) /* now find flags for this export point in this domain */ for (i=0 ; i < MCL_MAXTYPES; i++) { - for (exp = exportlist[i]; exp; exp = exp->m_next) { + for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { if (!use_ipaddr && !client_member(dom, exp->m_client->m_hostname)) continue; if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) {