]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
Remove "maptype" support
[nfs-utils.git] / utils / mountd / cache.c
index 629d56746d4f498890ae5683e506d88c84fcdb37..6cf24ceb4f9f9d3b919cbe1c24cbc22e290945a5 100644 (file)
@@ -28,6 +28,7 @@
 #include "exportfs.h"
 #include "mountd.h"
 #include "xmalloc.h"
+#include "fsloc.h"
 
 #include "blkid/blkid.h"
 
@@ -412,7 +413,15 @@ void nfsd_fh(FILE *f)
        qword_print(f, dom);
        qword_printint(f, fsidtype);
        qword_printhex(f, fsid, fsidlen);
-       qword_printint(f, time(0)+30*60);
+       /* The fsid -> path lookup can be quite expensive as it
+        * potentially stats and reads lots of devices, and some of those
+        * might have spun-down.  The Answer is not likely to
+        * change underneath us, and an 'exportfs -f' can always
+        * remove this from the kernel, so use a really log
+        * timeout.  Maybe this should be configurable on the command
+        * line.
+        */
+       qword_printint(f, 0x7fffffff);
        if (found)
                qword_print(f, found->e_path);
        qword_eol(f);
@@ -421,6 +430,29 @@ void nfsd_fh(FILE *f)
        return;         
 }
 
+static void write_fsloc(FILE *f, struct exportent *ep, char *path)
+{
+       struct servers *servers;
+
+       if (ep->e_fslocmethod == FSLOC_NONE)
+               return;
+
+       servers = replicas_lookup(ep->e_fslocmethod, ep->e_fslocdata, path);
+       if (!servers)
+               return;
+       qword_print(f, "fsloc");
+       qword_printint(f, servers->h_num);
+       if (servers->h_num >= 0) {
+               int i;
+               for (i=0; i<servers->h_num; i++) {
+                       qword_print(f, servers->h_mp[i]->h_host);
+                       qword_print(f, servers->h_mp[i]->h_path);
+               }
+       }
+       qword_printint(f, servers->h_referral);
+       release_replicas(servers);
+}
+
 static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
 {
        qword_print(f, domain);
@@ -431,6 +463,7 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
                qword_printint(f, exp->e_anonuid);
                qword_printint(f, exp->e_anongid);
                qword_printint(f, exp->e_fsid);
+               write_fsloc(f, exp, path);
                if (exp->e_uuid == NULL) {
                        char u[16];
                        if (get_uuid(exp->e_path, NULL, 16, u)) {
@@ -523,7 +556,7 @@ void cache_open(void)
        int i;
        for (i=0; cachelist[i].cache_name; i++ ) {
                char path[100];
-               if (!manage_gids && cachelist[i].f == auth_unix_gid)
+               if (!manage_gids && cachelist[i].cache_handle == auth_unix_gid)
                        continue;
                sprintf(path, "/proc/net/rpc/%s/channel", cachelist[i].cache_name);
                cachelist[i].f = fopen(path, "r+");
@@ -579,12 +612,6 @@ int cache_export(nfs_export *exp)
        int err;
        FILE *f;
 
-       if (exp->m_export.e_maptype != CLE_MAP_IDENT) {
-               xlog(L_ERROR, "%s: unsupported mapping; kernel supports only 'identity' (default)",
-                   exp->m_export.m_path);
-               return -1;
-       }
-
        f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
        if (!f)
                return -1;