Create the nfsrahead command (bz 2143747)
Signed-off-by: Steve Dickson <steved@redhat.com> Resolves: bz2143747
This commit is contained in:
parent
63be7eff36
commit
53ec4c7bad
406
nfs-utils-2.5.4-nfsrahead-cmd.patch
Normal file
406
nfs-utils-2.5.4-nfsrahead-cmd.patch
Normal file
@ -0,0 +1,406 @@
|
||||
diff --git a/.gitignore b/.gitignore
|
||||
index c89d1cd2..df791a83 100644
|
||||
--- a/.gitignore
|
||||
+++ b/.gitignore
|
||||
@@ -61,6 +61,8 @@ utils/statd/statd
|
||||
tools/locktest/testlk
|
||||
tools/getiversion/getiversion
|
||||
tools/nfsconf/nfsconf
|
||||
+tools/nfsrahead/nfsrahead
|
||||
+tools/nfsrahead/99-nfs_bdi.rules
|
||||
support/export/mount.h
|
||||
support/export/mount_clnt.c
|
||||
support/export/mount_xdr.c
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d01ce6e4..3f48bd54 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -251,6 +251,16 @@ AC_ARG_ENABLE(nfsdcld,
|
||||
enable_nfsdcld=$enableval,
|
||||
enable_nfsdcld="yes")
|
||||
|
||||
+AC_ARG_ENABLE(nfsrahead,
|
||||
+ [AS_HELP_STRING([--disable-nfsrahead],[disable nfsrahead command @<:@default=no@:>@])],
|
||||
+ enable_nfsrahead=$enableval,
|
||||
+ enable_nfsrahead="yes")
|
||||
+ AM_CONDITIONAL(CONFIG_NFSRAHEAD, [test "$enable_nfsrahead" = "yes" ])
|
||||
+ if test "$enable_nfsrahead" = yes; then
|
||||
+ dnl Check for -lmount
|
||||
+ PKG_CHECK_MODULES([LIBMOUNT], [mount])
|
||||
+ fi
|
||||
+
|
||||
AC_ARG_ENABLE(nfsdcltrack,
|
||||
[AC_HELP_STRING([--disable-nfsdcltrack],
|
||||
[disable NFSv4 clientid tracking programs @<:@default=no@:>@])],
|
||||
@@ -712,6 +722,7 @@ AC_CONFIG_FILES([
|
||||
tools/rpcgen/Makefile
|
||||
tools/mountstats/Makefile
|
||||
tools/nfs-iostat/Makefile
|
||||
+ tools/nfsrahead/Makefile
|
||||
tools/rpcctl/Makefile
|
||||
tools/nfsdclnts/Makefile
|
||||
tools/nfsconf/Makefile
|
||||
diff --git a/nfs.conf b/nfs.conf
|
||||
index bc1de8d1..6aec1dd9 100644
|
||||
--- a/nfs.conf
|
||||
+++ b/nfs.conf
|
||||
@@ -5,6 +5,10 @@
|
||||
[general]
|
||||
# pipefs-directory=/var/lib/nfs/rpc_pipefs
|
||||
#
|
||||
+[nfsrahead]
|
||||
+# nfs=15000
|
||||
+# nfs4=16000
|
||||
+#
|
||||
[exports]
|
||||
# rootdir=/export
|
||||
#
|
||||
diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
|
||||
index be487a11..e74083e9 100644
|
||||
--- a/systemd/nfs.conf.man
|
||||
+++ b/systemd/nfs.conf.man
|
||||
@@ -294,6 +294,17 @@ Only
|
||||
.B debug=
|
||||
is recognized.
|
||||
|
||||
+.TP
|
||||
+.B nfsrahead
|
||||
+Recognized values:
|
||||
+.BR nfs ,
|
||||
+.BR nfsv4 ,
|
||||
+.BR default .
|
||||
+
|
||||
+See
|
||||
+.BR nfsrahead (5)
|
||||
+for deatils.
|
||||
+
|
||||
.SH FILES
|
||||
.TP 10n
|
||||
.I /etc/nfs.conf
|
||||
diff --git a/tools/Makefile.am b/tools/Makefile.am
|
||||
index c3feabbe..48fd0cdf 100644
|
||||
--- a/tools/Makefile.am
|
||||
+++ b/tools/Makefile.am
|
||||
@@ -12,6 +12,10 @@ if CONFIG_NFSDCLD
|
||||
OPTDIRS += nfsdclddb
|
||||
endif
|
||||
|
||||
+if CONFIG_NFSRAHEAD
|
||||
+OPTDIRS += nfsrahead
|
||||
+endif
|
||||
+
|
||||
SUBDIRS = locktest rpcdebug nlmtest mountstats nfs-iostat rpcctl nfsdclnts $(OPTDIRS)
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
diff --git a/tools/nfsrahead/99-nfs.rules b/tools/nfsrahead/99-nfs.rules
|
||||
new file mode 100644
|
||||
index 00000000..c74914b2
|
||||
--- /dev/null
|
||||
+++ b/tools/nfsrahead/99-nfs.rules
|
||||
@@ -0,0 +1 @@
|
||||
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/libexec/nfsrahead %k", ATTR{read_ahead_kb}="%c"
|
||||
diff --git a/tools/nfsrahead/99-nfs.rules.in b/tools/nfsrahead/99-nfs.rules.in
|
||||
new file mode 100644
|
||||
index 00000000..648813c5
|
||||
--- /dev/null
|
||||
+++ b/tools/nfsrahead/99-nfs.rules.in
|
||||
@@ -0,0 +1 @@
|
||||
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="_libexecdir_/nfsrahead %k", ATTR{read_ahead_kb}="%c"
|
||||
diff --git a/tools/nfsrahead/Makefile.am b/tools/nfsrahead/Makefile.am
|
||||
new file mode 100644
|
||||
index 00000000..7e08233a
|
||||
--- /dev/null
|
||||
+++ b/tools/nfsrahead/Makefile.am
|
||||
@@ -0,0 +1,16 @@
|
||||
+libexec_PROGRAMS = nfsrahead
|
||||
+nfsrahead_SOURCES = main.c
|
||||
+nfsrahead_LDFLAGS= $(LIBMOUNT_LIBS)
|
||||
+nfsrahead_LDADD = ../../support/nfs/libnfsconf.la
|
||||
+
|
||||
+man5_MANS = nfsrahead.man
|
||||
+EXTRA_DIST = $(man5_MANS)
|
||||
+
|
||||
+udev_rulesdir = /usr/lib/udev/rules.d/
|
||||
+udev_rules_DATA = 99-nfs.rules
|
||||
+
|
||||
+99-nfs.rules: 99-nfs.rules.in $(builddefs)
|
||||
+ $(SED) "s|_libexecdir_|@libexecdir@|g" 99-nfs.rules.in > $@
|
||||
+
|
||||
+clean-local:
|
||||
+ $(RM) 99-nfs.rules
|
||||
diff --git a/tools/nfsrahead/main.c b/tools/nfsrahead/main.c
|
||||
new file mode 100644
|
||||
index 00000000..c83c6f71
|
||||
--- /dev/null
|
||||
+++ b/tools/nfsrahead/main.c
|
||||
@@ -0,0 +1,192 @@
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <errno.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+#include <libmount/libmount.h>
|
||||
+#include <sys/sysmacros.h>
|
||||
+
|
||||
+#include "xlog.h"
|
||||
+#include "conffile.h"
|
||||
+
|
||||
+#ifndef MOUNTINFO_PATH
|
||||
+#define MOUNTINFO_PATH "/proc/self/mountinfo"
|
||||
+#endif
|
||||
+
|
||||
+#define CONF_NAME "nfsrahead"
|
||||
+#define NFS_DEFAULT_READAHEAD 128
|
||||
+
|
||||
+/* Device information from the system */
|
||||
+struct device_info {
|
||||
+ char *device_number;
|
||||
+ dev_t dev;
|
||||
+ char *mountpoint;
|
||||
+ char *fstype;
|
||||
+};
|
||||
+
|
||||
+/* Convert a string in the format n:m to a device number */
|
||||
+static int fill_device_number(struct device_info *info)
|
||||
+{
|
||||
+ char *s = strdup(info->device_number), *p;
|
||||
+ char *maj_s, *min_s;
|
||||
+ unsigned int maj, min;
|
||||
+ int err = -EINVAL;
|
||||
+
|
||||
+ maj_s = p = s;
|
||||
+ for ( ; *p != ':' && *p != '\0'; p++)
|
||||
+ ;
|
||||
+
|
||||
+ if (*p == '\0')
|
||||
+ goto out_free;
|
||||
+
|
||||
+ err = 0;
|
||||
+ *p = '\0';
|
||||
+ min_s = p + 1;
|
||||
+
|
||||
+ maj = strtol(maj_s, NULL, 10);
|
||||
+ min = strtol(min_s, NULL, 10);
|
||||
+
|
||||
+ info->dev = makedev(maj, min);
|
||||
+out_free:
|
||||
+ free(s);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+#define sfree(ptr) if (ptr) free(ptr)
|
||||
+
|
||||
+/* device_info maintenance */
|
||||
+static void init_device_info(struct device_info *di, const char *device_number)
|
||||
+{
|
||||
+ di->device_number = strdup(device_number);
|
||||
+ di->dev = 0;
|
||||
+ di->mountpoint = NULL;
|
||||
+ di->fstype = NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void free_device_info(struct device_info *di)
|
||||
+{
|
||||
+ sfree(di->mountpoint);
|
||||
+ sfree(di->fstype);
|
||||
+ sfree(di->device_number);
|
||||
+}
|
||||
+
|
||||
+static int get_mountinfo(const char *device_number, struct device_info *device_info, const char *mountinfo_path)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ struct libmnt_table *mnttbl;
|
||||
+ struct libmnt_fs *fs;
|
||||
+ char *target;
|
||||
+
|
||||
+ init_device_info(device_info, device_number);
|
||||
+ if ((ret = fill_device_number(device_info)) < 0)
|
||||
+ goto out_free_device_info;
|
||||
+
|
||||
+ mnttbl = mnt_new_table();
|
||||
+
|
||||
+ if ((ret = mnt_table_parse_file(mnttbl, mountinfo_path)) < 0) {
|
||||
+ xlog(D_GENERAL, "Failed to parse %s\n", mountinfo_path);
|
||||
+ goto out_free_tbl;
|
||||
+ }
|
||||
+
|
||||
+ if ((fs = mnt_table_find_devno(mnttbl, device_info->dev, MNT_ITER_FORWARD)) == NULL) {
|
||||
+ ret = ENOENT;
|
||||
+ goto out_free_tbl;
|
||||
+ }
|
||||
+
|
||||
+ if ((target = (char *)mnt_fs_get_target(fs)) == NULL) {
|
||||
+ ret = ENOENT;
|
||||
+ goto out_free_fs;
|
||||
+ }
|
||||
+
|
||||
+ device_info->mountpoint = strdup(target);
|
||||
+ target = (char *)mnt_fs_get_fstype(fs);
|
||||
+ if (target)
|
||||
+ device_info->fstype = strdup(target);
|
||||
+
|
||||
+out_free_fs:
|
||||
+ mnt_free_fs(fs);
|
||||
+out_free_tbl:
|
||||
+ mnt_free_table(mnttbl);
|
||||
+out_free_device_info:
|
||||
+ free(device_info->device_number);
|
||||
+ device_info->device_number = NULL;
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int get_device_info(const char *device_number, struct device_info *device_info)
|
||||
+{
|
||||
+ int ret = ENOENT;
|
||||
+ for (int retry_count = 0; retry_count < 10 && ret != 0; retry_count++)
|
||||
+ ret = get_mountinfo(device_number, device_info, MOUNTINFO_PATH);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int conf_get_readahead(const char *kind) {
|
||||
+ int readahead = 0;
|
||||
+
|
||||
+ if((readahead = conf_get_num(CONF_NAME, kind, -1)) == -1)
|
||||
+ readahead = conf_get_num(CONF_NAME, "default", NFS_DEFAULT_READAHEAD);
|
||||
+
|
||||
+ return readahead;
|
||||
+}
|
||||
+
|
||||
+int main(int argc, char **argv)
|
||||
+{
|
||||
+ int ret = 0, retry, opt;
|
||||
+ struct device_info device;
|
||||
+ unsigned int readahead = 128, log_level, log_stderr = 0;
|
||||
+
|
||||
+
|
||||
+ log_level = D_ALL & ~D_GENERAL;
|
||||
+ while((opt = getopt(argc, argv, "dF")) != -1) {
|
||||
+ switch (opt) {
|
||||
+ case 'd':
|
||||
+ log_level = D_ALL;
|
||||
+ break;
|
||||
+ case 'F':
|
||||
+ log_stderr = 1;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ conf_init_file(NFS_CONFFILE);
|
||||
+
|
||||
+ xlog_stderr(log_stderr);
|
||||
+ xlog_syslog(~log_stderr);
|
||||
+ xlog_config(log_level, 1);
|
||||
+ xlog_open(CONF_NAME);
|
||||
+
|
||||
+ // xlog_err causes the system to exit
|
||||
+ if ((argc - optind) != 1)
|
||||
+ xlog_err("expected the device number of a BDI; is udev ok?");
|
||||
+
|
||||
+ for (retry = 0; retry <= 10; retry++ )
|
||||
+ if ((ret = get_device_info(argv[optind], &device)) == 0)
|
||||
+ break;
|
||||
+
|
||||
+ if (ret != 0) {
|
||||
+ xlog(D_GENERAL, "unable to find device %s\n", argv[optind]);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (strncmp("nfs", device.fstype, 3) != 0) {
|
||||
+ xlog(D_GENERAL,
|
||||
+ "not setting readahead for non supported fstype %s on device %s\n",
|
||||
+ device.fstype, argv[optind]);
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ readahead = conf_get_readahead(device.fstype);
|
||||
+
|
||||
+ xlog(D_FAC7, "setting %s readahead to %d\n", device.mountpoint, readahead);
|
||||
+
|
||||
+ printf("%d\n", readahead);
|
||||
+
|
||||
+out:
|
||||
+ free_device_info(&device);
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/tools/nfsrahead/nfsrahead.man b/tools/nfsrahead/nfsrahead.man
|
||||
new file mode 100644
|
||||
index 00000000..5488f633
|
||||
--- /dev/null
|
||||
+++ b/tools/nfsrahead/nfsrahead.man
|
||||
@@ -0,0 +1,72 @@
|
||||
+.\" Manpage for nfsrahead.
|
||||
+.nh
|
||||
+.ad l
|
||||
+.TH man 5 "08 Mar 2022" "1.0" "nfsrahead man page"
|
||||
+.SH NAME
|
||||
+
|
||||
+nfsrahead \- Configure the readahead for NFS mounts
|
||||
+
|
||||
+.SH SYNOPSIS
|
||||
+
|
||||
+nfsrahead [-F] [-d] <device>
|
||||
+
|
||||
+.SH DESCRIPTION
|
||||
+
|
||||
+\fInfsrahead\fR is a tool intended to be used with udev to set the \fIread_ahead_kb\fR parameter of NFS mounts, according to the configuration file (see \fICONFIGURATION\fR). \fIdevice\fR is the device number for the NFS backing device as provided by the kernel.
|
||||
+
|
||||
+.SH OPTIONS
|
||||
+.TP
|
||||
+.B -F
|
||||
+Send messages to
|
||||
+.I stderr
|
||||
+instead of
|
||||
+.I syslog
|
||||
+
|
||||
+.TP
|
||||
+.B -d
|
||||
+Increase the debugging level.
|
||||
+
|
||||
+.SH CONFIGURATION
|
||||
+.I nfsrahead
|
||||
+is configured in
|
||||
+.IR /etc/nfs.conf ,
|
||||
+in the section titled
|
||||
+.IR nfsrahead .
|
||||
+It accepts the following configurations.
|
||||
+
|
||||
+.TP
|
||||
+.B nfs=<value>
|
||||
+The readahead value applied to NFSv3 mounts.
|
||||
+
|
||||
+.TP
|
||||
+.B nfs4=<value>
|
||||
+The readahead value applied to NFSv4 mounts.
|
||||
+
|
||||
+.TP
|
||||
+.B default=<value>
|
||||
+The default configuration when none of the configurations above is set.
|
||||
+
|
||||
+.SH EXAMPLE CONFIGURATION
|
||||
+[nfsrahead]
|
||||
+.br
|
||||
+nfs=15000 # readahead of 15000 for NFSv3 mounts
|
||||
+.br
|
||||
+nfs4=16000 # readahead of 16000 for NFSv4 mounts
|
||||
+.br
|
||||
+default=128 # default is 128
|
||||
+
|
||||
+.SH SEE ALSO
|
||||
+
|
||||
+.BR mount.nfs (8),
|
||||
+.BR nfs (5),
|
||||
+.BR nfs.conf (5),
|
||||
+.BR udev (7),
|
||||
+.BR bcc-readahead (8)
|
||||
+
|
||||
+.SH BUGS
|
||||
+
|
||||
+No known bugs.
|
||||
+
|
||||
+.SH AUTHOR
|
||||
+
|
||||
+Thiago Rafael Becker <trbecker@gmail.com>
|
@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser
|
||||
Name: nfs-utils
|
||||
URL: http://linux-nfs.org/
|
||||
Version: 2.5.4
|
||||
Release: 16%{?dist}
|
||||
Release: 17%{?dist}
|
||||
Epoch: 1
|
||||
|
||||
# group all 32bit related archs
|
||||
@ -39,6 +39,7 @@ Patch012: nfs-utils-2.5.4-systemd-rpcstatd.patch
|
||||
#
|
||||
Patch013: nfs-utils-2.5.4-nfsd-man-4vers.patch
|
||||
Patch014: nfs-utils-2.5.4-mount-null-ptr.patch
|
||||
Patch015: nfs-utils-2.5.4-nfsrahead-cmd.patch
|
||||
|
||||
Patch100: nfs-utils-1.2.1-statdpath-man.patch
|
||||
Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch
|
||||
@ -366,6 +367,8 @@ fi
|
||||
%{_sbindir}/nfsdcld
|
||||
%{_sbindir}/nfsdclddb
|
||||
%{_sbindir}/nfsdclnts
|
||||
%{_libexecdir}/nfsrahead
|
||||
%{_udevrulesdir}/99-nfs.rules
|
||||
%{_mandir}/*/*
|
||||
%{_pkgdir}/*/*
|
||||
|
||||
@ -402,6 +405,8 @@ fi
|
||||
%{_sbindir}/rpc.gssd
|
||||
%{_sbindir}/start-statd
|
||||
%{_sbindir}/showmount
|
||||
%{_libexecdir}/nfsrahead
|
||||
%{_udevrulesdir}/99-nfs.rules
|
||||
%attr(4755,root,root) /sbin/mount.nfs
|
||||
/sbin/mount.nfs4
|
||||
/sbin/rpc.statd
|
||||
@ -421,6 +426,7 @@ fi
|
||||
%{_mandir}/*/showmount.8.gz
|
||||
%{_mandir}/*/statd.8.gz
|
||||
%{_mandir}/*/umount.nfs.8.gz
|
||||
%{_mandir}/*/nfsrahead.5.gz
|
||||
%{_pkgdir}/*/rpc-pipefs-generator
|
||||
%{_pkgdir}/*/auth-rpcgss-module.service
|
||||
%{_pkgdir}/*/nfs-client.target
|
||||
@ -441,6 +447,8 @@ fi
|
||||
%{_sbindir}/rpcctl
|
||||
%{_sbindir}/nfsidmap
|
||||
%{_sbindir}/nfsstat
|
||||
%{_libexecdir}/nfsrahead
|
||||
%{_udevrulesdir}/99-nfs.rules
|
||||
%attr(4755,root,root) /sbin/mount.nfs
|
||||
/sbin/mount.nfs4
|
||||
/sbin/umount.nfs
|
||||
@ -448,6 +456,7 @@ fi
|
||||
%{_mandir}/*/nfs.5.gz
|
||||
%{_mandir}/*/nfs.conf.5.gz
|
||||
%{_mandir}/*/nfsmount.conf.5.gz
|
||||
%{_mandir}/*/nfsrahead.5.gz
|
||||
%{_mandir}/*/gssd.8.gz
|
||||
%{_mandir}/*/mount.nfs.8.gz
|
||||
%{_mandir}/*/nfsconf.8.gz
|
||||
@ -472,6 +481,9 @@ fi
|
||||
%{_mandir}/*/nfsiostat.8.gz
|
||||
|
||||
%changelog
|
||||
* Thu Dec 1 2022 Steve Dickson <steved@redhat.com> 2.5.4-17
|
||||
- Create the nfsrahead command (bz 2143747)
|
||||
|
||||
* Mon Nov 14 2022 Steve Dickson <steved@redhat.com> 2.5.4-16
|
||||
- nfsd.man: Explain that setting nfsv4=n turns off all v4 versions (bz 2042362)
|
||||
- mount.nfs: fix NULL pointer derefernce in nfs_parse_square_bracket (bz 2136807)
|
||||
|
Loading…
Reference in New Issue
Block a user