[nfs-utils PATCH 3/4] mount.nfs: improve handling of MNT_NOARG type options

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

 



conf_parse_mntopts() maintains a linked list of options that will
ultimately be passed in the data field of the mount() syscall in order
to avoid unnecessary duplicates and/or conflicts.  This doesn't work
very well for MNT_NOARG type options, since setting any of these to
false in the nfsmount.conf doesn't correspond to any 'real' mount option
(i.e. there are no such options 'nobg', 'nofg', and 'nosloppy').

This patch adds a set of internal variables for the three real MNT_NOARG
options (bg, fg, sloppy) along with their pseudo options (nobg, nofg,
nosloppy), and a helper function to track which of these options has
been previously seen and to determine whether or not to append an option
to the linked list.

Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx>
---
 utils/mount/configfile.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/utils/mount/configfile.c b/utils/mount/configfile.c
index 221436f..623c886 100644
--- a/utils/mount/configfile.c
+++ b/utils/mount/configfile.c
@@ -73,6 +73,8 @@ struct mnt_alias {
 };
 int mnt_alias_sz = (sizeof(mnt_alias_tab)/sizeof(mnt_alias_tab[0]));
 
+static int bg, nobg, fg, nofg, sloppy, nosloppy;
+
 /*
  * See if the option is an alias, if so return the 
  * real mount option along with the argument type.
@@ -278,6 +280,46 @@ default_value(char *mopt)
 
 	return 1;
 }
+
+int
+should_add_noarg_opt(char *opt, char *val)
+{
+	int ret = 0;
+
+	if (strcasecmp(opt, "bg") == 0) {
+		if (strcasecmp(val, "true") == 0) {
+			if (bg == 0 && nobg == 0 && fg == 0) {
+				bg = 1;
+				ret = 1;
+			}
+		} else if (strcasecmp(val, "false") == 0) {
+			if (bg == 0 && nobg == 0)
+				nobg = 1;
+		}
+	} else if (strcasecmp(opt, "fg") == 0) {
+		if (strcasecmp(val, "true") == 0) {
+			if (fg == 0 && nofg == 0 && bg == 0) {
+				fg = 1;
+				ret = 1;
+			}
+		} else if (strcasecmp(val, "false") == 0) {
+			if (fg == 0 && nofg == 0)
+				nofg = 1;
+		}
+	} else if (strcasecmp(opt, "sloppy") == 0) {
+		if (sloppy == 0 && nosloppy == 0) {
+			if(strcasecmp(val, "true") == 0) {
+				sloppy = 1;
+				ret = 1;
+			} else
+				nosloppy = 1;
+		}
+	} else
+		xlog_warn("Invalid MNT_NOARG option: '%s'", opt);
+
+	return ret;
+}
+
 /*
  * Parse the given section of the configuration 
  * file to if there are any mount options set.
@@ -315,6 +357,13 @@ conf_parse_mntopts(char *section, char *arg, char *opts)
 		field = mountopts_alias(node->field, &argtype);
 		if (lookup_entry(field) != NULL)
 			continue;
+		if (argtype == MNT_NOARG) {
+			if (should_add_noarg_opt(field, value)) {
+				list_size += strlen(field) + 1;
+				add_entry(field);
+			}
+			continue;
+		}
 		if (argtype != MNT_NOARG) {
 			snprintf(buf, BUFSIZ, "no%s", field);
 			if (lookup_entry(buf) != NULL)
@@ -359,6 +408,7 @@ char *conf_get_mntopts(char *spec, char *mount_point,
 	char *ptr, *server, *config_opts;
 	int optlen = 0;
 
+	bg = nobg = fg = nofg = sloppy = nosloppy = 0;
 	SLIST_INIT(&head);
 	list_size = 0;
 	/*
-- 
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