[nfs-utils PATCH 2/4] mount.nfs: avoid sending conflicting mount options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux