util-linux/libblkid-remove-optimization-from-verify-function.patch
Karel Zak 8e3b51d51a 2.22.2-3
- fix #882305 - agetty: unstable /dev/tty* permissions
- fix #885314 - hexdump segfault
- fix #896447 - No newlines in piped "cal" command
- fix libblkid cache usage (upstream patch)
- fix #905008 - uuidd: /usr/sbin/uuidd has incorrect file permissions

Signed-off-by: Karel Zak <kzak@redhat.com>
2013-02-03 17:13:24 +01:00

166 lines
5.2 KiB
Diff

From 2270b1ad90b394950f4fe215eb2fc1042020cef0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 1 Feb 2013 15:59:58 +0100
Subject: [PATCH] libblkid: remove optimization from verify( funrtion
Now libblkid (the cache based part) tries to probe for the cached
filesystem firstly. This optimization is broken, because:
* new another superblock could be on the device and the original
is already obsolete
* we still need to probe for partitions and raids
* the code was too fragile
The patch also suggests lsblk --fs in blkid.8 for end users. lsblk
read information from used db.
Reported-by: Andreas Hofmeister <andi@collax.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/verify.c | 76 ++++++++-------------------------------------------
misc-utils/blkid.8 | 11 ++++++++
2 files changed, 22 insertions(+), 65 deletions(-)
diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c
index 4bab4de..0f48c48 100644
--- a/libblkid/src/verify.c
+++ b/libblkid/src/verify.c
@@ -43,26 +43,6 @@ static void blkid_probe_to_tags(blkid_probe pr, blkid_dev dev)
blkid_set_tag(dev, name, data, len);
}
}
-
- /*
- * remove obsolete tags
- */
- if (!nvals || !blkid_probe_has_value(pr, "LABEL"))
- blkid_set_tag(dev, "LABEL", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "UUID"))
- blkid_set_tag(dev, "UUID", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "PART_ENTRY_UUID"))
- blkid_set_tag(dev, "PARTUUID", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "PART_ENTRY_NAME"))
- blkid_set_tag(dev, "PARTLABEL", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "TYPE"))
- blkid_set_tag(dev, "TYPE", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "SEC_TYPE"))
- blkid_set_tag(dev, "SEC_TYPE", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "EXT_JOURNAL")) /* extN */
- blkid_set_tag(dev, "EXT_JOURNAL", NULL, 0);
- if (!nvals || !blkid_probe_has_value(pr, "MOUNT")) /* ocfs */
- blkid_set_tag(dev, "MOUNT", NULL, 0);
}
/*
@@ -76,9 +56,10 @@ static void blkid_probe_to_tags(blkid_probe pr, blkid_dev dev)
*/
blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev)
{
+ blkid_tag_iterate iter;
+ const char *type, *value;
struct stat st;
time_t diff, now;
- char *fltr[2];
int fd;
if (!dev)
@@ -155,64 +136,29 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev)
return NULL;
}
- blkid_probe_enable_superblocks(cache->probe, TRUE);
+ /* remove old cache info */
+ iter = blkid_tag_iterate_begin(dev);
+ while (blkid_tag_next(iter, &type, &value) == 0)
+ blkid_set_tag(dev, type, NULL, 0);
+ blkid_tag_iterate_end(iter);
+ /* enable superblocks probing */
+ blkid_probe_enable_superblocks(cache->probe, TRUE);
blkid_probe_set_superblocks_flags(cache->probe,
BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID |
BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE);
- /*
- * If we already know the type, then try that first.
- */
- if (dev->bid_type) {
- blkid_tag_iterate iter;
- const char *type, *value;
-
- fltr[0] = dev->bid_type;
- fltr[1] = NULL;
-
- blkid_probe_filter_superblocks_type(cache->probe,
- BLKID_FLTR_ONLYIN, fltr);
-
- if (blkid_do_probe(cache->probe) == 0) {
- /*
- * Cool, we found FS type, let's also read PART{UUID,LABEL}
- */
- blkid_probe_enable_superblocks(cache->probe, FALSE);
- blkid_probe_enable_partitions(cache->probe, TRUE);
- blkid_probe_set_partitions_flags(cache->probe, BLKID_PARTS_ENTRY_DETAILS);
- if (blkid_do_probe(cache->probe) == 0)
- goto found_type;
- }
-
- blkid_probe_enable_superblocks(cache->probe, TRUE);
- blkid_probe_invert_superblocks_filter(cache->probe);
-
- /*
- * Zap the device filesystem information and try again
- */
- DBG(DEBUG_PROBE,
- printf("previous fs type %s not valid, "
- "trying full probe\n", dev->bid_type));
- iter = blkid_tag_iterate_begin(dev);
- while (blkid_tag_next(iter, &type, &value) == 0)
- blkid_set_tag(dev, type, 0, 0);
- blkid_tag_iterate_end(iter);
- }
-
+ /* enable partitions probing */
blkid_probe_enable_partitions(cache->probe, TRUE);
blkid_probe_set_partitions_flags(cache->probe, BLKID_PARTS_ENTRY_DETAILS);
- /*
- * Probe for all types.
- */
+ /* probe */
if (blkid_do_safeprobe(cache->probe)) {
/* found nothing or error */
blkid_free_dev(dev);
dev = NULL;
}
-found_type:
if (dev) {
#ifdef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
struct timeval tv;
diff --git a/misc-utils/blkid.8 b/misc-utils/blkid.8
index 2ba1ab4..eb8d716 100644
--- a/misc-utils/blkid.8
+++ b/misc-utils/blkid.8
@@ -64,6 +64,17 @@ library. It can determine the type of content (e.g. filesystem or swap)
that a block device holds, and also attributes (tokens, NAME=value pairs)
from the content metadata (e.g. LABEL or UUID fields).
.PP
+Note that
+.B blkid
+reads information directly from devices and for non-root users
+it returns cached unverified information. It's better to use
+.B lsblk --fs
+to get user-friendly overview about filesystems and devices.
+.BR lsblk (8)
+is also easy to use in scripts.
+.B blkid
+is mostly designed for system services and to test libblkid functionality.
+.PP
.B blkid
has two main forms of operation: either searching for a device with a
specific NAME=value pair, or displaying NAME=value pairs for one or
--
1.8.1