]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
new "mountpoint" export option.
[nfs-utils.git] / utils / mountd / cache.c
index 1d1567d2012f97bed71a1a5a1786a73bdb845934..9d7d20d99e9c1a4cc651d7256fcde109f759210a 100644 (file)
@@ -100,6 +100,7 @@ void nfsd_fh(FILE *f)
        struct exportent *found = NULL;
        nfs_export *exp;
        int i;
        struct exportent *found = NULL;
        nfs_export *exp;
        int i;
+       int dev_missing = 0;
 
        if (readline(fileno(f), &lbuf, &lbuflen) != 1)
                return;
 
        if (readline(fileno(f), &lbuf, &lbuflen) != 1)
                return;
@@ -145,6 +146,11 @@ void nfsd_fh(FILE *f)
                                continue;
                        if (fsidtype == 0) {
                                struct stat stb;
                                continue;
                        if (fsidtype == 0) {
                                struct stat stb;
+                               if (exp->m_export.e_mountpoint &&
+                                   !is_mountpoint(exp->m_export.e_mountpoint[0]?
+                                                  exp->m_export.e_mountpoint:
+                                                  exp->m_export.e_path))
+                                       dev_missing ++;
                                if (stat(exp->m_export.e_path, &stb) != 0)
                                        continue;
                                if (stb.st_ino != inode)
                                if (stat(exp->m_export.e_path, &stb) != 0)
                                        continue;
                                if (stb.st_ino != inode)
@@ -158,11 +164,31 @@ void nfsd_fh(FILE *f)
                                found = &exp->m_export;
                        else if (strcmp(found->e_path, exp->m_export.e_path)!= 0)
                        {
                                found = &exp->m_export;
                        else if (strcmp(found->e_path, exp->m_export.e_path)!= 0)
                        {
-                               xlog(L_WARNING, "%s and %s have name filehandle for %s, using first",
+                               xlog(L_WARNING, "%s and %s have same filehandle for %s, using first",
                                     found->e_path, exp->m_export.e_path, dom);
                        }
                }
        }
                                     found->e_path, exp->m_export.e_path, dom);
                        }
                }
        }
+       if (found && 
+           found->e_mountpoint &&
+           !is_mountpoint(found->e_mountpoint[0]?
+                          found->e_mountpoint:
+                          found->e_path)) {
+               /* Cannot export this yet 
+                * should log a warning, but need to rate limit
+                  xlog(L_WARNING, "%s not exported as %d not a mountpoint",
+                  found->e_path, found->e_mountpoint);
+                */
+               /* FIXME we need to make sure we re-visit this later */
+               goto out;
+       }
+       if (!found && dev_missing) {
+               /* The missing dev could be what we want, so just be
+                * quite rather than returning stale yet
+                */
+               goto out;
+       }
+
        cache_export_ent(dom, found);
 
        qword_print(f, dom);
        cache_export_ent(dom, found);
 
        qword_print(f, dom);
@@ -335,7 +361,7 @@ void cache_export(nfs_export *exp)
  * } <> /proc/fs/nfs/filehandle
  */
 struct nfs_fh_len *
  * } <> /proc/fs/nfs/filehandle
  */
 struct nfs_fh_len *
-cache_get_filehandle(nfs_export *exp, int len)
+cache_get_filehandle(nfs_export *exp, int len, char *p)
 {
        FILE *f = fopen("/proc/fs/nfs/filehandle", "r+");
        char buf[200];
 {
        FILE *f = fopen("/proc/fs/nfs/filehandle", "r+");
        char buf[200];
@@ -345,7 +371,7 @@ cache_get_filehandle(nfs_export *exp, int len)
                return NULL;
 
        qword_print(f, exp->m_client->m_hostname);
                return NULL;
 
        qword_print(f, exp->m_client->m_hostname);
-       qword_print(f, exp->m_export.e_path);
+       qword_print(f, p);
        qword_printint(f, len); 
        qword_eol(f);
        
        qword_printint(f, len); 
        qword_eol(f);