diff options
author | Karel Zak | 2010-04-07 09:39:05 +0200 |
---|---|---|
committer | Karel Zak | 2010-04-07 09:39:05 +0200 |
commit | 9f4664ee40618b3d393161d82d000f2bca4ec45a (patch) | |
tree | 0418c5210dc380b163a82a09d17f5a7e1e345eea | |
parent | libblkid: fix blkid_partlist_devno_to_partition() for extended partitions (diff) | |
download | kernel-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>
-rw-r--r-- | shlibs/blkid/src/partitions/dos.c | 7 | ||||
-rw-r--r-- | shlibs/blkid/src/partitions/gpt.c | 6 | ||||
-rw-r--r-- | shlibs/blkid/src/partitions/partitions.c | 11 | ||||
-rw-r--r-- | shlibs/blkid/src/partitions/partitions.h | 2 | ||||
-rw-r--r-- | shlibs/blkid/src/partitions/sgi.c | 5 | ||||
-rw-r--r-- | shlibs/blkid/src/partitions/sun.c | 5 |
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; |