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
+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
--- /dev/null
+#!/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
--- /dev/null
+#!/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
+
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;
!(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);
close(fd);
return xtab_read(_PATH_PROC_EXPORTS, 0);
} else
- return xtab_read(_PATH_XTAB, 1);
+ return xtab_read(_PATH_XTAB, 2);
}
int
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;
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;
}
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":"",
} 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);