util-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).