Great, thanks! Will take a closer look and merge if no objections. -- Best regards, Pavel Shilovsky 2018-07-10 8:50 GMT-07:00 Aurelien Aptel <aaptel@xxxxxxxx>: > Hi, > > I've noticed it's hard to keep the documentation for the mount options > in sync with what the kernel implements. > > 1) Several options were not documented. > 2) Several options were documented but were not implemented in the > kernel > 3) Additionnaly there are some issues where the mount options are not > very consistent: we have negative options without positive ones > ("nosharesock" but no "sharesock"). > > To help with that I've written a script that parses cifs.ko connect.c > and mount.cifs.rst (nothing fancy but works) and tries to cross check > for the 3 problems described above. For (1) it also prints the kernel > code associated with the option. > > I've added some logic to skip a few cases where no documentation is OK: > > * If the option is mapped to Opt_ignored > * If the negative ("noX" for "X" or "X" for "noX") option is > documented > * If any of the option aliases (option mapped to the same Opt_X enum) > is documented > > Give this information I've fixed the man page by adding missing > options, removing 2 (they were deprecated and not implemented by the > kernel anymore for some time). I did not fix any problem from (3). > > There are still some undocumented options but I've left them as is as > they are either internal options added by mount.cifs or because there > is a better interface to the feature (sec vs. sign). > > Here's the output of the script against my master before this > patchset: > > $ ./checkopts ~/prog/linux/for-next/fs/cifs/connect.c mount.cifs.rst > UNDOCUMENTED OPTIONS > ==================== > # skipping _netdev (Opt_ignore) > > OPTION noac ("noac" -> Opt_noac): > | pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n"); > | break; > > # skipping acl (noacl is documented) > > # skipping noauto (Opt_ignore) > > OPTION noautotune ("noautotune" -> Opt_noautotune): > | vol->noautotune = 1; > | break; > > OPTION noblocksend ("noblocksend" -> Opt_noblocksend): > | vol->noblocksnd = 1; > | break; > > # skipping brl (nobrl is documented) > > # skipping nocifsacl (cifsacl is documented) > > # skipping nodev (Opt_ignore) > > # skipping dev (Opt_ignore) > > OPTION nodfs ("nodfs" -> Opt_nodfs): > | vol->nodfs = 1; > | break; > > # skipping dirmode (alias dir_mode is documented) > > OPTION domainauto ("domainauto" -> Opt_domainauto): > | vol->domainauto = true; > | break; > > # skipping nodynperm (dynperm is documented) > > # skipping exec (Opt_ignore) > > # skipping noexec (Opt_ignore) > > # skipping noforcegid (forcegid is documented) > > OPTION forcemand ("forcemand" -> Opt_forcemandatorylock): > | vol->mand_lock = 1; > | break; > > OPTION forcemandatorylock ("forcemandatorylock" -> Opt_forcemandatorylock): > | vol->mand_lock = 1; > | break; > > # skipping noforceuid (forceuid is documented) > > # skipping nohard (hard is documented) > > OPTION idsfromsid ("idsfromsid" -> Opt_setuidfromacl): > | vol->setuidfromacl = 1; > | break; > > OPTION linux ("linux" -> Opt_unix): > | if (vol->no_linux_ext) > | cifs_dbg(VFS, > | "conflicting unix mount options\n"); > | vol->linux_ext = 1; > | break; > > # skipping nolinux (alias nounix is documented) > > OPTION locallease ("locallease" -> Opt_locallease): > | vol->local_lease = 1; > | break; > > # skipping nolock (alias nobrl is documented) > > # skipping nomand (Opt_ignore) > > # skipping mand (Opt_ignore) > > OPTION nomapposix ("nomapposix" -> Opt_nomapposix): > | vol->remap = false; > | break; > > OPTION mapposix ("mapposix" -> Opt_mapposix): > | vol->remap = true; > | vol->sfu_remap = false; /* disable SFU mapping */ > | break; > > OPTION max_credits ("max_credits=%s" -> Opt_max_credits): > | if (get_option_ul(args, &option) || (option < 20) || > | (option > 60000)) { > | cifs_dbg(VFS, "%s: Invalid max_credits value\n", > | __func__); > | goto cifs_parse_mount_err; > | } > | vol->max_credits = option; > | break; > | > | /* String Arguments */ > | > > # skipping path (Opt_ignore) > > OPTION persistenthandles ("persistenthandles" -> Opt_persistent): > | vol->persistent = true; > | if ((vol->nopersistent) || (vol->resilient)) { > | cifs_dbg(VFS, > | "persistenthandles mount options conflict\n"); > | goto cifs_parse_mount_err; > | } > | break; > > OPTION nopersistenthandles ("nopersistenthandles" -> Opt_nopersistent): > | vol->nopersistent = true; > | if (vol->persistent) { > | cifs_dbg(VFS, > | "persistenthandles mount options conflict\n"); > | goto cifs_parse_mount_err; > | } > | break; > > # skipping noposix (alias nounix is documented) > > OPTION posix ("posix" -> Opt_unix): > | if (vol->no_linux_ext) > | cifs_dbg(VFS, > | "conflicting unix mount options\n"); > | vol->linux_ext = 1; > | break; > > OPTION rdma ("rdma" -> Opt_rdma): > | vol->rdma = true; > | break; > | > | /* Numeric Values */ > > OPTION noresilienthandles ("noresilienthandles" -> Opt_noresilient): > | vol->resilient = false; /* already the default */ > | break; > > OPTION resilienthandles ("resilienthandles" -> Opt_resilient): > | vol->resilient = true; > | if (vol->persistent) { > | cifs_dbg(VFS, > | "persistenthandles mount options conflict\n"); > | goto cifs_parse_mount_err; > | } > | break; > > # skipping nosfu (sfu is documented) > > OPTION nosharesock ("nosharesock" -> Opt_nosharesock): > | vol->nosharesock = true; > | break; > > OPTION sign ("sign" -> Opt_sign): > | vol->sign = true; > | break; > > OPTION sloppy ("sloppy" -> Opt_sloppy): > | sloppy = true; > | break; > > OPTION snapshot ("snapshot=%s" -> Opt_snapshot): > | if (get_option_ul(args, &option)) { > | cifs_dbg(VFS, "%s: Invalid snapshot time\n", > | __func__); > | goto cifs_parse_mount_err; > | } > | vol->snapshot_time = option; > | break; > > # skipping nosoft (soft is documented) > > OPTION srcaddr ("srcaddr=%s" -> Opt_srcaddr): > | string = match_strdup(args); > | if (string == NULL) > | goto out_nomem; > | > | if (!cifs_convert_address( > | (struct sockaddr *)&vol->srcaddr, > | string, strlen(string))) { > | pr_warn("CIFS: Could not parse srcaddr: %s\n", > | string); > | goto cifs_parse_mount_err; > | } > | break; > > OPTION strictsync ("strictsync" -> Opt_strictsync): > | vol->nostrictsync = 0; > | break; > > OPTION nostrictsync ("nostrictsync" -> Opt_nostrictsync): > | vol->nostrictsync = 1; > | break; > > # skipping nosuid (Opt_ignore) > > # skipping suid (Opt_ignore) > > # skipping target (Opt_ignore) > > # skipping unc (Opt_ignore) > > # skipping unix (nounix is documented) > > # skipping user_xattr (nouser_xattr is documented) > > OPTION ver ("ver=%s" -> Opt_ver): > | /* version of mount userspace tools, not dialect */ > | string = match_strdup(args); > | if (string == NULL) > | goto out_nomem; > | > | /* If interface changes in mount.cifs bump to new ver */ > | if (strncasecmp(string, "1", 1) == 0) { > | if (strlen(string) > 1) { > | pr_warn("Bad mount helper ver=%s. Did " > | "you want SMB1 (CIFS) dialect " > | "and mean to type vers=1.0 " > | "instead?\n", string); > | goto cifs_parse_mount_err; > | } > | /* This is the default */ > | break; > | } > | /* For all other value, error */ > | pr_warn("CIFS: Invalid mount helper version specified\n"); > | goto cifs_parse_mount_err; > > > DOCUMENTED BUT NON-EXISTING OPTIONS > =================================== > OPTION directio ("directio") > OPTION servernetbiosname ("servernetbiosname=arg") > OPTION strictcache ("strictcache") > > NEGATIVE OPTIONS WITHOUT POSITIVE > ================================= > OPTION noac exists but not ac > OPTION noauto exists but not auto > OPTION noautotune exists but not autotune > OPTION noblocksend exists but not blocksend > OPTION nocase exists but not case > OPTION nodfs exists but not dfs > OPTION nolock exists but not lock > OPTION nosharesock exists but not sharesock > > > Aurelien Aptel (2): > checkopts: add python script to cross check mount options > mount.cifs.rst: document missing options, correct wrong ones > > checkopts | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > mount.cifs.rst | 111 ++++++++++++++++++-------- > 2 files changed, 319 insertions(+), 32 deletions(-) > create mode 100755 checkopts > > -- > 2.13.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html