summaryrefslogtreecommitdiffstats
path: root/utils/mountd
diff options
context:
space:
mode:
authorneilbrown <neilbrown>2003-05-30 05:16:52 +0000
committerneilbrown <neilbrown>2003-05-30 05:16:52 +0000
commitd38ea02d0e4bcdc4e0114567028596f7bcba45b9 (patch)
treea464ad88e48a90c4efa48fd4caefc843caa88d05 /utils/mountd
parent936ecbb5750e0e29b9e2464998a8e03eca617b72 (diff)
downloadnfs-utils-d38ea02d0e4bcdc4e0114567028596f7bcba45b9.tar.gz
nfs-utils-d38ea02d0e4bcdc4e0114567028596f7bcba45b9.tar.xz
nfs-utils-d38ea02d0e4bcdc4e0114567028596f7bcba45b9.zip
new "mountpoint" export option.
Diffstat (limited to 'utils/mountd')
-rw-r--r--utils/mountd/cache.c28
-rw-r--r--utils/mountd/mountd.c7
2 files changed, 34 insertions, 1 deletions
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index c5bc53f..9d7d20d 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -100,6 +100,7 @@ void nfsd_fh(FILE *f)
struct exportent *found = NULL;
nfs_export *exp;
int i;
+ int dev_missing = 0;
if (readline(fileno(f), &lbuf, &lbuflen) != 1)
return;
@@ -145,6 +146,11 @@ void nfsd_fh(FILE *f)
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)
@@ -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)
{
- 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);
}
}
}
+ 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);
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index b1bce1d..3769c92 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -282,6 +282,13 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3)
xlog(L_WARNING, "request to export directory %s below nearest filesystem %s",
p, exp->m_export.e_path);
*error = NFSERR_ACCES;
+ } else if (exp->m_export.e_mountpoint &&
+ !is_mountpoint(exp->m_export.e_mountpoint[0]?
+ exp->m_export.e_mountpoint:
+ exp->m_export.e_path)) {
+ xlog(L_WARNING, "request to export an unmounted filesystem: %s",
+ p);
+ *error = NFSERR_NOENT;
} else if (new_cache) {
/* This will be a static private nfs_export with just one
* address. We feed it to kernel then extract the filehandle,