diff options
author | Karel Zak | 2014-12-04 12:24:31 +0100 |
---|---|---|
committer | Karel Zak | 2014-12-04 12:24:31 +0100 |
commit | bbfc24298f5a5811246b7f484479526e3a0b8688 (patch) | |
tree | 70cf92a4cd16a0e875f742c008395d414ab76a16 | |
parent | libfdisk: rename sector_t to fdisk_sector_t (diff) | |
download | kernel-qcow2-util-linux-bbfc24298f5a5811246b7f484479526e3a0b8688.tar.gz kernel-qcow2-util-linux-bbfc24298f5a5811246b7f484479526e3a0b8688.tar.xz kernel-qcow2-util-linux-bbfc24298f5a5811246b7f484479526e3a0b8688.zip |
libfdisk: remove 'end' from struct fdisk_partition
This struct member duplicate "start+size".
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | libfdisk/docs/libfdisk-sections.txt | 2 | ||||
-rw-r--r-- | libfdisk/src/bsd.c | 1 | ||||
-rw-r--r-- | libfdisk/src/dos.c | 1 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 1 | ||||
-rw-r--r-- | libfdisk/src/gpt.c | 1 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 3 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 2 | ||||
-rw-r--r-- | libfdisk/src/partition.c | 49 | ||||
-rw-r--r-- | libfdisk/src/sgi.c | 1 | ||||
-rw-r--r-- | libfdisk/src/sun.c | 1 | ||||
-rw-r--r-- | libfdisk/src/table.c | 38 |
11 files changed, 75 insertions, 25 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index 2dff5c998..c0aaeaef8 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -145,6 +145,7 @@ fdisk_partition_cmp_start fdisk_partition_end_follow_default fdisk_partition_end_is_default fdisk_partition_get_attrs +fdisk_partition_get_end fdisk_partition_get_name fdisk_partition_get_parent fdisk_partition_get_partno @@ -152,6 +153,7 @@ fdisk_partition_get_size fdisk_partition_get_start fdisk_partition_get_type fdisk_partition_get_uuid +fdisk_partition_has_end fdisk_partition_has_partno fdisk_partition_has_size fdisk_partition_has_start diff --git a/libfdisk/src/bsd.c b/libfdisk/src/bsd.c index 0e45f6dca..618a3eef9 100644 --- a/libfdisk/src/bsd.c +++ b/libfdisk/src/bsd.c @@ -499,7 +499,6 @@ static int bsd_get_partition(struct fdisk_context *cxt, size_t n, } pa->start = p->p_offset; - pa->end = p->p_offset + p->p_size - 1; pa->size = p->p_size; pa->type = bsd_partition_parttype(cxt, p); diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c index ef336f632..2a067076e 100644 --- a/libfdisk/src/dos.c +++ b/libfdisk/src/dos.c @@ -1836,7 +1836,6 @@ static int dos_get_partition(struct fdisk_context *cxt, size_t n, pa->type = dos_partition_parttype(cxt, p); pa->boot = p->boot_ind == ACTIVE_FLAG ? 1 : 0; pa->start = get_abs_partition_start(pe); - pa->end = get_abs_partition_end(pe); pa->size = dos_partition_get_size(p); pa->container = lb->ext_offset && n == lb->ext_index; diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index b912e6c6b..b169a9ffb 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -119,7 +119,6 @@ struct fdisk_partition { size_t parent_partno; /* for logical partitions */ fdisk_sector_t start; /* first sectors */ - fdisk_sector_t end; /* last sector */ fdisk_sector_t size; /* size in sectors */ char *name; /* partition name */ diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index fc18441d6..8c1c96c37 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -1474,7 +1474,6 @@ static int gpt_get_partition(struct fdisk_context *cxt, size_t n, return 0; pa->start = gpt_partition_start(e); - pa->end = gpt_partition_end(e); pa->size = gpt_partition_size(e); pa->type = gpt_partition_parttype(cxt, e); diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 0b500b236..f82d5bd97 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -330,6 +330,9 @@ uint64_t fdisk_partition_get_size(struct fdisk_partition *pa); int fdisk_partition_has_size(struct fdisk_partition *pa); int fdisk_partition_size_explicit(struct fdisk_partition *pa, int enable); +int fdisk_partition_has_end(struct fdisk_partition *pa); +fdisk_sector_t fdisk_partition_get_end(struct fdisk_partition *pa); + int fdisk_partition_set_partno(struct fdisk_partition *pa, size_t num); int fdisk_partition_unset_partno(struct fdisk_partition *pa); size_t fdisk_partition_get_partno(struct fdisk_partition *pa); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index ee0b9bcfc..bf85d4e2a 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -130,6 +130,7 @@ global: fdisk_partition_end_follow_default; fdisk_partition_end_is_default; fdisk_partition_get_attrs; + fdisk_partition_get_end; fdisk_partition_get_name; fdisk_partition_get_parent; fdisk_partition_get_partno; @@ -137,6 +138,7 @@ global: fdisk_partition_get_start; fdisk_partition_get_type; fdisk_partition_get_uuid; + fdisk_partition_has_end; fdisk_partition_has_partno; fdisk_partition_has_size; fdisk_partition_has_start; diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c index 1ea0b7aea..8ebdb4682 100644 --- a/libfdisk/src/partition.c +++ b/libfdisk/src/partition.c @@ -21,7 +21,6 @@ static void init_partition(struct fdisk_partition *pa) { FDISK_INIT_UNDEF(pa->size); FDISK_INIT_UNDEF(pa->start); - FDISK_INIT_UNDEF(pa->end); FDISK_INIT_UNDEF(pa->partno); FDISK_INIT_UNDEF(pa->parent_partno); FDISK_INIT_UNDEF(pa->boot); @@ -475,7 +474,33 @@ int fdisk_partition_set_uuid(struct fdisk_partition *pa, const char *uuid) return 0; } +/** + * fdisk_partition_has_end: + * @pa: partition + * + * Returns: 1 if the partition has defined last sector + */ +int fdisk_partition_has_end(struct fdisk_partition *pa) +{ + return pa && !FDISK_IS_UNDEF(pa->start) && !FDISK_IS_UNDEF(pa->size); +} +/** + * fdisk_partition_get_end: + * @pa: partition + * + * This function may returns absolute non-sense, always check + * fdisk_partition_has_end(). + * + * Note that partition end is defined by fdisk_partition_set_start() and + * fdisk_partition_set_size(). + * + * Returns: last partition sector LBA. + */ +fdisk_sector_t fdisk_partition_get_end(struct fdisk_partition *pa) +{ + return pa->start + pa->size - (pa->size == 0 ? 0 : 1); +} /** * fdisk_partition_end_follow_default @@ -663,10 +688,12 @@ int fdisk_partition_to_string(struct fdisk_partition *pa, } break; case FDISK_FIELD_END: - x = fdisk_cround(cxt, pa->end); - rc = pa->end_post ? - asprintf(&p, "%ju%c", x, pa->end_post) : - asprintf(&p, "%ju", x); + if (fdisk_partition_has_end(pa)) { + x = fdisk_cround(cxt, fdisk_partition_get_end(pa)); + rc = pa->end_post ? + asprintf(&p, "%ju%c", x, pa->end_post) : + asprintf(&p, "%ju", x); + } break; case FDISK_FIELD_SIZE: if (fdisk_partition_has_size(pa)) { @@ -808,9 +835,9 @@ int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, DBG(CXT, ul_debugobj(cxt, "setting partition %zu %p (start=%ju, end=%ju, size=%ju, " "defaults(start=%s, end=%s, partno=%s)", partno, pa, - pa->start, - pa->end, - pa->size, + (uintmax_t) fdisk_partition_get_start(pa), + (uintmax_t) fdisk_partition_get_end(pa), + (uintmax_t) fdisk_partition_get_size(pa), pa->start_follow_default ? "yes" : "no", pa->end_follow_default ? "yes" : "no", pa->partno_follow_default ? "yes" : "no")); @@ -851,9 +878,9 @@ int fdisk_add_partition(struct fdisk_context *cxt, DBG(CXT, ul_debugobj(cxt, "adding new partition %p (start=%ju, end=%ju, size=%ju, " "defaults(start=%s, end=%s, partno=%s)", pa, - pa->start, - pa->end, - pa->size, + (uintmax_t) fdisk_partition_get_start(pa), + (uintmax_t) fdisk_partition_get_end(pa), + (uintmax_t) fdisk_partition_get_size(pa), pa->start_follow_default ? "yes" : "no", pa->end_follow_default ? "yes" : "no", pa->partno_follow_default ? "yes" : "no")); diff --git a/libfdisk/src/sgi.c b/libfdisk/src/sgi.c index a646cf390..cd4cedff0 100644 --- a/libfdisk/src/sgi.c +++ b/libfdisk/src/sgi.c @@ -344,7 +344,6 @@ static int sgi_get_partition(struct fdisk_context *cxt, size_t n, struct fdisk_p pa->type = sgi_get_parttype(cxt, n); pa->size = len; pa->start = start; - pa->end = start + len - (len ? 1 : 0); if (pa->type && pa->type->code == SGI_TYPE_ENTIRE_DISK) pa->wholedisk = 1; diff --git a/libfdisk/src/sun.c b/libfdisk/src/sun.c index 6c77a8f61..babff6263 100644 --- a/libfdisk/src/sun.c +++ b/libfdisk/src/sun.c @@ -814,7 +814,6 @@ static int sun_get_partition(struct fdisk_context *cxt, size_t n, } pa->start = start; - pa->end = start + len - (len ? 1 : 0); pa->size = len; return 0; diff --git a/libfdisk/src/table.c b/libfdisk/src/table.c index 221ec46bd..18944e0c4 100644 --- a/libfdisk/src/table.c +++ b/libfdisk/src/table.c @@ -203,7 +203,10 @@ int fdisk_table_add_partition(struct fdisk_table *tb, struct fdisk_partition *pa tb->nents++; DBG(TAB, ul_debugobj(tb, "add entry %p [start=%ju, end=%ju, size=%ju, %s %s %s]", - pa, pa->start, pa->end, pa->size, + pa, + (uintmax_t) fdisk_partition_get_start(pa), + (uintmax_t) fdisk_partition_get_end(pa), + (uintmax_t) fdisk_partition_get_size(pa), fdisk_partition_is_freespace(pa) ? "freespace" : "", fdisk_partition_is_nested(pa) ? "nested" : "", fdisk_partition_is_container(pa) ? "container" : "primary")); @@ -227,7 +230,10 @@ static int table_insert_partition( tb->nents++; DBG(TAB, ul_debugobj(tb, "insert entry %p pre=%p [start=%ju, end=%ju, size=%ju, %s %s %s]", - pa, poz ? poz : NULL, pa->start, pa->end, pa->size, + pa, poz ? poz : NULL, + (uintmax_t) fdisk_partition_get_start(pa), + (uintmax_t) fdisk_partition_get_end(pa), + (uintmax_t) fdisk_partition_get_size(pa), fdisk_partition_is_freespace(pa) ? "freespace" : "", fdisk_partition_is_nested(pa) ? "nested" : "", fdisk_partition_is_container(pa) ? "container" : "")); @@ -351,10 +357,13 @@ static int new_freespace(struct fdisk_context *cxt, if (!*pa) return -ENOMEM; + assert(start); + assert(end); + assert(end > start); + (*pa)->freespace = 1; (*pa)->start = fdisk_align_lba_in_range(cxt, start, start, end); - (*pa)->end = end; - (*pa)->size = (*pa)->end - (*pa)->start + 1ULL; + (*pa)->size = end - (*pa)->start + 1ULL; if (parent) (*pa)->parent_partno = parent->partno; @@ -381,6 +390,9 @@ static int table_add_freespace( if (!pa) return 0; + assert(fdisk_partition_has_start(pa)); + assert(fdisk_partition_has_end(pa)); + DBG(TAB, ul_debugobj(tb, "adding freespace")); fdisk_reset_iter(&itr, FDISK_ITER_FORWARD); @@ -401,7 +413,15 @@ static int table_add_freespace( } while (fdisk_table_next_partition(tb, &itr, &x) == 0) { - if (x->end < pa->start && (!best || best->end < x->end)) + fdisk_sector_t end, best_end; + + if (!fdisk_partition_has_end(x)) + continue; + + end = fdisk_partition_get_end(x); + best_end = fdisk_partition_get_end(best); + + if (end < pa->start && (!best || best_end < end)) best = x; } @@ -449,7 +469,7 @@ static int check_container_freespace(struct fdisk_context *cxt, rc = table_add_freespace(cxt, tb, lastplusoff, pa->start, cont); if (rc) goto done; - last = pa->end; + last = fdisk_partition_get_end(pa); } /* free-space remaining in extended partition */ @@ -513,7 +533,9 @@ int fdisk_get_freespaces(struct fdisk_context *cxt, struct fdisk_table **tb) || !fdisk_partition_has_start(pa)) continue; DBG(CXT, ul_debugobj(cxt, "freespace analyze: partno=%zu, start=%ju, end=%ju", - pa->partno, pa->start, pa->end)); + pa->partno, + (uintmax_t) fdisk_partition_get_start(pa), + (uintmax_t) fdisk_partition_get_end(pa))); if (last + grain <= pa->start) { rc = table_add_freespace(cxt, *tb, last + (last > cxt->first_lba ? 1 : 0), @@ -522,7 +544,7 @@ int fdisk_get_freespaces(struct fdisk_context *cxt, struct fdisk_table **tb) /* add gaps between logical partitions */ if (fdisk_partition_is_container(pa)) rc = check_container_freespace(cxt, parts, *tb, pa); - last = pa->end; + last = fdisk_partition_get_end(pa); } /* add free-space behind last partition to the end of the table (so |