return pe->offset + dos_partition_get_start(pe->pt_entry);
}
+/*
+ * Linux kernel cares about partition size only. Things like
+ * partition type or so are completely irrelevant -- kzak Nov-2013
+ */
+static int is_used_partition(struct dos_partition *p)
+{
+ return p && dos_partition_get_size(p) != 0;
+}
+
static int is_cleared_partition(struct dos_partition *p)
{
return !(!p || p->boot_ind || p->bh || p->bs || p->bc ||
for (i = 0; i < 4; i++) {
struct pte *pe = self_pte(cxt, i);
- if (!is_cleared_partition(pe->pt_entry))
+ if (is_used_partition(pe->pt_entry))
cxt->label->nparts_cur++;
if (IS_EXTENDED (pe->pt_entry->sys_ind)) {
for (i = 0; i < cxt->label->nparts_max; pe++,i++) {
p = pe->pt_entry;
- if (!p->sys_ind || IS_EXTENDED (p->sys_ind)) {
+ if (is_cleared_partition(p) || IS_EXTENDED (p->sys_ind)) {
first[i] = 0xffffffff;
last[i] = 0;
} else {
sys = t ? t->type : MBR_LINUX_DATA_PARTITION;
- if (p && p->sys_ind) {
+ if (is_used_partition(p)) {
fdisk_warnx(cxt, _("Partition %zu is already defined. "
"Delete it before re-adding it."),
n + 1);
assert(cxt);
assert(cxt->label);
- if (cxt->label->nparts_max > 5 || p4->sys_ind) {
+ if (cxt->label->nparts_max > 5 || !is_cleared_partition(p4)) {
struct pte *pe = self_pte(cxt, cxt->label->nparts_max);
pe->sectorbuffer = calloc(1, cxt->sector_size);
struct pte *pe = self_pte(cxt, i);
p = self_partition(cxt, i);
- if (p->sys_ind && !IS_EXTENDED(p->sys_ind)) {
+ if (is_used_partition(p) && !IS_EXTENDED(p->sys_ind)) {
check_consistency(cxt, p, i);
fdisk_warn_alignment(cxt, get_abs_partition_start(pe), i);
if (get_abs_partition_start(pe) < first[i])
for (i = 0; i < 4; i++) {
struct dos_partition *p = self_partition(cxt, i);
- free_primary += !p->sys_ind;
+ free_primary += is_used_partition(p);
}
if (!free_primary && cxt->label->nparts_max >= MAXIMUM_PARTS) {
last_i = 4;
last_p_start_pos = 0;
}
- if (p->sys_ind) {
+ if (is_used_partition(p)) {
p_start_pos = get_abs_partition_start(pe);
if (last_p_start_pos > p_start_pos) {
if (asprintf(&str, "%02x", p->sys_ind) > 0)
tt_line_set_data(ln, 10, str); /* Id */
- if (p->sys_ind) {
- check_consistency(cxt, p, i);
- fdisk_warn_alignment(cxt,
- get_abs_partition_start(pe), i);
- }
+ check_consistency(cxt, p, i);
+ fdisk_warn_alignment(cxt, get_abs_partition_start(pe), i);
}
rc = fdisk_print_table(cxt, tb);
struct tt_line *ln;
char *str;
- if (!p || is_cleared_partition(p))
+ if (!is_used_partition(p))
continue;
ln = tt_add_line(tb, NULL);
if (!ln)
pe = self_pte(cxt, i);
p = pe->pt_entry;
- if (!p->sys_ind || !dos_partition_get_size(p) || IS_EXTENDED (p->sys_ind)) {
+ if (!is_used_partition(p) || IS_EXTENDED (p->sys_ind)) {
fdisk_warnx(cxt, _("Partition %zu: no data area."), i + 1);
return 0;
}
end = get_abs_partition_start(prev_pe)
+ dos_partition_get_size(prev_p);
- if (!is_cleared_partition(prev_p) &&
+ if (is_used_partition(prev_p) &&
end > free_start && end <= curr_start)
free_start = end;
}
p = self_partition(cxt, i);
- if (p && !is_cleared_partition(p))
+ if (is_used_partition(p))
*status = FDISK_PARTSTAT_USED;
else
*status = FDISK_PARTSTAT_NONE;