@@ -10,6 +10,6 @@ exportfs_SOURCES = exportfs.c
exportfs_LDADD = ../../support/export/libexport.a \
../../support/nfs/libnfs.la \
../../support/misc/libmisc.a \
- $(LIBWRAP) $(LIBNSL)
+ $(LIBWRAP) $(LIBNSL) $(LIBPTHREAD)
MAINTAINERCLEANFILES = Makefile.in
@@ -33,8 +33,10 @@
#include "sockaddr.h"
#include "misc.h"
+#include "nfsd_path.h"
#include "nfslib.h"
#include "exportfs.h"
+#include "workqueue.h"
#include "xlog.h"
#include "conffile.h"
@@ -52,6 +54,29 @@ static const char *lockfile = EXP_LOCKFILE;
static int _lockfd = -1;
struct state_paths etab;
+static struct xthread_workqueue *exportfs_wq;
+
+static ssize_t exportfs_write(int fd, const char *buf, size_t len)
+{
+ if (exportfs_wq)
+ return xthread_write(exportfs_wq, fd, buf, len);
+ return write(fd, buf, len);
+}
+
+static void
+exportfs_setup_workqueue(void)
+{
+ const char *chroot = nfsd_path_nfsd_rootdir();
+
+ if (!chroot || chroot[0] == '\0')
+ return;
+ if (chroot[0] == '/' && chroot[1] == '\0')
+ return;
+ exportfs_wq = xthread_workqueue_alloc();
+ if (!exportfs_wq)
+ return;
+ xthread_workqueue_chroot(exportfs_wq, chroot);
+}
/*
* If we aren't careful, changes made by exportfs can be lost
@@ -109,6 +134,7 @@ main(int argc, char **argv)
conf_init_file(NFS_CONFFILE);
xlog_from_conffile("exportfs");
+ nfsd_path_init();
/* NOTE: following uses "mountd" section of nfs.conf !!!! */
s = conf_get_str("mountd", "state-directory-path");
@@ -181,6 +207,8 @@ main(int argc, char **argv)
}
}
+ exportfs_setup_workqueue();
+
/*
* Serialize things as best we can
*/
@@ -505,7 +533,7 @@ static int test_export(nfs_export *exp, int with_fsid)
fd = open("/proc/net/rpc/nfsd.export/channel", O_WRONLY);
if (fd < 0)
return 0;
- n = write(fd, buf, strlen(buf));
+ n = exportfs_write(fd, buf, strlen(buf));
close(fd);
if (n < 0)
return 0;
@@ -521,7 +549,7 @@ validate_export(nfs_export *exp)
* otherwise trial-export to '-test-client-' and check for failure.
*/
struct stat stb;
- char *path = exp->m_export.e_path;
+ char *path = exportent_realpath(&exp->m_export);
struct statfs64 stf;
int fs_has_fsid = 0;
Ensure that exportfs also resolves paths relative to the nfsd root directory Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- utils/exportfs/Makefile.am | 2 +- utils/exportfs/exportfs.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-)