Hide Forgot
+++ This bug was initially created as a clone of Bug #1007626 +++ Description of problem: when start nfs server, we should verify the export entries: -when I export an directory in tmpfs without fsid= specified, -I can export successfuly, * but can not mount it from client. --the server log indicate: "Cannot export $dir, possibly unsupported filesystem or fsid= required" -We think that, exportfs should verify the export entries, if invalid then tell user that's invalid, cannot export Version-Release number of selected component (if applicable): all version in RHEL5.9 5.10 6.x 7.0 How reproducible: 100% Steps to Reproduce: 0. backup your /etc/exports 1. echo "/dev/shm *(ro)" >/etc/exports 2. service nfs restart 3. exportfs or showmount -e Actual results: service nfs restart ok exportfs output: /dev/shm <world> Expected results: service nfs restart should output error/warn: and should not export success, exportfs no output Additional info:
Debug, and review the code of exportfs, find that: this is a bug of exportfs(also about kernel): static int test_export(char *path, int with_fsid) { char buf[1024]; int fd, n; sprintf(buf, "-test-client- %s 3 %d -1 -1 0\n", path, with_fsid ? NFSEXP_FSID : 0); fd = open("/proc/net/rpc/nfsd.export/channel", O_WRONLY); if (fd < 0) return 0; n = write(fd, buf, strlen(buf)); close(fd); if (n < 0) return 0; return 1; } 1. if the path is an tmpfs(no uuid), and with_fsid==0, this function test_export still return 1 (write success). that's wrong. 2. and another problem: validate_export() just generate log and return void. We think that validate_export() should return an int value to indicate whether the path can export. And in export_all(), should not export the path if invalid; static void export_all(int verbose) { nfs_export *exp; int i; for (i = 0; i < MCL_MAXTYPES; i++) { for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { if (verbose) printf("exporting %s:%s\n", exp->m_client->m_hostname, exp->m_export.e_path); exp->m_xtabent = 1; exp->m_mayexport = 1; exp->m_changed = 1; exp->m_warned = 0; validate_export(exp); } } } static void <<<- should return int value to indicate whether the path can export validate_export(nfs_export *exp) {
#BEGIN --- exportfs.c 2013-06-06 15:12:58.881567360 +0800 +++ exportfs.c.new 2013-09-14 14:50:56.719877598 +0800 @@ -475,6 +475,9 @@ validate_export(nfs_export *exp) xlog(L_ERROR, "%s does not support NFS export", path); return; + } else { + xlog(L_ERROR, "Assert: test_export() %s fail", path); + return; } } #END this patch could avoid the test_export work fail.
The following error is now logged for file system requiring fsids exportfs[4042]: exportfs: /dev/shm requires fsid= for NFS export
This issue is actually that "exportfs" should NOT show the invalid entries. For examples: [root ~]# exportfs -ua [root ~]# exportfs -i *:/not.exist exportfs: Failed to stat /not.exist: No such file or directory [root ~]# echo $? 1 [root ~]# exportfs /not.exist <world> <<<<<<<<<<< Invalid path is exported anyway [root ~]# However, as the rhel6 bug 1007627 and rhel5 bug 1007626 are both closed as WONTFIX, updating this one to be WONTFIX too. Please correct me if there's any concern.