summaryrefslogtreecommitdiffstats
path: root/utils/mountd/cache.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-04-02 13:26:01 +1000
committerNeil Brown <neilb@suse.de>2007-04-02 13:26:01 +1000
commitc57ae7ee252e665fcc515ae938f0e78ce1d736e9 (patch)
tree6822f01a1a70e8d6e13f2adc6dfeca032d26f641 /utils/mountd/cache.c
parentdda3455d8b96a7b078bc00c113e1af15ed421d5b (diff)
downloadnfs-utils-c57ae7ee252e665fcc515ae938f0e78ce1d736e9.tar.gz
nfs-utils-c57ae7ee252e665fcc515ae938f0e78ce1d736e9.tar.xz
nfs-utils-c57ae7ee252e665fcc515ae938f0e78ce1d736e9.zip
mountd - improve checks and error messages for export failure.
If an attempt is made to export a non-(dir|file), just ignore it. This should get caught by exportfs. If an attempt is made to export a non-exportable filesystem, report an error. Hopefully exportfs can trap some these as well, but catching them in mountd as well is good. Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'utils/mountd/cache.c')
-rw-r--r--utils/mountd/cache.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 85e8975..d068843 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -397,6 +397,9 @@ void nfsd_fh(FILE *f)
dev_missing ++;
if (stat(path, &stb) != 0)
continue;
+ if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) {
+ continue;
+ }
switch(fsidtype){
case FSID_DEV:
case FSID_MAJOR_MINOR:
@@ -620,9 +623,12 @@ void nfsd_export(FILE *f)
}
if (found) {
- if (dump_to_cache(f, dom, path, &found->m_export) < 0)
+ if (dump_to_cache(f, dom, path, &found->m_export) < 0) {
+ xlog(L_WARNING,
+ "Cannot export %s, possibly unsupported filesystem"
+ " or fsid= required", path);
dump_to_cache(f, dom, path, NULL);
- else
+ } else
mountlist_add(dom, path);
} else {
dump_to_cache(f, dom, path, NULL);
@@ -697,9 +703,14 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
return -1;
err = dump_to_cache(f, domain, exp->e_path, exp);
+ if (err) {
+ xlog(L_WARNING,
+ "Cannot export %s, possibly unsupported filesystem or"
+ " fsid= required", exp->e_path);
+ }
mountlist_add(domain, exp->e_path);
- while ((exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
+ while (err == 0 && (exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
/* really an 'if', but we can break out of
* a 'while' more easily */
/* Look along 'path' for other filesystems
@@ -717,16 +728,17 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
dev = stb.st_dev;
while(path[l] == '/') {
char c;
- int err;
+ /* errors for submount should fail whole filesystem */
+ int err2;
l++;
while (path[l] != '/' && path[l])
l++;
c = path[l];
path[l] = 0;
- err = lstat(path, &stb);
+ err2 = lstat(path, &stb);
path[l] = c;
- if (err < 0)
+ if (err2 < 0)
break;
if (stb.st_dev == dev)
continue;