summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2014-12-04 12:24:31 +0100
committerKarel Zak2014-12-04 12:24:31 +0100
commitbbfc24298f5a5811246b7f484479526e3a0b8688 (patch)
tree70cf92a4cd16a0e875f742c008395d414ab76a16
parentlibfdisk: rename sector_t to fdisk_sector_t (diff)
downloadkernel-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.txt2
-rw-r--r--libfdisk/src/bsd.c1
-rw-r--r--libfdisk/src/dos.c1
-rw-r--r--libfdisk/src/fdiskP.h1
-rw-r--r--libfdisk/src/gpt.c1
-rw-r--r--libfdisk/src/libfdisk.h.in3
-rw-r--r--libfdisk/src/libfdisk.sym2
-rw-r--r--libfdisk/src/partition.c49
-rw-r--r--libfdisk/src/sgi.c1
-rw-r--r--libfdisk/src/sun.c1
-rw-r--r--libfdisk/src/table.c38
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