Hello community, here is the log from the commit of package cifs-utils for openSUSE:Factory checked in at 2018-12-03 10:05:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cifs-utils (Old) and /work/SRC/openSUSE:Factory/.cifs-utils.new.19453 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cifs-utils" Mon Dec 3 10:05:08 2018 rev:54 rq:652194 version:6.8 Changes: -------- --- /work/SRC/openSUSE:Factory/cifs-utils/cifs-utils.changes 2018-03-20 21:50:18.555396163 +0100 +++ /work/SRC/openSUSE:Factory/.cifs-utils.new.19453/cifs-utils.changes 2018-12-03 10:05:26.267982262 +0100 @@ -1,0 +2,24 @@ +Mon Sep 10 12:29:37 UTC 2018 - [email protected] + +- Update to cifs-utils 6.8. + + document more mount options + + man pages now generated from RST files + + add python-docutils build dependency + + update keyring to check tarball signature + + remove 0001-manpage-correct-typos-and-spelling-mistakes.patch + + remove 0002-mount.cifs-document-SMBv3.1.1-and-new-seal-option.patch +- Add typo corrections, better doc and configure fixes from upstream + + add 0001-docs-cleanup-rst-formating.patch + + add 0002-mount.cifs.rst-document-new-no-handlecache-mount-opt.patch + + add 0003-manpage-update-mount.cifs-manpage-with-info-about-rd.patch + + add 0004-checkopts-add-python-script-to-cross-check-mount-opt.patch + + add 0005-mount.cifs.rst-document-missing-options-correct-wron.patch + + add 0006-cifs-utils-support-rst2man-3.patch + + add 0007-checkopts-report-duplicated-options-in-man-page.patch + + add 0008-mount.cifs.rst-more-cleanups.patch + + add 0009-mount.cifs.rst-document-vers-3-mount-option.patch + + add 0010-mount.cifs.rst-document-vers-3.02-mount-option.patch +- Cleanup spec file + * assume SUSE vendor and SLE >= 11 + +------------------------------------------------------------------- @@ -4,0 +29,9 @@ + +------------------------------------------------------------------- +Sun Feb 18 08:21:58 UTC 2018 - [email protected] + +- update to 6.7: + * mount.cifs cleanups +- includes 6.6: + * cleanup/overhaul of cifs.upcall krb5 credcache handling +- partial cleanup with spec-cleaner Old: ---- 0001-manpage-correct-typos-and-spelling-mistakes.patch 0002-mount.cifs-document-SMBv3.1.1-and-new-seal-option.patch cifs-utils-6.5.tar.bz2 cifs-utils-6.5.tar.bz2.asc New: ---- 0001-docs-cleanup-rst-formating.patch 0002-mount.cifs.rst-document-new-no-handlecache-mount-opt.patch 0003-manpage-update-mount.cifs-manpage-with-info-about-rd.patch 0004-checkopts-add-python-script-to-cross-check-mount-opt.patch 0005-mount.cifs.rst-document-missing-options-correct-wron.patch 0006-cifs-utils-support-rst2man-3.patch 0007-checkopts-report-duplicated-options-in-man-page.patch 0008-mount.cifs.rst-more-cleanups.patch 0009-mount.cifs.rst-document-vers-3-mount-option.patch 0010-mount.cifs.rst-document-vers-3.02-mount-option.patch cifs-utils-6.8.tar.bz2 cifs-utils-6.8.tar.bz2.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cifs-utils.spec ++++++ --- /var/tmp/diff_new_pack.yQzvm7/_old 2018-12-03 10:05:26.927981658 +0100 +++ /var/tmp/diff_new_pack.yQzvm7/_new 2018-12-03 10:05:26.931981654 +0100 @@ -17,27 +17,40 @@ Name: cifs-utils -Version: 6.5 +Version: 6.8 Release: 0 Summary: Utilities for doing and managing mounts of the Linux CIFS filesystem License: GPL-3.0-or-later Group: System/Filesystems Url: http://www.samba.org/linux-cifs/cifs-utils/ +# origin git://git.samba.org/cifs-utils.git +# for-next https://github.com/piastry/cifs-utils.git Source: https://ftp.samba.org/pub/linux-cifs/%{name}/%{name}-%{version}.tar.bz2 Source5: https://ftp.samba.org/pub/linux-cifs/%{name}/%{name}-%{version}.tar.bz2.asc # http://ftp.samba.org/pub/linux-cifs/cifs-utils/cifs-utils-pubkey_70F3B981.asc Source6: cifs-utils.keyring Source100: README.cifstab.migration -%if "%{_vendor}" == "suse" -%define NET_CFGDIR network -%else -%define NET_CFGDIR network-scripts -%endif Source1: cifs.init -# fate#322075 -Patch0: 0001-manpage-correct-typos-and-spelling-mistakes.patch -Patch1: 0002-mount.cifs-document-SMBv3.1.1-and-new-seal-option.patch +Patch0: 0001-docs-cleanup-rst-formating.patch +Patch1: 0002-mount.cifs.rst-document-new-no-handlecache-mount-opt.patch +Patch2: 0003-manpage-update-mount.cifs-manpage-with-info-about-rd.patch +Patch3: 0004-checkopts-add-python-script-to-cross-check-mount-opt.patch +Patch4: 0005-mount.cifs.rst-document-missing-options-correct-wron.patch +Patch5: 0006-cifs-utils-support-rst2man-3.patch +Patch6: 0007-checkopts-report-duplicated-options-in-man-page.patch +Patch7: 0008-mount.cifs.rst-more-cleanups.patch +Patch8: 0009-mount.cifs.rst-document-vers-3-mount-option.patch +Patch9: 0010-mount.cifs.rst-document-vers-3.02-mount-option.patch + +# cifs-utils 6.8 switched to python for man page generation +# we need to require either py2 or py3 package +# some products do not have a py2/py3 versions +%if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150000 +BuildRequires: python3-docutils +%else +BuildRequires: python-docutils +%endif %if 0%{?suse_version} >= 1221 %define systemd 1 @@ -45,19 +58,17 @@ %define systemd 0 %endif -%if 0%{?suse_version} && 0%{?suse_version} < 1221 +%if 0%{?suse_version} < 1221 PreReq: insserv %{?fillup_prereq} %endif %define initdir %{_sysconfdir}/init.d Provides: cifs-mount = %{version} Obsoletes: cifs-mount < %{version} -%if 0%{?suse_version} == 0 || 0%{?suse_version} > 1140 +%if 0%{?suse_version} > 1140 BuildRequires: autoconf %endif BuildRequires: automake -%if 0%{?suse_version} > 1020 BuildRequires: keyutils-devel -%endif BuildRequires: krb5-devel %if 0%{?suse_version} > 1120 BuildRequires: libcap-ng-devel @@ -69,25 +80,14 @@ %if 0%{?suse_version} > 1110 BuildRequires: fdupes %endif -%if 0%{?mandriva_version} -BuildRequires: libkeyutils-devel -%endif -%if 0%{?centos_version} > 599 || 0%{?fedora_version} > 14 || 0%{?rhel_version} > 599 || 0%{?suse_version} > 1020 BuildRequires: libwbclient-devel -%endif BuildRequires: pam-devel -%if 0%{?suse_version} > 1020 BuildRequires: pkg-config -%else -BuildRequires: pkgconfig -%endif Requires: keyutils %if ! %{defined _rundir} %define _rundir %{_localstatedir}/run %endif -BuildRoot: %{_tmppath}/%{name}-%{version}-build - %description The cifs-utils package consist of utilities for doing and managing mounts of the Linux CIFS filesystem. @@ -120,79 +120,76 @@ cp -a ${RPM_SOURCE_DIR}/README.cifstab.migration . %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 %build -export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fpie" +export CFLAGS="%{optflags} -D_GNU_SOURCE -fpie" export LDFLAGS="-pie" autoreconf -i -%{configure} \ +%configure \ --with-pamdir=/%{_lib}/security -%{__make} %{?_smp_mflags} +make %{?_smp_mflags} %install %if ! %{systemd} -mkdir -p \ - ${RPM_BUILD_ROOT}/%{_sysconfdir}/init.d +mkdir -p %{buildroot}/%{_sysconfdir}/init.d %endif -%{__make} install \ - DESTDIR=${RPM_BUILD_ROOT} -%if 0%{?centos_version} > 599 || 0%{?fedora_version} > 14 || 0%{?mandriva_version} > 201100 || 0%{?rhel_version} > 599 || 0%{?suse_version} > 1020 +%make_install mkdir -p %{buildroot}%{_sysconfdir}/%{name} ln -s %{_libdir}/%{name}/idmapwb.so %{buildroot}%{_sysconfdir}/%{name}/idmap-plugin -%endif mkdir -p %{buildroot}%{_sysconfdir}/request-key.d install -m 644 -p contrib/request-key.d/cifs.idmap.conf %{buildroot}%{_sysconfdir}/request-key.d install -m 644 -p contrib/request-key.d/cifs.spnego.conf %{buildroot}%{_sysconfdir}/request-key.d -%if 0%{?suse_version} == 0 || 0%{?suse_version} > 1221 +%if 0%{?suse_version} > 1221 mkdir -p \ - ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/%{NET_CFGDIR}/if-{down,up}.d \ - ${RPM_BUILD_ROOT}/%{_sysconfdir}/samba \ - ${RPM_BUILD_ROOT}/%{_sbindir} \ - ${RPM_BUILD_ROOT}/%{_rundir} + %{buildroot}/%{_sysconfdir}/sysconfig/network/if-{down,up}.d \ + %{buildroot}/%{_sysconfdir}/samba \ + %{buildroot}/%{_sbindir} \ + %{buildroot}/%{_rundir} %if ! %{systemd} -install -m 0755 -p ${RPM_SOURCE_DIR}/cifs.init ${RPM_BUILD_ROOT}/%{_sysconfdir}/init.d/cifs -ln -s service ${RPM_BUILD_ROOT}/%{_sbindir}/rccifs +install -m 0755 -p ${RPM_SOURCE_DIR}/cifs.init %{buildroot}/%{_sysconfdir}/init.d/cifs +ln -s service %{buildroot}/%{_sbindir}/rccifs %endif -touch ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/%{NET_CFGDIR}/if-{down,up}.d/${script} \ - ${RPM_BUILD_ROOT}%{_rundir}/cifs +touch %{buildroot}/%{_sysconfdir}/sysconfig/network/if-{down,up}.d/${script} \ + %{buildroot}%{_rundir}/cifs %endif # Hardlink duplicate files %if 0%{?suse_version} > 1110 -%fdupes ${RPM_BUILD_ROOT} +%fdupes %{buildroot} %endif %files -%defattr(-,root,root) /sbin/mount.cifs -%if 0%{?centos_version} > 599 || 0%{?fedora_version} > 14 || 0%{?mandriva_version} > 201100 || 0%{?rhel_version} > 599 || 0%{?suse_version} > 1020 %{_bindir}/getcifsacl %{_bindir}/setcifsacl %{_sbindir}/cifs.idmap -%{_mandir}/man1/getcifsacl.1.* -%{_mandir}/man1/setcifsacl.1.* -%{_mandir}/man8/cifs.idmap.8.* -%endif -%if 0%{?centos_version} > 499 || 0%{?fedora_version} > 14 || 0%{?mandriva_version} > 201100 || 0%{?rhel_version} > 499 || 0%{?suse_version} > 1020 +%{_mandir}/man1/getcifsacl.1%{ext_man} +%{_mandir}/man1/setcifsacl.1%{ext_man} +%{_mandir}/man8/cifs.idmap.8%{ext_man} %{_bindir}/cifscreds %{_sbindir}/cifs.upcall -%{_mandir}/man1/cifscreds.1.* -%{_mandir}/man8/cifs.upcall.8.* -%endif -%{_mandir}/man8/mount.cifs.8.* +%{_mandir}/man1/cifscreds.1%{ext_man} +%{_mandir}/man8/cifs.upcall.8%{ext_man} +%{_mandir}/man8/mount.cifs.8%{ext_man} %dir %{_sysconfdir}/request-key.d %config(noreplace) %{_sysconfdir}/request-key.d/cifs.idmap.conf %config(noreplace) %{_sysconfdir}/request-key.d/cifs.spnego.conf -%if 0%{?centos_version} > 599 || 0%{?fedora_version} > 14 || 0%{?mandriva_version} > 201100 || 0%{?rhel_version} > 599 || 0%{?suse_version} > 1020 %dir %{_libdir}/cifs-utils %dir %{_sysconfdir}/cifs-utils %config(noreplace) %{_sysconfdir}/cifs-utils/idmap-plugin %{_libdir}/%{name}/idmapwb.so -%{_mandir}/man8/idmapwb.8.* -%endif -%if 0%{?suse_version} == 0 || 0%{?suse_version} > 1221 +%{_mandir}/man8/idmapwb.8%{ext_man} +%if 0%{?suse_version} > 1221 %if ! %{systemd} %attr(0754,root,root) %config %{_sysconfdir}/init.d/cifs %{_sbindir}/rccifs @@ -203,12 +200,10 @@ %doc README.cifstab.migration %files devel -%defattr(-,root,root) %{_includedir}/cifsidmap.h %files -n pam_cifscreds -%defattr(-,root,root) /%{_lib}/security/pam_cifscreds.so -%{_mandir}/man8/pam_cifscreds.8.* +%{_mandir}/man8/pam_cifscreds.8%{ext_man} %changelog ++++++ 0001-docs-cleanup-rst-formating.patch ++++++ ++++ 1120 lines (skipped) ++++++ 0002-mount.cifs.rst-document-new-no-handlecache-mount-opt.patch ++++++ >From bfcbfaa27a6bcfea3d463e793feff5a983f344a5 Mon Sep 17 00:00:00 2001 From: Aurelien Aptel <[email protected]> Date: Tue, 15 May 2018 10:40:48 +0200 Subject: [PATCH 02/10] mount.cifs.rst: document new (no)handlecache mount option Signed-off-by: Aurelien Aptel <[email protected]> Reviewed-by: Steve French <[email protected]> Reviewed-by: Pavel Shilovsky <[email protected]> --- mount.cifs.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mount.cifs.rst b/mount.cifs.rst index c0f0bdb..405c459 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -237,6 +237,16 @@ cache=arg The default in kernels prior to 3.7 was ``loose``. As of kernel 3.7 the default is ``strict``. +handlecache + (default) In SMB2 and above, the client often has to open the root + of the share (empty path) in various places during mount, path + revalidation and the statfs(2) system call. This option cuts + redundant round trip traffic (opens and closes) by simply keeping + the directory handle for the root around once opened. + +nohandlecache + Disable caching of the share root directory handle. + directio Do not do inode data caching on files opened on this mount. This precludes mmaping files on this mount. In some cases with fast -- 2.13.7 ++++++ 0003-manpage-update-mount.cifs-manpage-with-info-about-rd.patch ++++++ >From 03a3296c79f8195f94c43a3b4feb09df75d9b90e Mon Sep 17 00:00:00 2001 From: Kenneth Dsouza <[email protected]> Date: Fri, 13 Jul 2018 23:49:59 +0530 Subject: [PATCH 03/10] manpage: update mount.cifs manpage with info about rdma option Signed-off-by: Kenneth Dsouza <[email protected]> --- mount.cifs.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mount.cifs.rst b/mount.cifs.rst index 405c459..56c1bf9 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -403,6 +403,11 @@ echo_interval=n If this option is not given then the default value of 60 seconds is used. The minimum tunable value is 1 second and maximum can go up to 600 seconds. +rdma + Use to connect to SMB Direct, only applicable when specified with + vers=3 or vers=3.x. + Here 3.x can be 3.0, 3.02 or 3.1.1. + serverino Use inode numbers (unique persistent file identifiers) returned by the server instead of automatically generating temporary inode numbers on -- 2.13.7 ++++++ 0004-checkopts-add-python-script-to-cross-check-mount-opt.patch ++++++ >From 97209a56d13b8736579a58cccf00d2da4e4a0e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Aptel?= <[email protected]> Date: Tue, 10 Jul 2018 17:50:42 +0200 Subject: [PATCH 04/10] checkopts: add python script to cross check mount options Signed-off-by: Aurelien Aptel <[email protected]> --- checkopts | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100755 checkopts diff --git a/checkopts b/checkopts new file mode 100755 index 0000000..26ca271 --- /dev/null +++ b/checkopts @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +# +# Script to check for inconsistencies between documented mount options +# and implemented kernel options. +# Copyright (C) 2018 Aurelien Aptel ([email protected]) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import os +import sys +import re +import subprocess +import argparse +from pprint import pprint as P + +def extract_canonical_opts(s): + """ + Return list of option names present in s. + e.g "opt1=a|opt2=d" => ["opt1", "opt2"]) + """ + opts = s.split("|") + res = [] + for o in opts: + x = o.split("=") + res.append(x[0]) + return res + +def extract_kernel_opts(fn): + STATE_BASE = 0 + STATE_DEF = 1 + STATE_USE = 2 + STATE_EXIT = 3 + + state = STATE_BASE + fmt2enum = {} + enum2code = {} + code = '' + current_opt = '' + rx = RX() + + def code_add(s): + if current_opt != '': + if current_opt not in enum2code: + enum2code[current_opt] = '' + enum2code[current_opt] += s + + with open(fn) as f: + for s in f.readlines(): + if state == STATE_EXIT: + break + + elif state == STATE_BASE: + if rx.search(r'cifs_mount_option_tokens.*\{', s): + state = STATE_DEF + elif rx.search(r'^cifs_parse_mount_options', s): + state = STATE_USE + + elif state == STATE_DEF: + if rx.search(r'(Opt_[a-zA-Z0-9_]+)\s*,\s*"([^"]+)"', s): + fmt = rx.group(2) + opts = extract_canonical_opts(fmt) + assert(len(opts) == 1) + name = opts[0] + fmt2enum[name] = {'enum':rx.group(1), 'fmt':fmt} + elif rx.search(r'^};', s): + state = STATE_BASE + + elif state == STATE_USE: + if rx.search(r'^\s*case (Opt_[a-zA-Z0-9_]+)', s): + current_opt = rx.group(1) + elif current_opt != '' and rx.search(r'^\s*default:', s): + state = STATE_EXIT + else: + code_add(s) + return fmt2enum, enum2code + +def chomp(s): + if s[-1] == '\n': + return s[:-1] + return s + +def extract_man_opts(fn): + STATE_EXIT = 0 + STATE_BASE = 1 + STATE_OPT = 2 + + state = STATE_BASE + rx = RX() + opts = {} + + with open(fn) as f: + for s in f.readlines(): + if state == STATE_EXIT: + break + + elif state == STATE_BASE: + if rx.search(r'^OPTION', s): + state = STATE_OPT + + elif state == STATE_OPT: + if rx.search('^[a-z]', s) and len(s) < 50: + s = chomp(s) + names = extract_canonical_opts(s) + for name in names: + opts[name] = s + elif rx.search(r'^[A-Z]+', s): + state = STATE_EXIT + return opts + +def format_code(s): + # remove common indent in the block + min_indent = None + for ln in s.split("\n"): + indent = 0 + for c in ln: + if c == '\t': indent += 1 + else: break + if min_indent is None: + min_indent = indent + elif indent > 0: + min_indent = min(indent, min_indent) + out = '' + lines = s.split("\n") + if lines[-1].strip() == '': + lines.pop() + for ln in lines: + out += "| %s\n" % ln[min_indent:] + return out + +def sortedset(s): + return sorted(list(s), key=lambda x: re.sub('^no', '', x)) + +def opt_neg(opt): + if opt.startswith("no"): + return opt[2:] + else: + return "no"+opt + +def main(): + ap = argparse.ArgumentParser(description="Cross-check mount options from cifs.ko/man page") + ap.add_argument("cfile", help="path to connect.c") + ap.add_argument("rstfile", help="path to mount.cifs.rst") + args = ap.parse_args() + + fmt2enum, enum2code = extract_kernel_opts(args.cfile) + manopts = extract_man_opts(args.rstfile) + + kernel_opts_set = set(fmt2enum.keys()) + man_opts_set = set(manopts.keys()) + + def opt_alias_is_doc(o): + enum = fmt2enum[o]['enum'] + aliases = [] + for k,v in fmt2enum.items(): + if k != o and v['enum'] == enum: + if opt_is_doc(k): + return k + return None + + def opt_exists(o): + return o in fmt2enum + + def opt_is_doc(o): + return o in manopts + + + print('UNDOCUMENTED OPTIONS') + print('====================') + + undoc_opts = kernel_opts_set - man_opts_set + # group opts and their negations together + for opt in sortedset(undoc_opts): + fmt = fmt2enum[opt]['fmt'] + enum = fmt2enum[opt]['enum'] + code = format_code(enum2code[enum]) + neg = opt_neg(opt) + + if enum == 'Opt_ignore': + print("# skipping %s (Opt_ignore)\n"%opt) + continue + + if opt_exists(neg) and opt_is_doc(neg): + print("# skipping %s (%s is documented)\n"%(opt, neg)) + continue + + alias = opt_alias_is_doc(opt) + if alias: + print("# skipping %s (alias %s is documented)\n"%(opt, alias)) + continue + + print('OPTION %s ("%s" -> %s):\n%s'%(opt, fmt, enum, code)) + + print('') + print('DOCUMENTED BUT NON-EXISTING OPTIONS') + print('===================================') + + unex_opts = man_opts_set - kernel_opts_set + # group opts and their negations together + for opt in sortedset(unex_opts): + fmt = manopts[opt] + print('OPTION %s ("%s")' % (opt, fmt)) + + + print('') + print('NEGATIVE OPTIONS WITHOUT POSITIVE') + print('=================================') + + for opt in sortedset(kernel_opts_set): + if not opt.startswith('no'): + continue + + neg = opt[2:] + if not opt_exists(neg): + print("OPTION %s exists but not %s"%(opt,neg)) + +# little helper to test AND store result at the same time so you can +# do if/elsif easily instead of nesting them when you need to do +# captures +class RX: + def __init__(self): + pass + def search(self, rx, s, flags=0): + self.r = re.search(rx, s, flags) + return self.r + def group(self, n): + return self.r.group(n) + +if __name__ == '__main__': + main() -- 2.13.7 ++++++ 0005-mount.cifs.rst-document-missing-options-correct-wron.patch ++++++ >From 7325a01abc529d68756bae90cf23233392626939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Aptel?= <[email protected]> Date: Tue, 10 Jul 2018 17:50:43 +0200 Subject: [PATCH 05/10] mount.cifs.rst: document missing options, correct wrong ones Signed-off-by: Aurelien Aptel <[email protected]> --- mount.cifs.rst | 111 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 32 deletions(-) diff --git a/mount.cifs.rst b/mount.cifs.rst index 56c1bf9..13b3a1e 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -123,6 +123,11 @@ forcegid of the gid= option. See the section on `FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS`_ below for more information. +idsfromsid + Extract uid/gid from special SID instead of mapping it. See the + section on `FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS`_ below for + more information. + port=arg sets the port number on which the client will attempt to contact the CIFS server. If this value is specified, look for an existing @@ -133,8 +138,9 @@ port=arg try to connect on port 445 first and then port 139 if that fails. Return an error if both fail. -servernetbiosname=arg - Specify the server netbios name (RFC1001 name) to use when attempting + +netbiosname=arg + Specify the client netbios name (RFC1001 name) to use when attempting to setup a session to the server. Although rarely needed for mounting to newer servers, this option is needed for mounting to some older servers (such as OS/2 or Windows 98 and Windows ME) since when @@ -143,7 +149,8 @@ servernetbiosname=arg characters long and is usually uppercased. servern=arg - Synonym for ``servernetbiosname`` + Similarl to ``netbiosname`` except it specifies the netbios name of + the server instead of the client. netbiosname=arg When mounting to servers via port 139, specifies the RFC1001 source @@ -166,6 +173,10 @@ ip=arg|addr=arg domain=arg|dom=arg|workgroup=arg sets the domain (workgroup) of the user. +domainauto + When using NTLMv2 authentification and not providing a domain via + ``domain``, guess the domain from the server NTLM challenge. + guest don't prompt for a password. @@ -237,6 +248,9 @@ cache=arg The default in kernels prior to 3.7 was ``loose``. As of kernel 3.7 the default is ``strict``. +nostrictsync + Do not flush to the server on fsync(). + handlecache (default) In SMB2 and above, the client often has to open the root of the share (empty path) in various places during mount, path @@ -247,32 +261,6 @@ handlecache nohandlecache Disable caching of the share root directory handle. -directio - Do not do inode data caching on files opened on this mount. This - precludes mmaping files on this mount. In some cases with fast - networks and little or no caching benefits on the client (e.g. when - the application is doing large sequential reads bigger than page size - without rereading the same data) this can provide better performance - than the default behavior which caches reads (readahead) and writes - (writebehind) through the local Linux client pagecache if oplock - (caching token) is granted and held. Note that direct allows write - operations larger than page size to be sent to the server. On some - kernels this requires the cifs.ko module to be built with the - ``CIFS_EXPERIMENTAL`` configure option. - - This option is will be deprecated in 3.7. Users should use - ``cache=none`` instead on more recent kernels. - -strictcache - Use for switching on strict cache mode. In this mode the client reads - from the cache all the time it has *Oplock Level II* , otherwise - - read from the server. As for write - the client stores a data in the - cache in *Exclusive Oplock* case, otherwise - write directly to the - server. - - This option is will be deprecated in 3.7. Users should use - ``cache=strict`` instead on more recent kernels. - rwpidforward Forward pid of a process who opened a file to any read or write operation on that file. This prevent applications like wine(1) from @@ -283,7 +271,7 @@ mapchars including the colon, question mark, pipe, asterik, greater than and less than characters) to the remap range (above 0xF000), which also allows the CIFS client to recognize files created with such characters - by Windows's POSIX emulation. This can also be useful when mounting to + by Windows's Services for Mac. This can also be useful when mounting to most versions of Samba (which also forbids creating and opening files whose names contain any of these seven characters). This has no effect if the server does not support Unicode on the wire. Please note that @@ -293,6 +281,10 @@ mapchars nomapchars (default) Do not translate any of these seven characters. +mapposix + Translate reserved characters similarly to ``mapchars`` but use the + mapping from Microsoft "Services For Unix". + intr currently unimplemented. @@ -370,12 +362,42 @@ seal Request encryption at the SMB layer. Encryption is only supported in SMBv3 and above. The encryption algorithm used is AES-128-CCM. +rdma + Connect directly to the server using SMB Direct via a RDMA adapter. + +resilienthandles + Enable resilient handles. If the server supports it, keep opened + files across reconenctions. Requires SMB2.1. + +noresilienthandles + (default) Disable resilient handles. + +persistenthandles + Enable persistent handles. If the server supports it, keep opened + files across reconnections. Persistent handles are also valid across + servers in a cluser and have stronger guarantees than resilient + handles. Requires SMB3 or above. + +nopersistenthandles + (default) Disable persistent handles. + +snapshot=time + Mount a specific snapshot of the remote share. ``time`` must be a + positive integer identifying the snapshot requested. + nobrl Do not send byte range lock requests to the server. This is necessary for certain applications that break with cifs style mandatory byte range locks (and most cifs servers do not yet support requesting advisory byte range locks). +forcemandatorylock + Do not use POSIX locks even when available via unix + extensions. Always use cifs style mandatory locks. + +locallease + Check cache leases locally instead of querying the server. + sfu When the CIFS Unix Extensions are not negotiated, attempt to create device files and fifos in a format compatible with Services for Unix @@ -431,8 +453,12 @@ noserverino See section `INODE NUMBERS`_ for more information. -nounix - Disable the CIFS Unix Extensions for this mount. This can be useful in +unix|linux + (default) Enable Unix Extensions for this mount. Requires CIFS + (vers=1.0) or SMB3.1.1 (vers=3.1.1) and a server supporting them. + +nounix|nolinux + Disable the Unix Extensions for this mount. This can be useful in order to turn off multiple settings at once. This includes POSIX acls, POSIX locks, POSIX paths, symlink support and retrieving uids/gids/mode from the server. This can also be useful to work around @@ -444,6 +470,23 @@ nouser_xattr Do not allow getfattr/setfattr to get/set xattrs, even if server would support it otherwise. The default is for xattr support to be enabled. +nodfs + Do not follow Distributed FileSystem referals. IO on a file not + stored on the server will fail instead of connecting to the target + server transparently. + +noautotune + Use fixed size for kernel recv/send socket buffers. + +nosharesock + Do not try to reuse sockets if the system is already connected to + the server via an existing mount point. This will make the client + always make a new connection to the server no matter what he is + already connected to. + +noblocksend + Send data on the socket using non blocking operations (MSG_DONTWAIT flag). + rsize=bytes Maximum amount of data that the kernel will request in a read request in bytes. Prior to kernel 3.2.0, the default was 16k, and the maximum @@ -472,6 +515,10 @@ wsize=bytes this value isn't specified or it's greater or equal than the existing one. +max_credits=n + Maximum credits the SMB2 client can have. Default is 32000. Must be + set to a number between 20 and 60000. + fsc Enable local disk caching using FS-Cache for CIFS. This option could be useful to improve performance on a slow link, heavily loaded server -- 2.13.7 ++++++ 0006-cifs-utils-support-rst2man-3.patch ++++++ >From a389756f51916995d27819ea1807ab03f36d8dd7 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy <[email protected]> Date: Tue, 17 Jul 2018 13:12:44 +0300 Subject: [PATCH 06/10] cifs-utils: support rst2man-3 Python3 version of rst2man is called rst2man-3 Signed-off-by: Alexander Bokovoy <[email protected]> Reviewed-by: Aurelien Aptel <[email protected]> --- Makefile.am | 2 +- configure.ac | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 30658e3..f37c9ae 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,7 @@ man_MANS= SUFFIXES = .rst .1 .8 -RST2MAN = rst2man --syntax-highlight=none $< $@ +RST2MAN = $(have_rst2man) --syntax-highlight=none $< $@ .rst.1: $(RST2MAN) diff --git a/configure.ac b/configure.ac index b0bc2b9..8e3d6ce 100644 --- a/configure.ac +++ b/configure.ac @@ -252,12 +252,12 @@ fi # if docs are not disabled, check if rst2man is available if test $enable_man != "no"; then - AC_CHECK_PROG(have_rst2man, rst2man, yes, no) + AC_CHECK_PROGS(have_rst2man, rst2man-3.6 rst2man-3.4 rst2man-3 rst2man, no) if test $have_rst2man = "no"; then if test $enable_man = "yes"; then - AC_MSG_ERROR([rst2man not found: cannot generate man pages, consider installing perl.]) + AC_MSG_ERROR([rst2man not found: cannot generate man pages, consider installing python{2,3}-docutils.]) else - AC_MSG_WARN([rst2man not found: cannot generate man pages, consider installing perl. Disabling man page generation.]) + AC_MSG_WARN([rst2man not found: cannot generate man pages, consider installing python{2,3}-docutils. Disabling man page generation.]) enable_man="no" fi else -- 2.13.7 ++++++ 0007-checkopts-report-duplicated-options-in-man-page.patch ++++++ >From 77b028c11fee787d1235a08fd06c8b60d20eb9c0 Mon Sep 17 00:00:00 2001 From: Aurelien Aptel <[email protected]> Date: Wed, 8 Aug 2018 11:38:15 +0200 Subject: [PATCH 07/10] checkopts: report duplicated options in man page Signed-off-by: Aurelien Aptel <[email protected]> --- checkopts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/checkopts b/checkopts index 26ca271..88e70b1 100755 --- a/checkopts +++ b/checkopts @@ -98,9 +98,12 @@ def extract_man_opts(fn): state = STATE_BASE rx = RX() opts = {} + ln = 0 with open(fn) as f: for s in f.readlines(): + ln += 1 + if state == STATE_EXIT: break @@ -113,7 +116,9 @@ def extract_man_opts(fn): s = chomp(s) names = extract_canonical_opts(s) for name in names: - opts[name] = s + if name not in opts: + opts[name] = [] + opts[name].append({'ln':ln, 'fmt':s}) elif rx.search(r'^[A-Z]+', s): state = STATE_EXIT return opts @@ -174,6 +179,14 @@ def main(): def opt_is_doc(o): return o in manopts + print('DUPLICATED DOC OPTIONS') + print('======================') + + for opt in sortedset(man_opts_set): + if len(manopts[opt]) > 1: + lines = ", ".join([str(x['ln']) for x in manopts[opt]]) + print("OPTION %-20.20s (lines %s)"%(opt, lines)) + print() print('UNDOCUMENTED OPTIONS') print('====================') @@ -208,8 +221,8 @@ def main(): unex_opts = man_opts_set - kernel_opts_set # group opts and their negations together for opt in sortedset(unex_opts): - fmt = manopts[opt] - print('OPTION %s ("%s")' % (opt, fmt)) + man = manopts[opt][0] + print('OPTION %s ("%s") line %d' % (opt, man['fmt'], man['ln'])) print('') -- 2.13.7 ++++++ 0008-mount.cifs.rst-more-cleanups.patch ++++++ >From 06503ef4490a3dde4e8297cf1c5cb336ba43aafa Mon Sep 17 00:00:00 2001 From: Aurelien Aptel <[email protected]> Date: Wed, 8 Aug 2018 11:38:16 +0200 Subject: [PATCH 08/10] mount.cifs.rst: more cleanups * remove duplicates (netbiosname, rdma) * remove snapshot * document nostrictsync, domain, domainauto better * point to vers= when talking about version requirements * typos Signed-off-by: Aurelien Aptel <[email protected]> --- mount.cifs.rst | 61 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/mount.cifs.rst b/mount.cifs.rst index 13b3a1e..3504477 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -138,25 +138,20 @@ port=arg try to connect on port 445 first and then port 139 if that fails. Return an error if both fail. - netbiosname=arg - Specify the client netbios name (RFC1001 name) to use when attempting - to setup a session to the server. Although rarely needed for mounting + When mounting to servers via port 139, specifies the RFC1001 source + name to use to represent the client netbios machine during the netbios + session initialization. + +servern=arg + Similar to ``netbiosname`` except it specifies the netbios name of + the server instead of the client. Although rarely needed for mounting to newer servers, this option is needed for mounting to some older servers (such as OS/2 or Windows 98 and Windows ME) since when connecting over port 139 they, unlike most newer servers, do not support a default server name. A server name can be up to 15 characters long and is usually uppercased. -servern=arg - Similarl to ``netbiosname`` except it specifies the netbios name of - the server instead of the client. - -netbiosname=arg - When mounting to servers via port 139, specifies the RFC1001 source - name to use to represent the client netbios machine name when doing - the RFC1001 netbios session initialize. - file_mode=arg If the server does not support the CIFS Unix extensions this overrides the default file mode. @@ -171,11 +166,14 @@ ip=arg|addr=arg rarely needs to be specified by the user. domain=arg|dom=arg|workgroup=arg - sets the domain (workgroup) of the user. + Sets the domain (workgroup) of the user. If no domains are given, + the empty domain will be used. Use ``domainauto`` to automatically + guess the domain of the server you are connecting to. domainauto - When using NTLMv2 authentification and not providing a domain via + When using NTLM authentication and not providing a domain via ``domain``, guess the domain from the server NTLM challenge. + This behavior used to be the default on kernels older than 2.6.36. guest don't prompt for a password. @@ -249,7 +247,14 @@ cache=arg default is ``strict``. nostrictsync - Do not flush to the server on fsync(). + Do not ask the server to flush on fsync(). + Some servers perform non-buffered writes by default in which case + flushing is redundant. In workloads where a client is performing a + lot of small write + fsync combinations and where network latency is + much higher than the server latency, this brings a 2x performance + improvement. + This option is also a good candidate in scenarios where we want + performance over consistency. handlecache (default) In SMB2 and above, the client often has to open the root @@ -359,15 +364,16 @@ sec=arg automatically if it's enabled in */proc/fs/cifs/SecurityFlags*. seal - Request encryption at the SMB layer. Encryption is only supported in - SMBv3 and above. The encryption algorithm used is AES-128-CCM. + Request encryption at the SMB layer. The encryption algorithm used + is AES-128-CCM. Requires SMB3 or above (see ``vers``). rdma - Connect directly to the server using SMB Direct via a RDMA adapter. + Connect directly to the server using SMB Direct via a RDMA + adapter. Requires SMB3 or above (see ``vers``). resilienthandles Enable resilient handles. If the server supports it, keep opened - files across reconenctions. Requires SMB2.1. + files across reconnections. Requires SMB2.1 (see ``vers``). noresilienthandles (default) Disable resilient handles. @@ -375,16 +381,12 @@ noresilienthandles persistenthandles Enable persistent handles. If the server supports it, keep opened files across reconnections. Persistent handles are also valid across - servers in a cluser and have stronger guarantees than resilient - handles. Requires SMB3 or above. + servers in a cluster and have stronger guarantees than resilient + handles. Requires SMB3 or above (see ``vers``). nopersistenthandles (default) Disable persistent handles. -snapshot=time - Mount a specific snapshot of the remote share. ``time`` must be a - positive integer identifying the snapshot requested. - nobrl Do not send byte range lock requests to the server. This is necessary for certain applications that break with cifs style mandatory byte @@ -396,7 +398,7 @@ forcemandatorylock extensions. Always use cifs style mandatory locks. locallease - Check cache leases locally instead of querying the server. + Check cached leases locally instead of querying the server. sfu When the CIFS Unix Extensions are not negotiated, attempt to create @@ -425,11 +427,6 @@ echo_interval=n If this option is not given then the default value of 60 seconds is used. The minimum tunable value is 1 second and maximum can go up to 600 seconds. -rdma - Use to connect to SMB Direct, only applicable when specified with - vers=3 or vers=3.x. - Here 3.x can be 3.0, 3.02 or 3.1.1. - serverino Use inode numbers (unique persistent file identifiers) returned by the server instead of automatically generating temporary inode numbers on @@ -471,7 +468,7 @@ nouser_xattr support it otherwise. The default is for xattr support to be enabled. nodfs - Do not follow Distributed FileSystem referals. IO on a file not + Do not follow Distributed FileSystem referrals. IO on a file not stored on the server will fail instead of connecting to the target server transparently. -- 2.13.7 ++++++ 0009-mount.cifs.rst-document-vers-3-mount-option.patch ++++++ >From 439cd76f72a2dd3c65fd7d30ece460cde6b9675d Mon Sep 17 00:00:00 2001 From: Pavel Shilovsky <[email protected]> Date: Fri, 17 Aug 2018 11:08:58 -0700 Subject: [PATCH 09/10] mount.cifs.rst: document vers=3 mount option Signed-off-by: Pavel Shilovsky <[email protected]> --- mount.cifs.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/mount.cifs.rst b/mount.cifs.rst index 3504477..6587e16 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -592,6 +592,7 @@ vers=arg - 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. - 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012. - 3.1.1 or 3.11 - The SMBv3.1.1 protocol that was introduced in Microsoft Windows Server 2016. + - 3 - The SMBv3.0 protocol version and above. Note too that while this option governs the protocol version used, not all features of each version are available. -- 2.13.7 ++++++ 0010-mount.cifs.rst-document-vers-3.02-mount-option.patch ++++++ >From 3c7e8c3663f50c2d2df6158cc4d22c4fccdc8ae8 Mon Sep 17 00:00:00 2001 From: Pavel Shilovsky <[email protected]> Date: Fri, 17 Aug 2018 11:13:45 -0700 Subject: [PATCH 10/10] mount.cifs.rst: document vers=3.02 mount option Signed-off-by: Pavel Shilovsky <[email protected]> --- mount.cifs.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/mount.cifs.rst b/mount.cifs.rst index 6587e16..a0faf7f 100644 --- a/mount.cifs.rst +++ b/mount.cifs.rst @@ -591,6 +591,7 @@ vers=arg different dialect (2.000) that is not supported. - 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. - 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012. + - 3.02 - The SMBv3.0.2 protocol that was introduced in Microsoft Windows 8.1 and Windows Server 2012R2. - 3.1.1 or 3.11 - The SMBv3.1.1 protocol that was introduced in Microsoft Windows Server 2016. - 3 - The SMBv3.0 protocol version and above. -- 2.13.7 ++++++ cifs-utils-6.5.tar.bz2 -> cifs-utils-6.8.tar.bz2 ++++++ ++++ 9920 lines of diff (skipped) ++++++ cifs-utils.keyring ++++++ --- /var/tmp/diff_new_pack.yQzvm7/_old 2018-12-03 10:05:27.323981295 +0100 +++ /var/tmp/diff_new_pack.yQzvm7/_new 2018-12-03 10:05:27.323981295 +0100 @@ -1,32 +1,52 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2.0.14 (GNU/Linux) +Version: GnuPG v2 -mQENBEuqp6ABCADf+tS1rZDdQaUfp7yUWTW+H8OqOXCjuCohHUZFoYF6K/pxhtsY -YUXt5NcXNTioOgJ18S9AL80KS2LTEyr8Z0mfGw1Rld4MClGnnIVNjKUKFaSeEOZG -eSIgjY/gYSP361mwo4PCcieeEO5V0g0agIrYOjkEUSSWb503Ma/NSLwlc3HjvL7i -woosfBpdGyr8dUjb9Tz0HtVw+2wqWl4zMNMYilgoZV0sGO0HssrU40yR/DjuXX5u -Yj+JpffKltKD9iKQ2c29yDXcVoYgAmKu7lNTEGafJHqSWWf2Cvuc+VGTLKrCKxCB -jlN4FKZO3pKFMLX3a0pMEn/ee645wH4mccMJABEBAAG0P2NpZnMtdXRpbHMgRGlz -dHJpYnV0aW9uIFZlcmlmaWNhdGlvbiBLZXkgPGNpZnMtdXRpbHNAc2FtYmEub3Jn -PokBOAQTAQIAIgUCS6qnoAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ -Wv2/snDzuYFT3wgAo3mjI7HpDd6oywObMF+NDJC55lmMOZE3r0YuLg59aPeOI+PG -hhjx1UcCMWtx4Bu2j3I96bgwwoe+/ZxYjJZIqa8ClF6JulMDksI06eITSLOXaJVV -1OP8Rtq5aUyN9DsBrLhnpC1QkyBtiIKWDr9H/HSm8uYd3xOjcbhg3hYSBzCSEcTA -lVnk575rZRZ7kgwm6R5aCy/QNtmfbLWvI7ZA50q+zrE3/cDQ2ZLjktueOXufCQLg -cTivreji4aiU3p3dxRvZ+GFWnRyFu6o88DYZlT8M2mHdro5EW7S31ccs0tKdFrcw -vpkPi0TdWPp072UOeDogxuGdozpWuDB62n9TX4hGBBARAgAGBQJLqq6pAAoJEMj9 -IMUDHcyA1wkAnj4i4n33+JHh42fMDJojYGPxpnFnAJ9SXLONLJoFwQkaOjLNGYtQ -YH67ALkBDQRLqqegAQgA9Hco9TDoYOu3s7FePHqXxKClrHMswjfmD6WQ0k26j3lq -RS1KpSbGSiF8zXrKGKC0yO/INQ+WJGqDuVTwELE8hYcJeY0M5scSY6qAc+iCcTRn -B4Mf6Esnz/a6J0YebiojFrAgChGGUk/cZdwu8UOV//MbFSKCC49PcjNEjv2OXp5F -h/5gl/dSElHzSI9HykqhCECvcWSBdUXsIogIXJoQ0XX7WyPNKt0FeD0hGdYtDlzg -ZGjqhj/l8XHbFtNdJ/YOue8gBJ//4c2q7yrFMWf7lsJv/qaBDJECR1pV/O2juFZn -CxJ05WWnyqMbS30dVGM+VDf6HAfownc6NLX6KgANkQARAQABiQEfBBgBAgAJBQJL -qqegAhsMAAoJEFr9v7Jw87mBEZ8H/jxs/oyggM4VE0LSrZ3mmCJeNpAkk+rQlCRv -lqkIpn8xwllSCFVm7yET+Eo6G07J1vsGX7+hrtxC1UxB7UYwU3OMMciWpQyz32Zi -DO+eZwrWLg74Jy0Y6rvBlqhTQoRBeWhMzeMxfjtsBkBX3d3RWtuLGiA14pIw73+h -6NE0EbxIuXC5elEWdzm1A9LDH1B6XU9O5e/h5M/7KeKVW+wfydy0PGN/cQ7CLG/x -Rznvy631YcU03NN0PTO9aimbu67H27UIbj+ONoteeqklxmzVkriuYhJoSYkZloIz -ZuM2e2o9RtZwfOLOVR2fMspSGyvKq9NqOSOfz/2VFJI/7LYuJRM= -=hbsp +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 +=+QS8 -----END PGP PUBLIC KEY BLOCK-----
