* [PATCH 04/10] fdisk: API: add delete partition to label operations
@ 2012-07-22 17:05 Davidlohr Bueso
2012-07-24 10:26 ` Petr Uzel
2012-07-24 11:37 ` Karel Zak
0 siblings, 2 replies; 3+ messages in thread
From: Davidlohr Bueso @ 2012-07-22 17:05 UTC (permalink / raw)
To: Karel Zak, Petr Uzel; +Cc: util-linux
From: Davidlohr Bueso <dave@gnu.org>
Signed-off-by: Davidlohr Bueso <dave@gnu.org>
---
fdisks/fdisk.c | 21 ++-------
fdisks/fdisk.h | 3 +
fdisks/fdiskaixlabel.c | 1 +
fdisks/fdiskbsdlabel.c | 25 +++++------
fdisks/fdiskdoslabel.c | 113 ++++++++++++++++++++++++------------------------
fdisks/fdiskdoslabel.h | 1 -
fdisks/fdiskmaclabel.c | 1 +
fdisks/fdisksgilabel.c | 6 +-
fdisks/fdisksgilabel.h | 1 -
fdisks/fdisksunlabel.c | 9 ++--
fdisks/fdisksunlabel.h | 1 -
fdisks/utils.c | 15 ++++++
12 files changed, 101 insertions(+), 96 deletions(-)
diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c
index 46322bc..27002f6 100644
--- a/fdisks/fdisk.c
+++ b/fdisks/fdisk.c
@@ -856,25 +856,14 @@ toggle_dos_compatibility_flag(struct fdisk_context *cxt) {
update_sector_offset(cxt);
}
-static void
-delete_partition(struct fdisk_context *cxt, int i)
+static void delete_partition(struct fdisk_context *cxt, int partnum)
{
- if (i < 0)
+ if (partnum < 0 || warn_geometry(cxt))
return;
- if (warn_geometry(cxt))
- return; /* C/H/S not set */
-
- ptes[i].changed = 1;
-
- if (disklabel == DOS_LABEL)
- dos_delete_partition(i);
- else if (disklabel == SUN_LABEL)
- sun_delete_partition(cxt, i);
- else if (disklabel == SGI_LABEL)
- sgi_delete_partition(cxt, i);
-
- printf(_("Partition %d is deleted\n"), i + 1);
+ ptes[partnum].changed = 1;
+ fdisk_label_partition_delete(cxt, partnum);
+ printf(_("Partition %d is deleted\n"), partnum + 1);
}
static void change_sysid(struct fdisk_context *cxt)
diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h
index d7e85f5..816e127 100644
--- a/fdisks/fdisk.h
+++ b/fdisks/fdisk.h
@@ -145,6 +145,8 @@ struct fdisk_label {
/* probe disk label */
int (*probe)(struct fdisk_context *cxt);
+ /* delete partition */
+ void (*part_delete)(struct fdisk_context *cxt, int partnum);
};
/*
@@ -166,6 +168,7 @@ extern void fdisk_geom_set_cyls(struct fdisk_context *cxt);
extern const char *fdisk_error_name(enum fdisk_error errcode);
extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode);
extern int fdisk_label_change(struct fdisk_context *cxt, const char *name);
+extern int fdisk_label_partition_delete(struct fdisk_context *cxt, int partnum);
/* prototypes for fdisk.c */
extern char *disk_device, *line_ptr;
diff --git a/fdisks/fdiskaixlabel.c b/fdisks/fdiskaixlabel.c
index f590e3a..45f3aa9 100644
--- a/fdisks/fdiskaixlabel.c
+++ b/fdisks/fdiskaixlabel.c
@@ -69,4 +69,5 @@ const struct fdisk_label aix_label =
{
.name = "aix",
.probe = aix_probe_label,
+ .part_delete = NULL,
};
diff --git a/fdisks/fdiskbsdlabel.c b/fdisks/fdiskbsdlabel.c
index fe91fe8..c7f3f86 100644
--- a/fdisks/fdiskbsdlabel.c
+++ b/fdisks/fdiskbsdlabel.c
@@ -61,7 +61,7 @@
#define DKTYPENAMES
#include "fdiskbsdlabel.h"
-static void xbsd_delete_part (void);
+static void xbsd_delete_part (struct fdisk_context *cxt, int partnum);
static void xbsd_new_part (struct fdisk_context *cxt);
static void xbsd_write_disklabel (struct fdisk_context *cxt);
static int xbsd_create_disklabel (struct fdisk_context *cxt);
@@ -184,8 +184,8 @@ bsd_command_prompt (struct fdisk_context *cxt)
putchar ('\n');
switch (tolower (read_char (_("BSD disklabel command (m for help): ")))) {
case 'd':
- xbsd_delete_part ();
- break;
+ xbsd_delete_part(cxt, xbsd_get_part_index(xbsd_dlabel.d_npartitions));
+ break;
case 'e':
xbsd_edit_disklabel ();
break;
@@ -230,18 +230,14 @@ bsd_command_prompt (struct fdisk_context *cxt)
}
}
-static void
-xbsd_delete_part (void)
+static void xbsd_delete_part(struct fdisk_context *cxt, int partnum)
{
- int i;
-
- i = xbsd_get_part_index (xbsd_dlabel.d_npartitions);
- xbsd_dlabel.d_partitions[i].p_size = 0;
- xbsd_dlabel.d_partitions[i].p_offset = 0;
- xbsd_dlabel.d_partitions[i].p_fstype = BSD_FS_UNUSED;
- if (xbsd_dlabel.d_npartitions == i + 1)
- while (xbsd_dlabel.d_partitions[xbsd_dlabel.d_npartitions-1].p_size == 0)
- xbsd_dlabel.d_npartitions--;
+ xbsd_dlabel.d_partitions[partnum].p_size = 0;
+ xbsd_dlabel.d_partitions[partnum].p_offset = 0;
+ xbsd_dlabel.d_partitions[partnum].p_fstype = BSD_FS_UNUSED;
+ if (xbsd_dlabel.d_npartitions == partnum + 1)
+ while (!xbsd_dlabel.d_partitions[xbsd_dlabel.d_npartitions-1].p_size)
+ xbsd_dlabel.d_npartitions--;
}
static void
@@ -850,4 +846,5 @@ const struct fdisk_label bsd_label =
{
.name = "bsd",
.probe = osf_probe_label,
+ .part_delete = xbsd_delete_part,
};
diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c
index 9b9b23a..e32088e 100644
--- a/fdisks/fdiskdoslabel.c
+++ b/fdisks/fdiskdoslabel.c
@@ -120,6 +120,61 @@ void dos_init(struct fdisk_context *cxt)
warn_alignment(cxt);
}
+static void dos_delete_partition(struct fdisk_context *cxt, int partnum)
+{
+ struct pte *pe = &ptes[partnum];
+ struct partition *p = pe->part_table;
+ struct partition *q = pe->ext_pointer;
+
+ /* Note that for the fifth partition (partnum == 4) we don't actually
+ decrement partitions. */
+
+ if (partnum < 4) {
+ if (IS_EXTENDED (p->sys_ind) && partnum == ext_index) {
+ partitions = 4;
+ ptes[ext_index].ext_pointer = NULL;
+ extended_offset = 0;
+ }
+ clear_partition(p);
+ } else if (!q->sys_ind && partnum > 4) {
+ /* the last one in the chain - just delete */
+ --partitions;
+ --partnum;
+ clear_partition(ptes[partnum].ext_pointer);
+ ptes[partnum].changed = 1;
+ } else {
+ /* not the last one - further ones will be moved down */
+ if (partnum > 4) {
+ /* delete this link in the chain */
+ p = ptes[partnum-1].ext_pointer;
+ *p = *q;
+ set_start_sect(p, get_start_sect(q));
+ set_nr_sects(p, get_nr_sects(q));
+ ptes[partnum-1].changed = 1;
+ } else if (partitions > 5) { /* 5 will be moved to 4 */
+ /* the first logical in a longer chain */
+ struct pte *pe = &ptes[5];
+
+ if (pe->part_table) /* prevent SEGFAULT */
+ set_start_sect(pe->part_table,
+ get_partition_start(pe) -
+ extended_offset);
+ pe->offset = extended_offset;
+ pe->changed = 1;
+ }
+
+ if (partitions > 5) {
+ partitions--;
+ while (partnum < partitions) {
+ ptes[partnum] = ptes[partnum+1];
+ partnum++;
+ }
+ } else
+ /* the only logical: clear only */
+ clear_partition(ptes[partnum].part_table);
+ }
+}
+
static void read_extended(struct fdisk_context *cxt, int ext)
{
int i;
@@ -208,7 +263,7 @@ static void read_extended(struct fdisk_context *cxt, int ext)
if (!get_nr_sects(pe->part_table) &&
(partitions > 5 || ptes[4].part_table->sys_ind)) {
printf(_("omitting empty partition (%d)\n"), i+1);
- dos_delete_partition(i);
+ dos_delete_partition(cxt, i);
goto remove; /* numbering changed */
}
}
@@ -262,61 +317,6 @@ void dos_set_mbr_id(struct fdisk_context *cxt)
dos_print_mbr_id(cxt);
}
-void dos_delete_partition(int i)
-{
- struct pte *pe = &ptes[i];
- struct partition *p = pe->part_table;
- struct partition *q = pe->ext_pointer;
-
- /* Note that for the fifth partition (i == 4) we don't actually
- decrement partitions. */
-
- if (i < 4) {
- if (IS_EXTENDED (p->sys_ind) && i == ext_index) {
- partitions = 4;
- ptes[ext_index].ext_pointer = NULL;
- extended_offset = 0;
- }
- clear_partition(p);
- } else if (!q->sys_ind && i > 4) {
- /* the last one in the chain - just delete */
- --partitions;
- --i;
- clear_partition(ptes[i].ext_pointer);
- ptes[i].changed = 1;
- } else {
- /* not the last one - further ones will be moved down */
- if (i > 4) {
- /* delete this link in the chain */
- p = ptes[i-1].ext_pointer;
- *p = *q;
- set_start_sect(p, get_start_sect(q));
- set_nr_sects(p, get_nr_sects(q));
- ptes[i-1].changed = 1;
- } else if (partitions > 5) { /* 5 will be moved to 4 */
- /* the first logical in a longer chain */
- struct pte *pe = &ptes[5];
-
- if (pe->part_table) /* prevent SEGFAULT */
- set_start_sect(pe->part_table,
- get_partition_start(pe) -
- extended_offset);
- pe->offset = extended_offset;
- pe->changed = 1;
- }
-
- if (partitions > 5) {
- partitions--;
- while (i < partitions) {
- ptes[i] = ptes[i+1];
- i++;
- }
- } else
- /* the only logical: clear only */
- clear_partition(ptes[i].part_table);
- }
-}
-
static int dos_probe_label(struct fdisk_context *cxt)
{
int i;
@@ -686,4 +686,5 @@ const struct fdisk_label dos_label =
{
.name = "dos",
.probe = dos_probe_label,
+ .part_delete = dos_delete_partition,
};
diff --git a/fdisks/fdiskdoslabel.h b/fdisks/fdiskdoslabel.h
index 608e3f7..4aa16e5 100644
--- a/fdisks/fdiskdoslabel.h
+++ b/fdisks/fdiskdoslabel.h
@@ -46,7 +46,6 @@ static inline sector_t get_partition_start(struct pte *pe)
extern void create_doslabel(struct fdisk_context *cxt);
extern void dos_print_mbr_id(struct fdisk_context *cxt);
extern void dos_set_mbr_id(struct fdisk_context *cxt);
-extern void dos_delete_partition(int i);
extern int is_dos_partition(int t);
extern void dos_init(struct fdisk_context *cxt);
extern void dos_add_partition(struct fdisk_context *cxt, int n, int sys);
diff --git a/fdisks/fdiskmaclabel.c b/fdisks/fdiskmaclabel.c
index 98cff26..198a2d0 100644
--- a/fdisks/fdiskmaclabel.c
+++ b/fdisks/fdiskmaclabel.c
@@ -84,4 +84,5 @@ const struct fdisk_label mac_label =
{
.name = "mac",
.probe = mac_probe_label,
+ .part_delete = NULL,
};
diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c
index 6001038..51b0e1f 100644
--- a/fdisks/fdisksgilabel.c
+++ b/fdisks/fdisksgilabel.c
@@ -637,10 +637,9 @@ sgi_set_volhdr(struct fdisk_context *cxt)
}
}
-void
-sgi_delete_partition(struct fdisk_context *cxt, int i)
+static void sgi_delete_partition(struct fdisk_context *cxt, int partnum)
{
- sgi_set_partition(cxt, i, 0, 0, 0);
+ sgi_set_partition(cxt, partnum, 0, 0, 0);
}
void
@@ -883,4 +882,5 @@ const struct fdisk_label sgi_label =
{
.name = "sgi",
.probe = sgi_probe_label,
+ .part_delete = sgi_delete_partition,
};
diff --git a/fdisks/fdisksgilabel.h b/fdisks/fdisksgilabel.h
index f6b88e8..98cf093 100644
--- a/fdisks/fdisksgilabel.h
+++ b/fdisks/fdisksgilabel.h
@@ -116,7 +116,6 @@ extern int sgi_change_sysid(struct fdisk_context *cxt, int i, int sys);
extern unsigned int sgi_get_start_sector(struct fdisk_context *cxt, int i );
extern unsigned int sgi_get_num_sectors(struct fdisk_context *cxt, int i );
extern int sgi_get_sysid(struct fdisk_context *cxt, int i );
-extern void sgi_delete_partition( struct fdisk_context *cxt, int i );
extern void sgi_add_partition( struct fdisk_context *cxt, int n, int sys );
extern void create_sgilabel( struct fdisk_context *cxt );
extern void create_sgiinfo(struct fdisk_context *cxt);
diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c
index b63335c..c74ffbb 100644
--- a/fdisks/fdisksunlabel.c
+++ b/fdisks/fdisksunlabel.c
@@ -482,13 +482,13 @@ and is of type `Whole disk'\n"));
set_sun_partition(cxt, n, first, last, sys);
}
-void sun_delete_partition(struct fdisk_context *cxt, int i)
+static void sun_delete_partition(struct fdisk_context *cxt, int partnum)
{
- struct sun_partition *part = &sunlabel->partitions[i];
- struct sun_tag_flag *tag = &sunlabel->part_tags[i];
+ struct sun_partition *part = &sunlabel->partitions[partnum];
+ struct sun_tag_flag *tag = &sunlabel->part_tags[partnum];
unsigned int nsec;
- if (i == 2 &&
+ if (partnum == 2 &&
tag->tag == SSWAP16(SUN_TAG_BACKUP) &&
!part->start_cylinder &&
(nsec = SSWAP32(part->num_sectors))
@@ -648,4 +648,5 @@ const struct fdisk_label sun_label =
{
.name = "sun",
.probe = sun_probe_label,
+ .part_delete = sun_delete_partition,
};
diff --git a/fdisks/fdisksunlabel.h b/fdisks/fdisksunlabel.h
index 9779e22..47aa30a 100644
--- a/fdisks/fdisksunlabel.h
+++ b/fdisks/fdisksunlabel.h
@@ -78,7 +78,6 @@ struct sun_disk_label {
/* fdisksunlabel.c */
extern struct systypes sun_sys_types[];
extern void create_sunlabel(struct fdisk_context *cxt);
-extern void sun_delete_partition(struct fdisk_context *cxt, int i);
extern int sun_change_sysid(struct fdisk_context *cxt, int i, uint16_t sys);
extern void sun_list_table(struct fdisk_context *cxt, int xtra);
extern void verify_sun(struct fdisk_context *cxt);
diff --git a/fdisks/utils.c b/fdisks/utils.c
index 48dedfb..c8b8f7e 100644
--- a/fdisks/utils.c
+++ b/fdisks/utils.c
@@ -81,6 +81,21 @@ done:
return 0;
}
+/**
+ * fdisk_label_partition_delete:
+ * @cxt: fdisk context
+ * @partnum: partition number to delete
+ *
+ * Deletes a @partnum partition.
+ *
+ * Returns 0 on success, otherwise, a corresponding error.
+ */
+int fdisk_label_partition_delete(struct fdisk_context *cxt, int partnum)
+{
+ cxt->label->part_delete(cxt, partnum);
+ return 0;
+}
+
static int __probe_labels(struct fdisk_context *cxt)
{
int i, rc = 0;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 04/10] fdisk: API: add delete partition to label operations
2012-07-22 17:05 [PATCH 04/10] fdisk: API: add delete partition to label operations Davidlohr Bueso
@ 2012-07-24 10:26 ` Petr Uzel
2012-07-24 11:37 ` Karel Zak
1 sibling, 0 replies; 3+ messages in thread
From: Petr Uzel @ 2012-07-24 10:26 UTC (permalink / raw)
To: util-linux; +Cc: Davidlohr Bueso
[-- Attachment #1: Type: text/plain, Size: 14500 bytes --]
On Sun, Jul 22, 2012 at 07:05:07PM +0200, Davidlohr Bueso wrote:
> From: Davidlohr Bueso <dave@gnu.org>
>
> Signed-off-by: Davidlohr Bueso <dave@gnu.org>
> ---
> fdisks/fdisk.c | 21 ++-------
> fdisks/fdisk.h | 3 +
> fdisks/fdiskaixlabel.c | 1 +
> fdisks/fdiskbsdlabel.c | 25 +++++------
> fdisks/fdiskdoslabel.c | 113 ++++++++++++++++++++++++------------------------
> fdisks/fdiskdoslabel.h | 1 -
> fdisks/fdiskmaclabel.c | 1 +
> fdisks/fdisksgilabel.c | 6 +-
> fdisks/fdisksgilabel.h | 1 -
> fdisks/fdisksunlabel.c | 9 ++--
> fdisks/fdisksunlabel.h | 1 -
> fdisks/utils.c | 15 ++++++
> 12 files changed, 101 insertions(+), 96 deletions(-)
Reviewed-by: Petr Uzel <petr.uzel@suse.cz>
>
> diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c
> index 46322bc..27002f6 100644
> --- a/fdisks/fdisk.c
> +++ b/fdisks/fdisk.c
> @@ -856,25 +856,14 @@ toggle_dos_compatibility_flag(struct fdisk_context *cxt) {
> update_sector_offset(cxt);
> }
>
> -static void
> -delete_partition(struct fdisk_context *cxt, int i)
> +static void delete_partition(struct fdisk_context *cxt, int partnum)
> {
> - if (i < 0)
> + if (partnum < 0 || warn_geometry(cxt))
> return;
>
> - if (warn_geometry(cxt))
> - return; /* C/H/S not set */
> -
> - ptes[i].changed = 1;
> -
> - if (disklabel == DOS_LABEL)
> - dos_delete_partition(i);
> - else if (disklabel == SUN_LABEL)
> - sun_delete_partition(cxt, i);
> - else if (disklabel == SGI_LABEL)
> - sgi_delete_partition(cxt, i);
> -
> - printf(_("Partition %d is deleted\n"), i + 1);
> + ptes[partnum].changed = 1;
> + fdisk_label_partition_delete(cxt, partnum);
> + printf(_("Partition %d is deleted\n"), partnum + 1);
> }
>
> static void change_sysid(struct fdisk_context *cxt)
> diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h
> index d7e85f5..816e127 100644
> --- a/fdisks/fdisk.h
> +++ b/fdisks/fdisk.h
> @@ -145,6 +145,8 @@ struct fdisk_label {
>
> /* probe disk label */
> int (*probe)(struct fdisk_context *cxt);
> + /* delete partition */
> + void (*part_delete)(struct fdisk_context *cxt, int partnum);
> };
>
> /*
> @@ -166,6 +168,7 @@ extern void fdisk_geom_set_cyls(struct fdisk_context *cxt);
> extern const char *fdisk_error_name(enum fdisk_error errcode);
> extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode);
> extern int fdisk_label_change(struct fdisk_context *cxt, const char *name);
> +extern int fdisk_label_partition_delete(struct fdisk_context *cxt, int partnum);
>
> /* prototypes for fdisk.c */
> extern char *disk_device, *line_ptr;
> diff --git a/fdisks/fdiskaixlabel.c b/fdisks/fdiskaixlabel.c
> index f590e3a..45f3aa9 100644
> --- a/fdisks/fdiskaixlabel.c
> +++ b/fdisks/fdiskaixlabel.c
> @@ -69,4 +69,5 @@ const struct fdisk_label aix_label =
> {
> .name = "aix",
> .probe = aix_probe_label,
> + .part_delete = NULL,
> };
> diff --git a/fdisks/fdiskbsdlabel.c b/fdisks/fdiskbsdlabel.c
> index fe91fe8..c7f3f86 100644
> --- a/fdisks/fdiskbsdlabel.c
> +++ b/fdisks/fdiskbsdlabel.c
> @@ -61,7 +61,7 @@
> #define DKTYPENAMES
> #include "fdiskbsdlabel.h"
>
> -static void xbsd_delete_part (void);
> +static void xbsd_delete_part (struct fdisk_context *cxt, int partnum);
> static void xbsd_new_part (struct fdisk_context *cxt);
> static void xbsd_write_disklabel (struct fdisk_context *cxt);
> static int xbsd_create_disklabel (struct fdisk_context *cxt);
> @@ -184,8 +184,8 @@ bsd_command_prompt (struct fdisk_context *cxt)
> putchar ('\n');
> switch (tolower (read_char (_("BSD disklabel command (m for help): ")))) {
> case 'd':
> - xbsd_delete_part ();
> - break;
> + xbsd_delete_part(cxt, xbsd_get_part_index(xbsd_dlabel.d_npartitions));
> + break;
> case 'e':
> xbsd_edit_disklabel ();
> break;
> @@ -230,18 +230,14 @@ bsd_command_prompt (struct fdisk_context *cxt)
> }
> }
>
> -static void
> -xbsd_delete_part (void)
> +static void xbsd_delete_part(struct fdisk_context *cxt, int partnum)
> {
> - int i;
> -
> - i = xbsd_get_part_index (xbsd_dlabel.d_npartitions);
> - xbsd_dlabel.d_partitions[i].p_size = 0;
> - xbsd_dlabel.d_partitions[i].p_offset = 0;
> - xbsd_dlabel.d_partitions[i].p_fstype = BSD_FS_UNUSED;
> - if (xbsd_dlabel.d_npartitions == i + 1)
> - while (xbsd_dlabel.d_partitions[xbsd_dlabel.d_npartitions-1].p_size == 0)
> - xbsd_dlabel.d_npartitions--;
> + xbsd_dlabel.d_partitions[partnum].p_size = 0;
> + xbsd_dlabel.d_partitions[partnum].p_offset = 0;
> + xbsd_dlabel.d_partitions[partnum].p_fstype = BSD_FS_UNUSED;
> + if (xbsd_dlabel.d_npartitions == partnum + 1)
> + while (!xbsd_dlabel.d_partitions[xbsd_dlabel.d_npartitions-1].p_size)
> + xbsd_dlabel.d_npartitions--;
> }
>
> static void
> @@ -850,4 +846,5 @@ const struct fdisk_label bsd_label =
> {
> .name = "bsd",
> .probe = osf_probe_label,
> + .part_delete = xbsd_delete_part,
> };
> diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c
> index 9b9b23a..e32088e 100644
> --- a/fdisks/fdiskdoslabel.c
> +++ b/fdisks/fdiskdoslabel.c
> @@ -120,6 +120,61 @@ void dos_init(struct fdisk_context *cxt)
> warn_alignment(cxt);
> }
>
> +static void dos_delete_partition(struct fdisk_context *cxt, int partnum)
> +{
> + struct pte *pe = &ptes[partnum];
> + struct partition *p = pe->part_table;
> + struct partition *q = pe->ext_pointer;
> +
> + /* Note that for the fifth partition (partnum == 4) we don't actually
> + decrement partitions. */
> +
> + if (partnum < 4) {
> + if (IS_EXTENDED (p->sys_ind) && partnum == ext_index) {
> + partitions = 4;
> + ptes[ext_index].ext_pointer = NULL;
> + extended_offset = 0;
> + }
> + clear_partition(p);
> + } else if (!q->sys_ind && partnum > 4) {
> + /* the last one in the chain - just delete */
> + --partitions;
> + --partnum;
> + clear_partition(ptes[partnum].ext_pointer);
> + ptes[partnum].changed = 1;
> + } else {
> + /* not the last one - further ones will be moved down */
> + if (partnum > 4) {
> + /* delete this link in the chain */
> + p = ptes[partnum-1].ext_pointer;
> + *p = *q;
> + set_start_sect(p, get_start_sect(q));
> + set_nr_sects(p, get_nr_sects(q));
> + ptes[partnum-1].changed = 1;
> + } else if (partitions > 5) { /* 5 will be moved to 4 */
> + /* the first logical in a longer chain */
> + struct pte *pe = &ptes[5];
> +
> + if (pe->part_table) /* prevent SEGFAULT */
> + set_start_sect(pe->part_table,
> + get_partition_start(pe) -
> + extended_offset);
> + pe->offset = extended_offset;
> + pe->changed = 1;
> + }
> +
> + if (partitions > 5) {
> + partitions--;
> + while (partnum < partitions) {
> + ptes[partnum] = ptes[partnum+1];
> + partnum++;
> + }
> + } else
> + /* the only logical: clear only */
> + clear_partition(ptes[partnum].part_table);
> + }
> +}
> +
> static void read_extended(struct fdisk_context *cxt, int ext)
> {
> int i;
> @@ -208,7 +263,7 @@ static void read_extended(struct fdisk_context *cxt, int ext)
> if (!get_nr_sects(pe->part_table) &&
> (partitions > 5 || ptes[4].part_table->sys_ind)) {
> printf(_("omitting empty partition (%d)\n"), i+1);
> - dos_delete_partition(i);
> + dos_delete_partition(cxt, i);
> goto remove; /* numbering changed */
> }
> }
> @@ -262,61 +317,6 @@ void dos_set_mbr_id(struct fdisk_context *cxt)
> dos_print_mbr_id(cxt);
> }
>
> -void dos_delete_partition(int i)
> -{
> - struct pte *pe = &ptes[i];
> - struct partition *p = pe->part_table;
> - struct partition *q = pe->ext_pointer;
> -
> - /* Note that for the fifth partition (i == 4) we don't actually
> - decrement partitions. */
> -
> - if (i < 4) {
> - if (IS_EXTENDED (p->sys_ind) && i == ext_index) {
> - partitions = 4;
> - ptes[ext_index].ext_pointer = NULL;
> - extended_offset = 0;
> - }
> - clear_partition(p);
> - } else if (!q->sys_ind && i > 4) {
> - /* the last one in the chain - just delete */
> - --partitions;
> - --i;
> - clear_partition(ptes[i].ext_pointer);
> - ptes[i].changed = 1;
> - } else {
> - /* not the last one - further ones will be moved down */
> - if (i > 4) {
> - /* delete this link in the chain */
> - p = ptes[i-1].ext_pointer;
> - *p = *q;
> - set_start_sect(p, get_start_sect(q));
> - set_nr_sects(p, get_nr_sects(q));
> - ptes[i-1].changed = 1;
> - } else if (partitions > 5) { /* 5 will be moved to 4 */
> - /* the first logical in a longer chain */
> - struct pte *pe = &ptes[5];
> -
> - if (pe->part_table) /* prevent SEGFAULT */
> - set_start_sect(pe->part_table,
> - get_partition_start(pe) -
> - extended_offset);
> - pe->offset = extended_offset;
> - pe->changed = 1;
> - }
> -
> - if (partitions > 5) {
> - partitions--;
> - while (i < partitions) {
> - ptes[i] = ptes[i+1];
> - i++;
> - }
> - } else
> - /* the only logical: clear only */
> - clear_partition(ptes[i].part_table);
> - }
> -}
> -
> static int dos_probe_label(struct fdisk_context *cxt)
> {
> int i;
> @@ -686,4 +686,5 @@ const struct fdisk_label dos_label =
> {
> .name = "dos",
> .probe = dos_probe_label,
> + .part_delete = dos_delete_partition,
> };
> diff --git a/fdisks/fdiskdoslabel.h b/fdisks/fdiskdoslabel.h
> index 608e3f7..4aa16e5 100644
> --- a/fdisks/fdiskdoslabel.h
> +++ b/fdisks/fdiskdoslabel.h
> @@ -46,7 +46,6 @@ static inline sector_t get_partition_start(struct pte *pe)
> extern void create_doslabel(struct fdisk_context *cxt);
> extern void dos_print_mbr_id(struct fdisk_context *cxt);
> extern void dos_set_mbr_id(struct fdisk_context *cxt);
> -extern void dos_delete_partition(int i);
> extern int is_dos_partition(int t);
> extern void dos_init(struct fdisk_context *cxt);
> extern void dos_add_partition(struct fdisk_context *cxt, int n, int sys);
> diff --git a/fdisks/fdiskmaclabel.c b/fdisks/fdiskmaclabel.c
> index 98cff26..198a2d0 100644
> --- a/fdisks/fdiskmaclabel.c
> +++ b/fdisks/fdiskmaclabel.c
> @@ -84,4 +84,5 @@ const struct fdisk_label mac_label =
> {
> .name = "mac",
> .probe = mac_probe_label,
> + .part_delete = NULL,
> };
> diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c
> index 6001038..51b0e1f 100644
> --- a/fdisks/fdisksgilabel.c
> +++ b/fdisks/fdisksgilabel.c
> @@ -637,10 +637,9 @@ sgi_set_volhdr(struct fdisk_context *cxt)
> }
> }
>
> -void
> -sgi_delete_partition(struct fdisk_context *cxt, int i)
> +static void sgi_delete_partition(struct fdisk_context *cxt, int partnum)
> {
> - sgi_set_partition(cxt, i, 0, 0, 0);
> + sgi_set_partition(cxt, partnum, 0, 0, 0);
> }
>
> void
> @@ -883,4 +882,5 @@ const struct fdisk_label sgi_label =
> {
> .name = "sgi",
> .probe = sgi_probe_label,
> + .part_delete = sgi_delete_partition,
> };
> diff --git a/fdisks/fdisksgilabel.h b/fdisks/fdisksgilabel.h
> index f6b88e8..98cf093 100644
> --- a/fdisks/fdisksgilabel.h
> +++ b/fdisks/fdisksgilabel.h
> @@ -116,7 +116,6 @@ extern int sgi_change_sysid(struct fdisk_context *cxt, int i, int sys);
> extern unsigned int sgi_get_start_sector(struct fdisk_context *cxt, int i );
> extern unsigned int sgi_get_num_sectors(struct fdisk_context *cxt, int i );
> extern int sgi_get_sysid(struct fdisk_context *cxt, int i );
> -extern void sgi_delete_partition( struct fdisk_context *cxt, int i );
> extern void sgi_add_partition( struct fdisk_context *cxt, int n, int sys );
> extern void create_sgilabel( struct fdisk_context *cxt );
> extern void create_sgiinfo(struct fdisk_context *cxt);
> diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c
> index b63335c..c74ffbb 100644
> --- a/fdisks/fdisksunlabel.c
> +++ b/fdisks/fdisksunlabel.c
> @@ -482,13 +482,13 @@ and is of type `Whole disk'\n"));
> set_sun_partition(cxt, n, first, last, sys);
> }
>
> -void sun_delete_partition(struct fdisk_context *cxt, int i)
> +static void sun_delete_partition(struct fdisk_context *cxt, int partnum)
> {
> - struct sun_partition *part = &sunlabel->partitions[i];
> - struct sun_tag_flag *tag = &sunlabel->part_tags[i];
> + struct sun_partition *part = &sunlabel->partitions[partnum];
> + struct sun_tag_flag *tag = &sunlabel->part_tags[partnum];
> unsigned int nsec;
>
> - if (i == 2 &&
> + if (partnum == 2 &&
> tag->tag == SSWAP16(SUN_TAG_BACKUP) &&
> !part->start_cylinder &&
> (nsec = SSWAP32(part->num_sectors))
> @@ -648,4 +648,5 @@ const struct fdisk_label sun_label =
> {
> .name = "sun",
> .probe = sun_probe_label,
> + .part_delete = sun_delete_partition,
> };
> diff --git a/fdisks/fdisksunlabel.h b/fdisks/fdisksunlabel.h
> index 9779e22..47aa30a 100644
> --- a/fdisks/fdisksunlabel.h
> +++ b/fdisks/fdisksunlabel.h
> @@ -78,7 +78,6 @@ struct sun_disk_label {
> /* fdisksunlabel.c */
> extern struct systypes sun_sys_types[];
> extern void create_sunlabel(struct fdisk_context *cxt);
> -extern void sun_delete_partition(struct fdisk_context *cxt, int i);
> extern int sun_change_sysid(struct fdisk_context *cxt, int i, uint16_t sys);
> extern void sun_list_table(struct fdisk_context *cxt, int xtra);
> extern void verify_sun(struct fdisk_context *cxt);
> diff --git a/fdisks/utils.c b/fdisks/utils.c
> index 48dedfb..c8b8f7e 100644
> --- a/fdisks/utils.c
> +++ b/fdisks/utils.c
> @@ -81,6 +81,21 @@ done:
> return 0;
> }
>
> +/**
> + * fdisk_label_partition_delete:
> + * @cxt: fdisk context
> + * @partnum: partition number to delete
> + *
> + * Deletes a @partnum partition.
> + *
> + * Returns 0 on success, otherwise, a corresponding error.
> + */
> +int fdisk_label_partition_delete(struct fdisk_context *cxt, int partnum)
> +{
> + cxt->label->part_delete(cxt, partnum);
> + return 0;
> +}
> +
> static int __probe_labels(struct fdisk_context *cxt)
> {
> int i, rc = 0;
> --
> 1.7.4.1
>
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe util-linux" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Petr
--
Petr Uzel
IRC: ptr_uzl @ freenode
[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 04/10] fdisk: API: add delete partition to label operations
2012-07-22 17:05 [PATCH 04/10] fdisk: API: add delete partition to label operations Davidlohr Bueso
2012-07-24 10:26 ` Petr Uzel
@ 2012-07-24 11:37 ` Karel Zak
1 sibling, 0 replies; 3+ messages in thread
From: Karel Zak @ 2012-07-24 11:37 UTC (permalink / raw)
To: Davidlohr Bueso; +Cc: Petr Uzel, util-linux
On Sun, Jul 22, 2012 at 07:05:07PM +0200, Davidlohr Bueso wrote:
> 12 files changed, 101 insertions(+), 96 deletions(-)
Applied with some changes, thanks.
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-07-24 11:37 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-22 17:05 [PATCH 04/10] fdisk: API: add delete partition to label operations Davidlohr Bueso
2012-07-24 10:26 ` Petr Uzel
2012-07-24 11:37 ` Karel Zak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).