@@ -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
@@ -52,6 +52,33 @@ 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;
+
+ chroot = conf_get_str("nfsd", "chroot");
+ if (!chroot || *chroot == '\0')
+ return;
+ /* Strip leading '/' */
+ while (chroot[0] == '/' && chroot[1] == '/')
+ chroot++;
+ 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
@@ -181,6 +208,8 @@ main(int argc, char **argv)
}
}
+ exportfs_setup_workqueue();
+
/*
* Serialize things as best we can
*/
@@ -505,7 +534,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;
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- utils/exportfs/Makefile.am | 2 +- utils/exportfs/exportfs.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-)