conf_parse_mntopts() calls lookup_entry() in an attempt to avoid "overwriting" of mount options (actually it tries to avoid appending conflicting options to the string passed to mount(2)). Currently this doesn't do much of anything. For example, if you have Timeo=600 in the global section, Timeo=300 in the server-specific section, and Timeo=150 in the mountpoint-specific section, then the string that is passed to the mount syscall will contain "timeo=600,timeo=300,timeo=150". Note that the ordering of the conflicting options ensures that the correct option will ultimately be applied, but we should still avoid sending the conflicting options in the first place if possible. This patch fixes all but the MNT_NOARG type options (fg, bg, and sloppy). Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx> --- utils/mount/configfile.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/utils/mount/configfile.c b/utils/mount/configfile.c index 1f1b6e7..221436f 100644 --- a/utils/mount/configfile.c +++ b/utils/mount/configfile.c @@ -170,10 +170,16 @@ char *lookup_entry(char *opt) { struct entry *entry; - SLIST_FOREACH(entry, &head, entries) { - if (strcasecmp(entry->opt, opt) == 0) - return opt; - } + if (strlen(opt) > 0 && opt[strlen(opt) - 1] == '=') + SLIST_FOREACH(entry, &head, entries) { + if (strncasecmp(entry->opt, opt, strlen(opt)) == 0) + return opt; + } + else + SLIST_FOREACH(entry, &head, entries) { + if (strcasecmp(entry->opt, opt) == 0) + return opt; + } return NULL; } /* @@ -300,13 +306,21 @@ conf_parse_mntopts(char *section, char *arg, char *opts) if (opts && check_vers(opts, node->field)) continue; - if (lookup_entry(node->field) != NULL) + if (lookup_entry(buf) != NULL) continue; buf[0] = '\0'; value = conf_get_section(section, arg, node->field); if (value == NULL) continue; field = mountopts_alias(node->field, &argtype); + if (lookup_entry(field) != NULL) + continue; + if (argtype != MNT_NOARG) { + snprintf(buf, BUFSIZ, "no%s", field); + if (lookup_entry(buf) != NULL) + continue; + buf[0] = '\0'; + } if (strcasecmp(value, "false") == 0) { if (argtype != MNT_NOARG) snprintf(buf, BUFSIZ, "no%s", field); -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html