From 9b72b46e085d6b166e06f9674657595baf57acd7 Mon Sep 17 00:00:00 2001 From: basebuilder_pel7ppc64bebuilder0 Date: Thu, 17 May 2018 19:13:30 +0200 Subject: [PATCH] util linux patches Signed-off-by: basebuilder_pel7ppc64bebuilder0 --- ...only-canonical-devnames-to-the-cache.patch | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 SOURCES/0085-libblkid-store-only-canonical-devnames-to-the-cache.patch diff --git a/SOURCES/0085-libblkid-store-only-canonical-devnames-to-the-cache.patch b/SOURCES/0085-libblkid-store-only-canonical-devnames-to-the-cache.patch new file mode 100644 index 00000000..8ee9aac6 --- /dev/null +++ b/SOURCES/0085-libblkid-store-only-canonical-devnames-to-the-cache.patch @@ -0,0 +1,175 @@ +From 75b6c0e045abb7e07773b924237c562ab9920c60 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Thu, 26 May 2016 12:02:12 +0200 +Subject: [PATCH 85/86] libblkid: store only canonical devnames to the cache + +Let's try to use symlink: + + # ls -la /dev/block/8\:1 + # lrwxrwxrwx 1 root root 7 May 25 16:42 /dev/block/8:1 -> ../sda1 + + # blkid /dev/block/8:1 + /dev/block/8:3: LABEL="HOME" UUID="196972ad-3b13-4bba-ac54-4cb3f7b409a4" TYPE="ext4" PARTUUID="6073277f-87bc-43ff-bcfd-724c4484a63a" + +unfortunately the symlink is stored to the cache: + + /dev/block/8:3 + +next time if you ask for LABEL=HOME the answer will be /dev/block/8:3 +rather than /dev/sda3. + +It seems better to canonicalize the paths we store to the cache. + +Unfortunately if you ask for /dev/block/8:3 then you probably expect +that blkid_dev_devname() returns the same path. This patch introduces +dev->bid_xname, this is the path used by application (and never stored +in the cache). + +Upstream: http://github.com/karelzak/util-linux/commit/924c93d9df118338fd54cd73b4a45ccddc4ac103 +Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1007734 +Signed-off-by: Karel Zak +--- + libblkid/src/blkidP.h | 4 +++- + libblkid/src/dev.c | 11 +++++++++-- + libblkid/src/devname.c | 43 +++++++++++++++++++++++++++++++++++++------ + 3 files changed, 49 insertions(+), 9 deletions(-) + +diff --git a/libblkid/src/blkidP.h b/libblkid/src/blkidP.h +index 7de84b4..8183c12 100644 +--- a/libblkid/src/blkidP.h ++++ b/libblkid/src/blkidP.h +@@ -44,7 +44,7 @@ struct blkid_struct_dev + struct list_head bid_devs; /* All devices in the cache */ + struct list_head bid_tags; /* All tags for this device */ + blkid_cache bid_cache; /* Dev belongs to this cache */ +- char *bid_name; /* Device inode pathname */ ++ char *bid_name; /* Device real pathn (as used in cache) */ + char *bid_type; /* Preferred device TYPE */ + int bid_pri; /* Device priority */ + dev_t bid_devno; /* Device major/minor number */ +@@ -53,6 +53,8 @@ struct blkid_struct_dev + unsigned int bid_flags; /* Device status bitflags */ + char *bid_label; /* Shortcut to device LABEL */ + char *bid_uuid; /* Shortcut to binary UUID */ ++ ++ char *bid_xname; /* Device path as used by application (maybe symlink..) */ + }; + + #define BLKID_BID_FL_VERIFIED 0x0001 /* Device data validated from disk */ +diff --git a/libblkid/src/dev.c b/libblkid/src/dev.c +index a4b2aea..d2fd3f4 100644 +--- a/libblkid/src/dev.c ++++ b/libblkid/src/dev.c +@@ -60,16 +60,23 @@ void blkid_free_dev(blkid_dev dev) + bit_tags); + blkid_free_tag(tag); + } ++ free(dev->bid_xname); + free(dev->bid_name); + free(dev); + } + + /* +- * Given a blkid device, return its name ++ * Given a blkid device, return its name. The function returns the name ++ * previously used for blkid_get_dev(). This name does not have to be canonical ++ * (real path) name, but for example symlink. + */ + const char *blkid_dev_devname(blkid_dev dev) + { +- return dev ? dev->bid_name : NULL; ++ if (!dev) ++ return NULL; ++ if (dev->bid_xname) ++ return dev->bid_xname; ++ return dev->bid_name; + } + + #ifdef CONFIG_BLKID_DEBUG +diff --git a/libblkid/src/devname.c b/libblkid/src/devname.c +index 497deaf..55b9594 100644 +--- a/libblkid/src/devname.c ++++ b/libblkid/src/devname.c +@@ -51,28 +51,55 @@ blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags) + { + blkid_dev dev = NULL, tmp; + struct list_head *p, *pnext; ++ char *cn = NULL; + + if (!cache || !devname) + return NULL; + ++ /* search by name */ + list_for_each(p, &cache->bic_devs) { + tmp = list_entry(p, struct blkid_struct_dev, bid_devs); + if (strcmp(tmp->bid_name, devname)) + continue; +- +- DBG(DEVNAME, blkid_debug("found devname %s in cache", tmp->bid_name)); + dev = tmp; + break; + } + ++ /* try canonicalize the name */ ++ if (!dev && (cn = canonicalize_path(devname))) { ++ if (strcmp(cn, devname) != 0) { ++ DBG(DEVNAME, blkid_debug("search cannonical %s", cn)); ++ list_for_each(p, &cache->bic_devs) { ++ tmp = list_entry(p, struct blkid_struct_dev, bid_devs); ++ if (strcmp(tmp->bid_name, cn)) ++ continue; ++ dev = tmp; ++ ++ /* update name returned by blkid_dev_devname() */ ++ free(dev->bid_xname); ++ dev->bid_xname = strdup(devname); ++ break; ++ } ++ } else { ++ free(cn); ++ cn = NULL; ++ } ++ } ++ + if (!dev && (flags & BLKID_DEV_CREATE)) { + if (access(devname, F_OK) < 0) +- return NULL; ++ goto done; + dev = blkid_new_dev(); + if (!dev) +- return NULL; ++ goto done; + dev->bid_time = INT_MIN; +- dev->bid_name = strdup(devname); ++ if (cn) { ++ dev->bid_name = cn; ++ dev->bid_xname = strdup(devname); ++ cn = NULL; /* see free() below */ ++ } else ++ dev->bid_name = strdup(devname); ++ + dev->bid_cache = cache; + list_add_tail(&dev->bid_devs, &cache->bic_devs); + cache->bic_flags |= BLKID_BIC_FL_CHANGED; +@@ -81,7 +108,7 @@ blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags) + if (flags & BLKID_DEV_VERIFY) { + dev = blkid_verify(cache, dev); + if (!dev || !(dev->bid_flags & BLKID_BID_FL_VERIFIED)) +- return dev; ++ goto done; + /* + * If the device is verified, then search the blkid + * cache for any entries that match on the type, uuid, +@@ -112,6 +139,10 @@ blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags) + blkid_free_dev(dev2); + } + } ++done: ++ if (dev) ++ DBG(DEVNAME, blkid_debug("%s requested, found %s in cache", devname, dev->bid_name)); ++ free(cn); + return dev; + } + +-- +2.7.4