Blame SOURCES/0036-devices-drop-incorrect-paths-from-aliases-list.patch

4d51e5
From 8ba6259b24cd4b99e061f2610c5cd0bcde890039 Mon Sep 17 00:00:00 2001
4d51e5
From: David Teigland <teigland@redhat.com>
4d51e5
Date: Thu, 24 Feb 2022 16:03:21 -0600
4d51e5
Subject: [PATCH 36/54] devices: drop incorrect paths from aliases list
4d51e5
4d51e5
along with some basic checks for cases when a device
4d51e5
has no aliases.
4d51e5
4d51e5
lvm itself creates many situations where a struct device
4d51e5
has no valid paths, when it activates and opens an LV,
4d51e5
does something with it, e.g. zeroing, and then closes
4d51e5
and deactivates it.  (dev-cache is intended for PVs, and
4d51e5
the use of LVs should be moved out of dev-cache in a
4d51e5
future patch.)
4d51e5
---
4d51e5
 lib/device/dev-cache.c | 223 ++++++++++++++++++++++++++---------------
4d51e5
 lib/device/dev-cache.h |   2 +-
4d51e5
 lib/device/dev-io.c    |  34 ++++---
4d51e5
 lib/device/device.h    |   3 -
4d51e5
 4 files changed, 164 insertions(+), 98 deletions(-)
4d51e5
4d51e5
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
4d51e5
index cc1af7c7a..58e67e130 100644
4d51e5
--- a/lib/device/dev-cache.c
4d51e5
+++ b/lib/device/dev-cache.c
4d51e5
@@ -351,7 +351,7 @@ static int _add_alias(struct device *dev, const char *path, enum add_hash hash)
4d51e5
 			goto out;
4d51e5
 		}
4d51e5
 
4d51e5
-	if (!(path = dm_pool_strdup(_cache.mem, path)) ||
4d51e5
+	if (!(path = _strdup(path)) ||
4d51e5
 	    !(sl = _zalloc(sizeof(*sl)))) {
4d51e5
 		log_error("Failed to add allias to dev cache.");
4d51e5
 		return 0;
4d51e5
@@ -1162,6 +1162,17 @@ static int _insert(const char *path, const struct stat *info,
4d51e5
 	return 1;
4d51e5
 }
4d51e5
 
4d51e5
+static void _drop_all_aliases(struct device *dev)
4d51e5
+{
4d51e5
+	struct dm_str_list *strl, *strl2;
4d51e5
+
4d51e5
+	dm_list_iterate_items_safe(strl, strl2, &dev->aliases) {
4d51e5
+		log_debug("Drop alias for %d:%d %s.", (int)MAJOR(dev->dev), (int)MINOR(dev->dev), strl->str);
4d51e5
+		dm_hash_remove(_cache.names, strl->str);
4d51e5
+		dm_list_del(&strl->list);
4d51e5
+	}
4d51e5
+}
4d51e5
+
4d51e5
 void dev_cache_scan(struct cmd_context *cmd)
4d51e5
 {
4d51e5
 	log_debug_devs("Creating list of system devices.");
4d51e5
@@ -1371,59 +1382,6 @@ int dev_cache_add_dir(const char *path)
4d51e5
 	return 1;
4d51e5
 }
4d51e5
 
4d51e5
-/* Check cached device name is still valid before returning it */
4d51e5
-/* This should be a rare occurrence */
4d51e5
-/* set quiet if the cache is expected to be out-of-date */
4d51e5
-/* FIXME Make rest of code pass/cache struct device instead of dev_name */
4d51e5
-const char *dev_name_confirmed(struct device *dev, int quiet)
4d51e5
-{
4d51e5
-	struct stat buf;
4d51e5
-	const char *name;
4d51e5
-	int r;
4d51e5
-
4d51e5
-	if ((dev->flags & DEV_REGULAR))
4d51e5
-		return dev_name(dev);
4d51e5
-
4d51e5
-	while ((r = stat(name = dm_list_item(dev->aliases.n,
4d51e5
-					  struct dm_str_list)->str, &buf)) ||
4d51e5
-	       (buf.st_rdev != dev->dev)) {
4d51e5
-		if (r < 0) {
4d51e5
-			if (quiet)
4d51e5
-				log_sys_debug("stat", name);
4d51e5
-			else
4d51e5
-				log_sys_error("stat", name);
4d51e5
-		}
4d51e5
-		if (quiet)
4d51e5
-			log_debug_devs("Path %s no longer valid for device(%d,%d)",
4d51e5
-				       name, (int) MAJOR(dev->dev),
4d51e5
-				       (int) MINOR(dev->dev));
4d51e5
-		else
4d51e5
-			log_warn("Path %s no longer valid for device(%d,%d)",
4d51e5
-				 name, (int) MAJOR(dev->dev),
4d51e5
-				 (int) MINOR(dev->dev));
4d51e5
-
4d51e5
-		/* Remove the incorrect hash entry */
4d51e5
-		dm_hash_remove(_cache.names, name);
4d51e5
-
4d51e5
-		/* Leave list alone if there isn't an alternative name */
4d51e5
-		/* so dev_name will always find something to return. */
4d51e5
-		/* Otherwise add the name to the correct device. */
4d51e5
-		if (dm_list_size(&dev->aliases) > 1) {
4d51e5
-			dm_list_del(dev->aliases.n);
4d51e5
-			if (!r)
4d51e5
-				_insert(name, &buf, 0, obtain_device_list_from_udev());
4d51e5
-			continue;
4d51e5
-		}
4d51e5
-
4d51e5
-		/* Scanning issues this inappropriately sometimes. */
4d51e5
-		log_debug_devs("Aborting - please provide new pathname for what "
4d51e5
-			       "used to be %s", name);
4d51e5
-		return NULL;
4d51e5
-	}
4d51e5
-
4d51e5
-	return dev_name(dev);
4d51e5
-}
4d51e5
-
4d51e5
 struct device *dev_hash_get(const char *name)
4d51e5
 {
4d51e5
 	return (struct device *) dm_hash_lookup(_cache.names, name);
4d51e5
@@ -1452,26 +1410,23 @@ static void _remove_alias(struct device *dev, const char *name)
4d51e5
  * deactivated LV.  Those old paths are all invalid and are dropped here.
4d51e5
  */
4d51e5
 
4d51e5
-static void _verify_aliases(struct device *dev, const char *newname)
4d51e5
+static void _verify_aliases(struct device *dev)
4d51e5
 {
4d51e5
 	struct dm_str_list *strl, *strl2;
4d51e5
 	struct stat st;
4d51e5
 
4d51e5
 	dm_list_iterate_items_safe(strl, strl2, &dev->aliases) {
4d51e5
-		/* newname was just stat'd and added by caller */
4d51e5
-		if (newname && !strcmp(strl->str, newname))
4d51e5
-			continue;
4d51e5
-
4d51e5
 		if (stat(strl->str, &st) || (st.st_rdev != dev->dev)) {
4d51e5
-			log_debug("Drop invalid path %s for %d:%d (new path %s).",
4d51e5
-				  strl->str, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), newname ?: "");
4d51e5
+			log_debug("Drop alias for %d:%d invalid path %s %d:%d.",
4d51e5
+				  (int)MAJOR(dev->dev), (int)MINOR(dev->dev), strl->str,
4d51e5
+				  (int)MAJOR(st.st_rdev), (int)MINOR(st.st_rdev));
4d51e5
 			dm_hash_remove(_cache.names, strl->str);
4d51e5
 			dm_list_del(&strl->list);
4d51e5
 		}
4d51e5
 	}
4d51e5
 }
4d51e5
 
4d51e5
-struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct dev_filter *f)
4d51e5
+static struct device *_dev_cache_get(struct cmd_context *cmd, const char *name, struct dev_filter *f, int existing)
4d51e5
 {
4d51e5
 	struct device *dev = (struct device *) dm_hash_lookup(_cache.names, name);
4d51e5
 	struct stat st;
4d51e5
@@ -1485,13 +1440,18 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
4d51e5
 	if (dev && (dev->flags & DEV_REGULAR))
4d51e5
 		return dev;
4d51e5
 
4d51e5
+	if (dev && dm_list_empty(&dev->aliases)) {
4d51e5
+		/* shouldn't happen */
4d51e5
+		log_warn("Ignoring dev with no valid paths for %s.", name);
4d51e5
+		return NULL;
4d51e5
+	}
4d51e5
+
4d51e5
 	/*
4d51e5
-	 * The requested path is invalid, remove any dev-cache
4d51e5
-	 * info for it.
4d51e5
+	 * The requested path is invalid, remove any dev-cache info for it.
4d51e5
 	 */
4d51e5
 	if (stat(name, &st)) {
4d51e5
 		if (dev) {
4d51e5
-			log_print("Device path %s is invalid for %d:%d %s.",
4d51e5
+			log_debug("Device path %s is invalid for %d:%d %s.",
4d51e5
 				  name, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), dev_name(dev));
4d51e5
 
4d51e5
 			dm_hash_remove(_cache.names, name);
4d51e5
@@ -1499,11 +1459,17 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
4d51e5
 			_remove_alias(dev, name);
4d51e5
 
4d51e5
 			/* Remove any other names in dev->aliases that are incorrect. */
4d51e5
-			_verify_aliases(dev, NULL);
4d51e5
+			_verify_aliases(dev);
4d51e5
 		}
4d51e5
 		return NULL;
4d51e5
 	}
4d51e5
 
4d51e5
+	if (dev && dm_list_empty(&dev->aliases)) {
4d51e5
+		/* shouldn't happen */
4d51e5
+		log_warn("Ignoring dev with no valid paths for %s.", name);
4d51e5
+		return NULL;
4d51e5
+	}
4d51e5
+
4d51e5
 	if (!S_ISBLK(st.st_mode)) {
4d51e5
 		log_debug("Not a block device %s.", name);
4d51e5
 		return NULL;
4d51e5
@@ -1514,26 +1480,110 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
4d51e5
 	 * Remove incorrect info and then add new dev-cache entry.
4d51e5
 	 */
4d51e5
 	if (dev && (st.st_rdev != dev->dev)) {
4d51e5
-		log_debug("Device path %s does not match %d:%d %s.",
4d51e5
-			  name, (int)MAJOR(dev->dev), (int)MINOR(dev->dev), dev_name(dev));
4d51e5
+		struct device *dev_by_devt = (struct device *) btree_lookup(_cache.devices, (uint32_t) st.st_rdev);
4d51e5
+
4d51e5
+		/*
4d51e5
+		 * lvm commands create this condition when they
4d51e5
+		 * activate/deactivate LVs combined with creating new LVs.
4d51e5
+		 * The command does not purge dev structs when deactivating
4d51e5
+		 * an LV (which it probably should do), but the better
4d51e5
+		 * approach would be not using dev-cache at all for LVs.
4d51e5
+		 */
4d51e5
 
4d51e5
-		dm_hash_remove(_cache.names, name);
4d51e5
+		log_debug("Dropping aliases for device entry %d:%d %s for new device %d:%d %s.",
4d51e5
+			  (int)MAJOR(dev->dev), (int)MINOR(dev->dev), dev_name(dev),
4d51e5
+			  (int)MAJOR(st.st_rdev), (int)MINOR(st.st_rdev), name);
4d51e5
 
4d51e5
-		_remove_alias(dev, name);
4d51e5
+		_drop_all_aliases(dev);
4d51e5
 
4d51e5
-		/* Remove any other names in dev->aliases that are incorrect. */
4d51e5
-		_verify_aliases(dev, NULL);
4d51e5
+		if (dev_by_devt) {
4d51e5
+			log_debug("Dropping aliases for device entry %d:%d %s for new device %d:%d %s.",
4d51e5
+				   (int)MAJOR(dev_by_devt->dev), (int)MINOR(dev_by_devt->dev), dev_name(dev_by_devt),
4d51e5
+				   (int)MAJOR(st.st_rdev), (int)MINOR(st.st_rdev), name);
4d51e5
 
4d51e5
-		/* Add new dev-cache entry next. */
4d51e5
-		dev = NULL;
4d51e5
+			_drop_all_aliases(dev_by_devt);
4d51e5
+		}
4d51e5
+
4d51e5
+#if 0
4d51e5
+		/*
4d51e5
+		 * I think only lvm's own dm devs should be added here, so use
4d51e5
+		 * a warning to look for any other unknown cases.
4d51e5
+		 */
4d51e5
+		if (MAJOR(st.st_rdev) != cmd->dev_types->device_mapper_major) {
4d51e5
+			log_warn("WARNING: new device appeared %d:%d %s",
4d51e5
+				  (int)MAJOR(st.st_rdev), (int)(MINOR(st.st_rdev)), name);
4d51e5
+		}
4d51e5
+#endif
4d51e5
+
4d51e5
+		if (!_insert_dev(name, st.st_rdev))
4d51e5
+			return_NULL;
4d51e5
+
4d51e5
+		/* Get the struct dev that was just added. */
4d51e5
+		dev = (struct device *) dm_hash_lookup(_cache.names, name);
4d51e5
+
4d51e5
+		if (!dev) {
4d51e5
+			log_error("Failed to get device %s", name);
4d51e5
+			return NULL;
4d51e5
+		}
4d51e5
+
4d51e5
+		goto out;
4d51e5
 	}
4d51e5
 
4d51e5
+	if (dev && dm_list_empty(&dev->aliases)) {
4d51e5
+		/* shouldn't happen */
4d51e5
+		log_warn("Ignoring dev with no valid paths for %s.", name);
4d51e5
+		return NULL;
4d51e5
+	}
4d51e5
+
4d51e5
+	if (!dev && existing)
4d51e5
+		return_NULL;
4d51e5
+
4d51e5
 	/*
4d51e5
-	 * Either add a new struct dev for st_rdev and name,
4d51e5
-	 * or add name as a new alias for an existing struct dev
4d51e5
-	 * for st_rdev.
4d51e5
+	 * This case should never be hit for a PV. It should only
4d51e5
+	 * happen when the command is opening a new LV it has created.
4d51e5
+	 * Add an arg to all callers indicating when the arg should be
4d51e5
+	 * new (for an LV) and not existing.
4d51e5
+	 * FIXME: fix this further by not using dev-cache struct devs
4d51e5
+	 * at all for new dm devs (LVs) that lvm uses.  Make the
4d51e5
+	 * dev-cache contain only devs for PVs.
4d51e5
+	 * Places to fix that use a dev for LVs include:
4d51e5
+	 * . lv_resize opening lv to discard
4d51e5
+	 * . wipe_lv opening lv to zero it
4d51e5
+	 * . _extend_sanlock_lv opening lv to extend it
4d51e5
+	 * . _write_log_header opening lv to write header
4d51e5
+	 * Also, io to LVs should not go through bcache.
4d51e5
+	 * bcache should contain only labels and metadata
4d51e5
+	 * scanned from PVs.
4d51e5
 	 */
4d51e5
 	if (!dev) {
4d51e5
+		/*
4d51e5
+		 * This case should only be used for new devices created by this
4d51e5
+		 * command (opening LVs it's created), so if a dev exists for the
4d51e5
+		 * dev_t referenced by the name, then drop all aliases for before
4d51e5
+		 * _insert_dev adds the new name.  lvm commands actually hit this
4d51e5
+		 * fairly often when it uses some LV, deactivates the LV, then
4d51e5
+		 * creates some new LV which ends up with the same major:minor.
4d51e5
+		 * Without dropping the aliases, it's plausible that lvm commands
4d51e5
+		 * could end up using the wrong dm device.
4d51e5
+		 */
4d51e5
+		struct device *dev_by_devt = (struct device *) btree_lookup(_cache.devices, (uint32_t) st.st_rdev);
4d51e5
+		if (dev_by_devt) {
4d51e5
+			log_debug("Dropping aliases for %d:%d before adding new path %s.",
4d51e5
+				  (int)MAJOR(st.st_rdev), (int)(MINOR(st.st_rdev)), name);
4d51e5
+			_drop_all_aliases(dev_by_devt);
4d51e5
+		}
4d51e5
+
4d51e5
+#if 0
4d51e5
+		/*
4d51e5
+		 * I think only lvm's own dm devs should be added here, so use
4d51e5
+		 * a warning to look for any other unknown cases.
4d51e5
+		 */
4d51e5
+		if (MAJOR(st.st_rdev) != cmd->dev_types->device_mapper_major) {
4d51e5
+			log_warn("WARNING: new device appeared %d:%d %s",
4d51e5
+				  (int)MAJOR(st.st_rdev), (int)(MINOR(st.st_rdev)), name);
4d51e5
+		}
4d51e5
+#endif
4d51e5
+
4d51e5
 		if (!_insert_dev(name, st.st_rdev))
4d51e5
 			return_NULL;
4d51e5
 
4d51e5
@@ -1544,10 +1594,9 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
4d51e5
 			log_error("Failed to get device %s", name);
4d51e5
 			return NULL;
4d51e5
 		}
4d51e5
-
4d51e5
-		_verify_aliases(dev, name);
4d51e5
 	}
4d51e5
 
4d51e5
+ out:
4d51e5
 	/*
4d51e5
 	 * The caller passed a filter if they only want the dev if it
4d51e5
 	 * passes filters.
4d51e5
@@ -1577,6 +1626,16 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
4d51e5
 	return dev;
4d51e5
 }
4d51e5
 
4d51e5
+struct device *dev_cache_get_existing(struct cmd_context *cmd, const char *name, struct dev_filter *f)
4d51e5
+{
4d51e5
+	return _dev_cache_get(cmd, name, f, 1);
4d51e5
+}
4d51e5
+
4d51e5
+struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct dev_filter *f)
4d51e5
+{
4d51e5
+	return _dev_cache_get(cmd, name, f, 0);
4d51e5
+}
4d51e5
+
4d51e5
 struct device *dev_cache_get_by_devt(struct cmd_context *cmd, dev_t devt)
4d51e5
 {
4d51e5
 	struct device *dev = (struct device *) btree_lookup(_cache.devices, (uint32_t) devt);
4d51e5
@@ -1653,8 +1712,10 @@ int dev_fd(struct device *dev)
4d51e5
 
4d51e5
 const char *dev_name(const struct device *dev)
4d51e5
 {
4d51e5
-	return (dev && dev->aliases.n) ? dm_list_item(dev->aliases.n, struct dm_str_list)->str :
4d51e5
-	    unknown_device_name();
4d51e5
+	if (dev && dev->aliases.n && !dm_list_empty(&dev->aliases))
4d51e5
+		return dm_list_item(dev->aliases.n, struct dm_str_list)->str;
4d51e5
+	else
4d51e5
+		return unknown_device_name();
4d51e5
 }
4d51e5
 
4d51e5
 bool dev_cache_has_md_with_end_superblock(struct dev_types *dt)
4d51e5
diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h
4d51e5
index 7305eeb0e..51c3fc6c3 100644
4d51e5
--- a/lib/device/dev-cache.h
4d51e5
+++ b/lib/device/dev-cache.h
4d51e5
@@ -53,7 +53,7 @@ int dev_cache_has_scanned(void);
4d51e5
 
4d51e5
 int dev_cache_add_dir(const char *path);
4d51e5
 struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct dev_filter *f);
4d51e5
-
4d51e5
+struct device *dev_cache_get_existing(struct cmd_context *cmd, const char *name, struct dev_filter *f);
4d51e5
 struct device *dev_cache_get_by_devt(struct cmd_context *cmd, dev_t devt);
4d51e5
 
4d51e5
 struct device *dev_hash_get(const char *name);
4d51e5
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
4d51e5
index b4f1930b1..811ad8978 100644
4d51e5
--- a/lib/device/dev-io.c
4d51e5
+++ b/lib/device/dev-io.c
4d51e5
@@ -58,6 +58,9 @@ static int _dev_get_size_file(struct device *dev, uint64_t *size)
4d51e5
 	const char *name = dev_name(dev);
4d51e5
 	struct stat info;
4d51e5
 
4d51e5
+	if (dm_list_empty(&dev->aliases))
4d51e5
+		return_0;
4d51e5
+
4d51e5
 	if (dev->size_seqno == _dev_size_seqno) {
4d51e5
 		log_very_verbose("%s: using cached size %" PRIu64 " sectors",
4d51e5
 				 name, dev->size);
4d51e5
@@ -87,7 +90,7 @@ static int _dev_get_size_dev(struct device *dev, uint64_t *size)
4d51e5
 	int do_close = 0;
4d51e5
 
4d51e5
 	if (dm_list_empty(&dev->aliases))
4d51e5
-		return 0;
4d51e5
+		return_0;
4d51e5
 
4d51e5
 	if (dev->size_seqno == _dev_size_seqno) {
4d51e5
 		log_very_verbose("%s: using cached size %" PRIu64 " sectors",
4d51e5
@@ -305,6 +308,13 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
4d51e5
 	if ((flags & O_EXCL))
4d51e5
 		need_excl = 1;
4d51e5
 
4d51e5
+	if (dm_list_empty(&dev->aliases)) {
4d51e5
+		/* shouldn't happen */
4d51e5
+		log_print("Cannot open device %d:%d with no valid paths.", (int)MAJOR(dev->dev), (int)MINOR(dev->dev));
4d51e5
+		return 0;
4d51e5
+	}
4d51e5
+	name = dev_name(dev);
4d51e5
+
4d51e5
 	if (dev->fd >= 0) {
4d51e5
 		if (((dev->flags & DEV_OPENED_RW) || !need_rw) &&
4d51e5
 		    ((dev->flags & DEV_OPENED_EXCL) || !need_excl)) {
4d51e5
@@ -314,7 +324,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
4d51e5
 
4d51e5
 		if (dev->open_count && !need_excl)
4d51e5
 			log_debug_devs("%s: Already opened read-only. Upgrading "
4d51e5
-				       "to read-write.", dev_name(dev));
4d51e5
+				       "to read-write.", name);
4d51e5
 
4d51e5
 		/* dev_close_immediate will decrement this */
4d51e5
 		dev->open_count++;
4d51e5
@@ -327,11 +337,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
4d51e5
 
4d51e5
 	if (critical_section())
4d51e5
 		/* FIXME Make this log_error */
4d51e5
-		log_verbose("dev_open(%s) called while suspended",
4d51e5
-			    dev_name(dev));
4d51e5
-
4d51e5
-	if (!(name = dev_name_confirmed(dev, quiet)))
4d51e5
-		return_0;
4d51e5
+		log_verbose("dev_open(%s) called while suspended", name);
4d51e5
 
4d51e5
 #ifdef O_DIRECT_SUPPORT
4d51e5
 	if (direct) {
4d51e5
@@ -372,9 +378,9 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
4d51e5
 		}
4d51e5
 #endif
4d51e5
 		if (quiet)
4d51e5
-			log_sys_debug("open", name);
4d51e5
+			log_debug("Failed to open device path %s (%d).", name, errno);
4d51e5
 		else
4d51e5
-			log_sys_error("open", name);
4d51e5
+			log_error("Failed to open device path %s (%d).", name, errno);
4d51e5
 
4d51e5
 		dev->flags |= DEV_OPEN_FAILURE;
4d51e5
 		return 0;
4d51e5
@@ -415,10 +421,12 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
4d51e5
 	if ((flags & O_CREAT) && !(flags & O_TRUNC))
4d51e5
 		dev->end = lseek(dev->fd, (off_t) 0, SEEK_END);
4d51e5
 
4d51e5
-	log_debug_devs("Opened %s %s%s%s", dev_name(dev),
4d51e5
-		       dev->flags & DEV_OPENED_RW ? "RW" : "RO",
4d51e5
-		       dev->flags & DEV_OPENED_EXCL ? " O_EXCL" : "",
4d51e5
-		       dev->flags & DEV_O_DIRECT ? " O_DIRECT" : "");
4d51e5
+	if (!quiet) {
4d51e5
+		log_debug_devs("Opened %s %s%s%s", name,
4d51e5
+				dev->flags & DEV_OPENED_RW ? "RW" : "RO",
4d51e5
+				dev->flags & DEV_OPENED_EXCL ? " O_EXCL" : "",
4d51e5
+				dev->flags & DEV_O_DIRECT ? " O_DIRECT" : "");
4d51e5
+	}
4d51e5
 
4d51e5
 	dev->flags &= ~DEV_OPEN_FAILURE;
4d51e5
 	return 1;
4d51e5
diff --git a/lib/device/device.h b/lib/device/device.h
4d51e5
index 8c3a8c30e..572994bb9 100644
4d51e5
--- a/lib/device/device.h
4d51e5
+++ b/lib/device/device.h
4d51e5
@@ -204,9 +204,6 @@ struct device *dev_create_file(const char *filename, struct device *dev,
4d51e5
 			       struct dm_str_list *alias, int use_malloc);
4d51e5
 void dev_destroy_file(struct device *dev);
4d51e5
 
4d51e5
-/* Return a valid device name from the alias list; NULL otherwise */
4d51e5
-const char *dev_name_confirmed(struct device *dev, int quiet);
4d51e5
-
4d51e5
 int dev_mpath_init(const char *config_wwids_file);
4d51e5
 void dev_mpath_exit(void);
4d51e5
 
4d51e5
-- 
4d51e5
2.34.3
4d51e5