summaryrefslogtreecommitdiffstats
path: root/misc-utils/blkid.c
diff options
context:
space:
mode:
authorKarel Zak2010-01-20 21:18:15 +0100
committerKarel Zak2010-01-21 00:16:19 +0100
commite3d8933aaa1786ed78f06e5c9792d2167801d48e (patch)
tree0ecb2b2140bed95e63bdb5888326d2aecd6f2ca8 /misc-utils/blkid.c
parentlibblkid: rewrite blkid_probe_get_buffer() (diff)
downloadkernel-qcow2-util-linux-e3d8933aaa1786ed78f06e5c9792d2167801d48e.tar.gz
kernel-qcow2-util-linux-e3d8933aaa1786ed78f06e5c9792d2167801d48e.tar.xz
kernel-qcow2-util-linux-e3d8933aaa1786ed78f06e5c9792d2167801d48e.zip
blkid: probe for PT, don't probe for FS on small whole-disks
* blkid(8) in low-level mode probes for PT now (blkid is replacement for devkit-disks-part-id) * add ID_PART_TABLE_TYPE=<name> to blkid(8) udev output * don't probe for FS/RAIDs on small devices when PT is detected Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/blkid.c')
-rw-r--r--misc-utils/blkid.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index 6e055a953..03e3b8075 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -255,7 +255,12 @@ static void print_udev_format(const char *name, const char *value, size_t sz)
blkid_encode_string(value, enc, sizeof(enc));
printf("ID_FS_%s_ENC=%s\n", name, enc);
- }
+
+ } else if (!strcmp(name, "PTTYPE"))
+ printf("ID_PART_TABLE_TYPE=%s\n", value);
+
+ /* TODO: ID_PART_ENTRY_{UUID,NAME,FLAG} */
+
else
printf("ID_FS_%s=%s\n", name, value);
}
@@ -410,6 +415,7 @@ static int lowprobe_device(blkid_probe pr, const char *devname, char *show[],
size_t len;
int fd;
int rc = 0;
+ struct stat st;
fd = open(devname, O_RDONLY);
if (fd < 0)
@@ -417,9 +423,35 @@ static int lowprobe_device(blkid_probe pr, const char *devname, char *show[],
if (blkid_probe_set_device(pr, fd, offset, size))
goto done;
- rc = blkid_do_safeprobe(pr);
- if (rc)
+
+ if (fstat(fd, &st))
goto done;
+ /*
+ * partitions probing
+ */
+ blkid_probe_enable_superblocks(pr, 0); /* enabled by default ;-( */
+
+ blkid_probe_enable_partitions(pr, 1);
+ rc = blkid_do_fullprobe(pr);
+ blkid_probe_enable_partitions(pr, 0);
+
+ if (rc < 0)
+ goto done; /* -1 = error, 1 = nothing, 0 = succes */
+
+ /*
+ * Don't probe for FS/RAIDs on small devices
+ */
+ if (rc || S_ISCHR(st.st_mode) ||
+ blkid_probe_get_size(pr) > 1024 * 1440) {
+ /*
+ * filesystems/RAIDs probing
+ */
+ blkid_probe_enable_superblocks(pr, 1);
+
+ rc = blkid_do_safeprobe(pr);
+ if (rc < 0)
+ goto done;
+ }
nvals = blkid_probe_numof_values(pr);
@@ -648,8 +680,6 @@ int main(int argc, char **argv)
if (!pr)
goto exit;
- blkid_probe_enable_superblocks(pr, 1);
-
blkid_probe_set_superblocks_flags(pr,
BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID |
BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE |