summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneilbrown <neilbrown>2000-08-23 01:17:52 +0000
committerneilbrown <neilbrown>2000-08-23 01:17:52 +0000
commit82d42dffa84fb884684f75769ca13668c5188a5e (patch)
tree66d5ee003f36756f622dfdb8677f35a2de9e3852
parentda25e1aa006bafb4dd08e2ffedbd42d7c1f4036b (diff)
downloadnfs-utils-82d42dffa84fb884684f75769ca13668c5188a5e.tar.gz
nfs-utils-82d42dffa84fb884684f75769ca13668c5188a5e.tar.xz
nfs-utils-82d42dffa84fb884684f75769ca13668c5188a5e.zip
1/ be less trusting of information in /var/lib/nfs/xtab. Add things to
kernel even if they are in here. 2/ O_CREAT [ex]log when locking for write incase they don't exist 3/ added etc/debian diretory with some files
-rw-r--r--ChangeLog20
-rw-r--r--etc/debian/nfs-common73
-rw-r--r--etc/debian/nfs-kernel-server84
-rw-r--r--support/export/xtab.c19
-rw-r--r--support/include/exportfs.h4
-rw-r--r--support/nfs/xio.c2
-rw-r--r--utils/exportfs/exportfs.c2
-rw-r--r--utils/mountd/mountd.c2
8 files changed, 197 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2fcd4a4..3663a64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2000-08-23 Neil Brown <neilb@cse.unsw.edu.au>
+
+ * support/export/xtab.c(xtab_read): introduce new mode for
+ reading xtab. i.e. a list of exports that might be known to the
+ kernel, or might not. These are flagged as m_exported == -1
+ * support/export/xtab.c(xtab_mount_read): call xtab_read with new
+ value "2" for xtab, meaning don't trust this too much.
+ * support/include/exportfs.h(struct mexport): changed m_exported
+ from one bit to an int so that it can hold new value
+ * utils/exportfs/exportfs.c(exportfs_ipdate): add an export to the
+ kernel if it is uncertain whether the kernel knows (m_exported == -1)
+ * utils/mountd/mountd.c(get_rootfh): similarly export to kernel if
+ status is uncertain
+
+ * support/nfs/xio.c(xflock): added O_CREAT when getting
+ a write lock so that missing files aren't fatal.
+
+ * etc/debian/nfs-common: new file from "potato"
+ * etc/debian/nfs-kernel-server: new file from "potato" plus fixes.
+
2000-08-09 H.J. Lu <hjl@lucon.org>
* etc/redhat/nfs.init: Run /usr/sbin/exportfs first during
diff --git a/etc/debian/nfs-common b/etc/debian/nfs-common
new file mode 100644
index 0000000..a9dcb5d
--- /dev/null
+++ b/etc/debian/nfs-common
@@ -0,0 +1,73 @@
+#!/bin/sh
+#
+# nfs-common This shell script takes care of starting and stopping
+# common daemons required for NFS clients and servers.
+#
+# chkconfig: 345 20 80
+# description: NFS is a popular protocol for file sharing across \
+# TCP/IP networks. This service provides NFS file \
+# locking functionality.
+#
+
+PREFIX=
+
+NEED_LOCKD=yes
+if test -f /proc/ksyms
+then
+ # We need to be conservative and run lockd,
+ # unless we can prove that it isn't required.
+ grep -q lockdctl /proc/ksyms || NEED_LOCKD=no
+fi
+
+[ -x $PREFIX/sbin/rpc.statd ] || exit 0
+[ -x $PREFIX/sbin/rpc.lockd ] || [ "$NEED_LOCKD" = no ] || exit 0
+
+# What is this?
+DESC="NFS common utilities"
+
+# Make sure that daemon cwds are in root fs.
+cd /
+
+# See how we were called.
+case "$1" in
+ start)
+ printf "Starting $DESC:"
+ printf " statd"
+ start-stop-daemon --start --quiet \
+ --exec $PREFIX/sbin/rpc.statd
+ if [ "$NEED_LOCKD" = yes ]
+ then
+ printf " lockd"
+ start-stop-daemon --start --quiet \
+ --exec $PREFIX/sbin/rpc.lockd
+ fi
+ echo "."
+ ;;
+
+ stop)
+ printf "Stopping $DESC:"
+ if [ "$NEED_LOCKD" = yes ]
+ then
+ printf " lockd"
+ start-stop-daemon --stop --oknodo --quiet \
+ --name lockd --user root --signal 9
+ fi
+ printf " statd"
+ start-stop-daemon --stop --oknodo --quiet \
+ --exec $PREFIX/sbin/rpc.statd
+ echo "."
+ ;;
+
+ restart | force-reload)
+ $0 stop
+ sleep 1
+ $0 start
+ ;;
+
+ *)
+ echo "Usage: nfs-common {start|stop|restart}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/etc/debian/nfs-kernel-server b/etc/debian/nfs-kernel-server
new file mode 100644
index 0000000..826e126
--- /dev/null
+++ b/etc/debian/nfs-kernel-server
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# nfs-kernel-server
+# This shell script takes care of starting and stopping
+# the kernel-mode NFS server.
+#
+# chkconfig: 345 60 20
+# description: NFS is a popular protocol for file sharing across TCP/IP \
+# networks. This service provides NFS server functionality, \
+# which is configured via the /etc/exports file.
+#
+
+PREFIX=/usr
+[ -x $PREFIX/sbin/rpc.nfsd ] || exit 0
+[ -x $PREFIX/sbin/rpc.mountd ] || exit 0
+[ -x $PREFIX/sbin/exportfs ] || exit 0
+
+# What is this?
+DESC="NFS kernel daemon"
+
+RPCNFSDCOUNT=8 # Number of servers to be started up by default
+RPCMOUNTDOPTS=
+
+# Make sure that daemon cwds are in root fs.
+cd /
+
+# See how we were called.
+case "$1" in
+ start)
+ if grep -q '^/' /etc/exports; then
+ printf "Exporting directories for $DESC..."
+ $PREFIX/sbin/exportfs -r
+ echo "done."
+
+ printf "Starting $DESC:"
+ printf " nfsd"
+ start-stop-daemon --start --quiet \
+ --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
+ printf " mountd"
+ $PREFIX/bin/rpcinfo -u localhost nfs 3 > /dev/null 2>&1 ||
+ RPCMOUNTDOPTS="$RPCMOUNDOPTS --no-nfs-version 3"
+ start-stop-daemon --start --quiet \
+ --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS
+ echo "."
+
+ else
+ echo "Not starting $DESC: No exports."
+ fi
+ ;;
+
+ stop)
+ printf "Stopping $DESC: mountd"
+ start-stop-daemon --stop --oknodo --quiet \
+ --exec $PREFIX/sbin/rpc.mountd
+ printf " nfsd"
+ start-stop-daemon --stop --oknodo --quiet \
+ --name nfsd --user root --signal 2
+ echo "."
+
+ printf "Unexporting directories for $DESC..."
+ $PREFIX/sbin/exportfs -au
+ echo "done."
+ ;;
+
+ reload | force-reload)
+ printf "Re-exporting directories for $DESC..."
+ $PREFIX/sbin/exportfs -r
+ echo "done."
+ ;;
+
+ restart)
+ $0 stop
+ sleep 1
+ $0 start
+ ;;
+
+ *)
+ echo "Usage: nfs-kernel-server {start|stop|reload|force-reload|restart}"
+ exit 1
+ ;;
+esac
+
+exit 0
+
diff --git a/support/export/xtab.c b/support/export/xtab.c
index c8adc06..b0c3095 100644
--- a/support/export/xtab.c
+++ b/support/export/xtab.c
@@ -21,6 +21,10 @@
static int
xtab_read(char *xtab, int is_export)
{
+ /* is_export == 0 => reading /proc/fs/nfs/exports - we know these things are exported to kernel
+ * is_export == 1 => reading /var/lib/nfs/etab - these things are allowed to be exported
+ * is_export == 2 => reading /var/lib/nfs/xtab - these things might be known to kernel
+ */
struct exportent *xp;
nfs_export *exp;
int lockid;
@@ -33,11 +37,18 @@ xtab_read(char *xtab, int is_export)
!(exp = export_create(xp))) {
continue;
}
- if (is_export) {
+ switch (is_export) {
+ case 0:
+ exp->m_exported = 1;
+ break;
+ case 1:
exp->m_xtabent = 1;
exp->m_mayexport = 1;
- } else
- exp->m_exported = 1;
+ break;
+ case 2:
+ exp->m_exported = -1;/* may be exported */
+ break;
+ }
}
endexportent();
xfunlock(lockid);
@@ -53,7 +64,7 @@ xtab_mount_read(void)
close(fd);
return xtab_read(_PATH_PROC_EXPORTS, 0);
} else
- return xtab_read(_PATH_XTAB, 1);
+ return xtab_read(_PATH_XTAB, 2);
}
int
diff --git a/support/include/exportfs.h b/support/include/exportfs.h
index d440dc1..3ca248e 100644
--- a/support/include/exportfs.h
+++ b/support/include/exportfs.h
@@ -36,8 +36,8 @@ typedef struct mexport {
struct mexport * m_next;
struct mclient * m_client;
struct exportent m_export;
- int m_exported : 1, /* known to knfsd */
- m_xtabent : 1, /* xtab entry exists */
+ int m_exported; /* known to knfsd. -1 means not sure */
+ int m_xtabent : 1, /* xtab entry exists */
m_mayexport: 1, /* derived from xtabbed */
m_changed : 1; /* options (may) have changed */
} nfs_export;
diff --git a/support/nfs/xio.c b/support/nfs/xio.c
index 49ee6bc..0a250fc 100644
--- a/support/nfs/xio.c
+++ b/support/nfs/xio.c
@@ -55,7 +55,7 @@ xflock(char *fname, char *type)
struct flock fl = { readonly? F_RDLCK : F_WRLCK, SEEK_SET, 0, 0, 0 };
int fd;
- if ((fd = open(fname, readonly? O_RDONLY : O_RDWR)) < 0) {
+ if ((fd = open(fname, readonly? O_RDONLY : (O_RDWR|O_CREAT))) < 0) {
xlog(L_WARNING, "could not open %s for locking", fname);
return -1;
}
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
index c3bb5ba..0504709 100644
--- a/utils/exportfs/exportfs.c
+++ b/utils/exportfs/exportfs.c
@@ -132,7 +132,7 @@ exports_update(int verbose)
nfs_export *exp;
for (exp = exportlist[MCL_FQDN]; exp; exp=exp->m_next) {
- if (exp->m_mayexport && (!exp->m_exported || exp->m_changed)) {
+ if (exp->m_mayexport && ((exp->m_exported<1) || exp->m_changed)) {
if (verbose)
printf("%sexporting %s:%s to kernel\n",
exp->m_exported ?"re":"",
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index 1cfdc74..1eeefdc 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -263,7 +263,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3)
} else {
struct nfs_fh_len *fh;
- if (!exp->m_exported)
+ if (exp->m_exported<1)
export_export(exp);
if (!exp->m_xtabent)
xtab_append(exp);