[lvm-devel] LVM2 lib/commands/toolcontext.c tools/lvmcmdline.c

agk at sourceware.org agk at sourceware.org
Mon Jun 27 23:43:05 UTC 2011


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	agk at sourceware.org	2011-06-27 23:43:04

Modified files:
	lib/commands   : toolcontext.c 
	tools          : lvmcmdline.c 

Log message:
	Move _set_lvm_fallback into toolcontext, fix string comparison (/devtest
	matched /dev) and note that function should go anyway as it can be
	overriding a valid config.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/commands/toolcontext.c.diff?cvsroot=lvm2&r1=1.121&r2=1.122
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvmcmdline.c.diff?cvsroot=lvm2&r1=1.143&r2=1.144

--- LVM2/lib/commands/toolcontext.c	2011/06/27 21:43:59	1.121
+++ LVM2/lib/commands/toolcontext.c	2011/06/27 23:43:04	1.122
@@ -200,6 +200,51 @@
 	reset_lvm_errno(1);
 }
 
+/*
+ * Prevent people disabling udev fallback if using a non-standard dev dir.
+ * FIXME: Remove this function.  lvm.conf provides sufficient control.
+ */
+static int _enforce_udev_fallback(struct cmd_context *cmd)
+{
+#ifdef UDEV_SYNC_SUPPORT
+	const char *udev_dev_dir;
+	size_t udev_dev_dir_len;
+	unsigned dirs_match;
+
+	if (!(udev_dev_dir = udev_get_dev_dir()) ||
+	    !*udev_dev_dir) {
+		log_error("Could not get udev dev path.");
+		return 0;
+	}
+	udev_dev_dir_len = strlen(udev_dev_dir);
+
+	/* There's always a slash at the end of dev_dir. But check udev_dev_dir! */
+	if (udev_dev_dir[udev_dev_dir_len - 1] != '/')
+		dirs_match = (udev_dev_dir_len + 1 == strlen(cmd->dev_dir)) &&
+			    !strncmp(cmd->dev_dir, udev_dev_dir, udev_dev_dir_len);
+	else
+		dirs_match = !strcmp(cmd->dev_dir, udev_dev_dir);
+
+	if (!dirs_match) {
+		log_debug("The path %s used for creating device nodes and "
+			  "symlinks that is set in the configuration differs "
+			  "from the path %s that is used by udev. All warnings "
+			  "about udev not working correctly while processing "
+			  "particular nodes and symlinks will be suppressed. "
+			  "These nodes and symlinks will be managed in each "
+			  "directory separately.",
+			   cmd->dev_dir, udev_dev_dir);
+		dm_udev_set_checking(0);
+		init_udev_checking(0);
+
+		/* Device directories differ - we must use the fallback code! */
+		cmd->default_settings.udev_fallback = 1;
+	}
+
+#endif
+	return 1;
+}
+
 static int _process_config(struct cmd_context *cmd)
 {
 	mode_t old_umask;
@@ -285,20 +330,23 @@
 								"activation/udev_sync",
 								DEFAULT_UDEV_SYNC);
 
-	#ifdef UDEV_SYNC_SUPPORT
+#ifdef UDEV_SYNC_SUPPORT
 	/*
 	 * We need udev rules to be applied, otherwise we would end up with no
 	 * nodes and symlinks! However, we can disable the synchronization itself
 	 * in runtime and still have only udev to create the nodes and symlinks
 	 * without any fallback.
 	 */
-	cmd->default_settings.udev_fallback = cmd->default_settings.udev_rules ?
-					find_config_tree_int(cmd, "activation/verify_udev_operations",
-							     DEFAULT_VERIFY_UDEV_OPERATIONS) : 1;
-	#else
+	if ((cmd->default_settings.udev_fallback = cmd->default_settings.udev_rules ?
+		find_config_tree_int(cmd, "activation/verify_udev_operations",
+				     DEFAULT_VERIFY_UDEV_OPERATIONS) : 1) &&
+	    !_enforce_udev_fallback(cmd))
+		return_0;
+
+#else
 	/* We must use old node/symlink creation code if not compiled with udev support at all! */
 	cmd->default_settings.udev_fallback = 1;
-	#endif
+#endif
 
 	cmd->stripe_filler = find_config_tree_str(cmd,
 						  "activation/missing_stripe_filler",
--- LVM2/tools/lvmcmdline.c	2011/06/17 14:50:54	1.143
+++ LVM2/tools/lvmcmdline.c	2011/06/27 23:43:04	1.144
@@ -42,10 +42,6 @@
 #  define OPTIND_INIT 1
 #endif
 
-#ifdef UDEV_SYNC_SUPPORT
-#  include <libudev.h>
-#endif
-
 /*
  * Table of valid switches
  */
@@ -864,8 +860,10 @@
 	} else
 		init_trust_cache(0);
 
-	if (arg_count(cmd, noudevsync_ARG))
+	if (arg_count(cmd, noudevsync_ARG)) {
 		cmd->current_settings.udev_sync = 0;
+		cmd->current_settings.udev_fallback = 1;
+	}
 
 	/* Handle synonyms */
 	if (!_merge_synonym(cmd, resizable_ARG, resizeable_ARG) ||
@@ -952,47 +950,6 @@
 	cmd->handles_missing_pvs = 0;
 }
 
-static int _set_udev_fallback(struct cmd_context *cmd)
-{
-#ifdef UDEV_SYNC_SUPPORT
-	const char *udev_dev_dir;
-	size_t udev_dev_dir_len;
-	int dirs_diff;
-
-	if (!(udev_dev_dir = udev_get_dev_dir()) ||
-	    !*udev_dev_dir) {
-		log_error("Could not get udev dev path.");
-		return 0;
-	}
-	udev_dev_dir_len = strlen(udev_dev_dir);
-
-	/* There's always a slash at the end of dev_dir. But check udev_dev_dir! */
-	if (udev_dev_dir[udev_dev_dir_len - 1] != '/')
-		dirs_diff = strncmp(cmd->dev_dir, udev_dev_dir,
-				    udev_dev_dir_len);
-	else
-		dirs_diff = strcmp(cmd->dev_dir, udev_dev_dir);
-
-	if (dirs_diff) {
-		log_debug("The path %s used for creating device nodes and "
-			  "symlinks that is set in the configuration differs "
-			  "from the path %s that is used by udev. All warnings "
-			  "about udev not working correctly while processing "
-			  "particular nodes and symlinks will be suppressed. "
-			  "These nodes and symlinks will be managed in each "
-			  "directory separately.",
-			   cmd->dev_dir, udev_dev_dir);
-		dm_udev_set_checking(0);
-		init_udev_checking(0);
-
-		/* Device directories differ - we must use the fallback code! */
-		cmd->current_settings.udev_fallback = 1;
-	}
-
-#endif
-	return 1;
-}
-
 static const char *_copy_command_line(struct cmd_context *cmd, int argc, char **argv)
 {
 	int i, space;
@@ -1091,9 +1048,6 @@
 	log_debug("O_DIRECT will be used");
 #endif
 
-	if (!_set_udev_fallback(cmd))
-		goto_out;
-
 	if ((ret = _process_common_commands(cmd))) {
 		if (ret != ECMD_PROCESSED)
 			stack;




More information about the lvm-devel mailing list