]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
statd: Replace note() with xlog() in rpc.statd
[nfs-utils.git] / utils / mountd / cache.c
index 23e2344559bb3bec48583c3a15d0187c44c03a3d..e4e2f228f848a458a9d6e30a3c6e02ef8b43bec1 100644 (file)
@@ -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) {