[lvm-devel] [PATCH 14/14] Proposal of different check for udev dir

Zdenek Kabelac zkabelac at redhat.com
Wed Jul 28 09:16:00 UTC 2010


This is rather test code to check differently for 'udev' dir usage.
Upstream implementation doesn't allow to use directories like
/dev/shm as normal /tmp dirs as it thinks it starts with /dev so
it is udev 'dev' dir.

Note - few different approaches are here - my prefered version
is the one in dmsetup #if 1

New code allows only  'devdir' or 'devdir/' and simplifies code around.

Also as this code seems to be needed for  dmsetup & lvm - it should be
probably moved as a dm library function usable by both.

Signed-off-by: Zdenek Kabelac <zkabelac at redhat.com>
---
 tools/dmsetup.c    |   26 +++++++++++++++++++++++---
 tools/lvmcmdline.c |    4 +++-
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index 2af9c28..3be96b4 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -978,11 +978,30 @@ static int _set_up_udev_support(const char *dev_dir)
 	 * races between udev and libdevmapper but only in case udev "dev path"
 	 * is the same as "dev path" used by libdevmapper.
 	 */
-
 	/* 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] != '/')
+#if 1
+	if ((strncmp(dev_dir, udev_dev_dir, udev_dev_dir_len) == 0) &&
+	    (dev_dir[udev_dev_dir_len] == '\0' ||
+	     (dev_dir[udev_dev_dir_len] == '/' &&
+	      dev_dir[udev_dev_dir_len + 1] == '\0'))) {
+		_udev_only = _udev_cookie;
+	} else {
+		log_debug("The path %s used for creating device nodes that is "
+			  "set via DM_DEV_DIR environment variable differs from "
+			  "the path %s that is used by udev. All warnings "
+			  "about udev not working correctly while processing "
+			  "particular nodes will be suppressed. These nodes "
+			  "and symlinks will be managed in each directory "
+			  "separately.", dev_dir, udev_dev_dir);
+		dm_udev_set_checking(0);
+		_udev_only = 0;
+	}
+#else
+	if (udev_dev_dir_len > 0 &&
+	    udev_dev_dir[udev_dev_dir_len - 1] != '/' &&
+	    strlen(dev_dir) == (udev_dev_dir_len + 1)) {
 		dirs_diff = strncmp(dev_dir, udev_dev_dir, udev_dev_dir_len);
-	else
+	} else
 		dirs_diff = strcmp(dev_dir, udev_dev_dir);
 
 	_udev_only = _udev_cookie && !dirs_diff;
@@ -997,6 +1016,7 @@ static int _set_up_udev_support(const char *dev_dir)
 			  "separately.", dev_dir, udev_dev_dir);
 		dm_udev_set_checking(0);
 	}
+#endif
 
 	udev_unref(udev);
 	return 1;
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 6c66fab..7a29e02 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -945,7 +945,9 @@ static int _set_udev_checking(struct cmd_context *cmd)
 	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] != '/')
+	if (strlen(cmd->dev_dir) > udev_dev_dir_len)
+		dirs_diff = 1;
+	else if (udev_dev_dir[udev_dev_dir_len - 1] != '/')
 		dirs_diff = strncmp(cmd->dev_dir, udev_dev_dir,
 				    udev_dev_dir_len);
 	else
-- 
1.7.2




More information about the lvm-devel mailing list