summaryrefslogtreecommitdiffstats
path: root/shlibs/blkid/src/partitions
diff options
context:
space:
mode:
authorKarel Zak2010-04-07 09:39:05 +0200
committerKarel Zak2010-04-07 09:39:05 +0200
commit9f4664ee40618b3d393161d82d000f2bca4ec45a (patch)
tree0418c5210dc380b163a82a09d17f5a7e1e345eea /shlibs/blkid/src/partitions
parentlibblkid: fix blkid_partlist_devno_to_partition() for extended partitions (diff)
downloadkernel-qcow2-util-linux-9f4664ee40618b3d393161d82d000f2bca4ec45a.tar.gz
kernel-qcow2-util-linux-9f4664ee40618b3d393161d82d000f2bca4ec45a.tar.xz
kernel-qcow2-util-linux-9f4664ee40618b3d393161d82d000f2bca4ec45a.zip
libblkid: fix 'partno' usage
Linux kernel ignores empty partitions, but partition number is always allocated for the partition. (This rule is used for primary partitions only.) For example: part 1. size=12345 part 2. size=0 part 3. size=24567 the final list of partitions: sda1 sda3 'sda2' is not defined and partno=2 is not used for any other partitions. The libblkid library has to be compatible with this rule. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'shlibs/blkid/src/partitions')
-rw-r--r--shlibs/blkid/src/partitions/dos.c7
-rw-r--r--shlibs/blkid/src/partitions/gpt.c6
-rw-r--r--shlibs/blkid/src/partitions/partitions.c11
-rw-r--r--shlibs/blkid/src/partitions/partitions.h2
-rw-r--r--shlibs/blkid/src/partitions/sgi.c5
-rw-r--r--shlibs/blkid/src/partitions/sun.c5
6 files changed, 26 insertions, 10 deletions
diff --git a/shlibs/blkid/src/partitions/dos.c b/shlibs/blkid/src/partitions/dos.c
index c9865b75d..7c95b8bea 100644
--- a/shlibs/blkid/src/partitions/dos.c
+++ b/shlibs/blkid/src/partitions/dos.c
@@ -203,9 +203,12 @@ static int probe_dos_pt(blkid_probe pr, const struct blkid_idmag *mag)
start = dos_partition_start(p) * ssf;
size = dos_partition_size(p) * ssf;
- if (!size)
+ if (!size) {
+ /* Linux kernel ignores empty partitions, but partno for
+ * the empty primary partitions is not reused */
+ blkid_partlist_increment_partno(ls);
continue;
-
+ }
par = blkid_partlist_add_partition(ls, tab, start, size);
if (!par)
goto err;
diff --git a/shlibs/blkid/src/partitions/gpt.c b/shlibs/blkid/src/partitions/gpt.c
index 569490131..12100e0f8 100644
--- a/shlibs/blkid/src/partitions/gpt.c
+++ b/shlibs/blkid/src/partitions/gpt.c
@@ -328,14 +328,16 @@ static int probe_gpt_pt(blkid_probe pr, const struct blkid_idmag *mag)
le64_to_cpu(e->starting_lba) + 1ULL;
/* 00000000-0000-0000-0000-000000000000 entry */
- if (!guidcmp(e->partition_type_guid, GPT_UNUSED_ENTRY_GUID))
+ if (!guidcmp(e->partition_type_guid, GPT_UNUSED_ENTRY_GUID)) {
+ blkid_partlist_increment_partno(ls);
continue;
-
+ }
/* the partition has to inside usable range */
if (start < fu || start + size - 1 > lu) {
DBG(DEBUG_LOWPROBE, printf(
"GPT entry[%d] overflows usable area - ignore\n",
i));
+ blkid_partlist_increment_partno(ls);
continue;
}
diff --git a/shlibs/blkid/src/partitions/partitions.c b/shlibs/blkid/src/partitions/partitions.c
index a5c56c889..219a19732 100644
--- a/shlibs/blkid/src/partitions/partitions.c
+++ b/shlibs/blkid/src/partitions/partitions.c
@@ -27,7 +27,9 @@
* @short_description: partitions tables detection and parsing
*
* This chain supports binary and NAME=value interfaces, but complete PT
- * description is provided by binary interface only.
+ * description is provided by binary interface only. The libblkid prober is
+ * compatible with kernel partition tables parser. The parser does not return
+ * empty (size=0) partitions or special hidden partitions.
*
* NAME=value interface, supported tags:
*
@@ -424,7 +426,7 @@ static blkid_partition new_partition(blkid_partlist ls, blkid_parttable tab)
ref_parttable(tab);
par->tab = tab;
- par->partno = ls->next_partno++;
+ par->partno = blkid_partlist_increment_partno(ls);
return par;
}
@@ -457,6 +459,11 @@ int blkid_partlist_set_partno(blkid_partlist ls, int partno)
return 0;
}
+int blkid_partlist_increment_partno(blkid_partlist ls)
+{
+ return ls ? ls->next_partno++ : -1;
+}
+
/* allows to set "parent" for the next nested partition */
int blkid_partlist_set_parent(blkid_partlist ls, blkid_partition par)
{
diff --git a/shlibs/blkid/src/partitions/partitions.h b/shlibs/blkid/src/partitions/partitions.h
index 190918f9e..2a4d20af5 100644
--- a/shlibs/blkid/src/partitions/partitions.h
+++ b/shlibs/blkid/src/partitions/partitions.h
@@ -14,6 +14,8 @@ extern blkid_partition blkid_partlist_add_partition(blkid_partlist ls,
blkid_loff_t start, blkid_loff_t size);
extern int blkid_partlist_set_partno(blkid_partlist ls, int partno);
+extern int blkid_partlist_increment_partno(blkid_partlist ls);
+
extern blkid_partition blkid_partlist_get_parent(blkid_partlist ls);
extern int blkid_partitions_do_subprobe(blkid_probe pr,
diff --git a/shlibs/blkid/src/partitions/sgi.c b/shlibs/blkid/src/partitions/sgi.c
index 3a9cd0a76..945ead542 100644
--- a/shlibs/blkid/src/partitions/sgi.c
+++ b/shlibs/blkid/src/partitions/sgi.c
@@ -126,9 +126,10 @@ static int probe_sgi_pt(blkid_probe pr, const struct blkid_idmag *mag)
blkid_partition par;
if (size == 0 || type == SGI_TYPE_VOLULME ||
- type == SGI_TYPE_VOLHDR)
+ type == SGI_TYPE_VOLHDR) {
+ blkid_partlist_increment_partno(ls);
continue;
-
+ }
par = blkid_partlist_add_partition(ls, tab, start, size);
if (!par)
goto err;
diff --git a/shlibs/blkid/src/partitions/sun.c b/shlibs/blkid/src/partitions/sun.c
index d70200c85..dffab24c6 100644
--- a/shlibs/blkid/src/partitions/sun.c
+++ b/shlibs/blkid/src/partitions/sun.c
@@ -148,9 +148,10 @@ static int probe_sun_pt(blkid_probe pr, const struct blkid_idmag *mag)
flags = be16_to_cpu(l->vtoc.infos[i].flags);
}
- if (type == SUN_TAG_WHOLEDISK || !size)
+ if (type == SUN_TAG_WHOLEDISK || !size) {
+ blkid_partlist_increment_partno(ls);
continue;
-
+ }
par = blkid_partlist_add_partition(ls, tab, start, size);
if (!par)
goto err;