From: Karel Zak Date: Wed, 26 Sep 2012 12:14:54 +0000 (+0200) Subject: fdisk: use fdisk_parttype in add_partition X-Git-Tag: v2.23-rc1~670 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed470672bbbfeb160008cecb28c2a443e755d289;p=thirdparty%2Futil-linux.git fdisk: use fdisk_parttype in add_partition Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c index 814183108c..6dff7553c8 100644 --- a/fdisks/fdisk.c +++ b/fdisks/fdisk.c @@ -1306,11 +1306,7 @@ static void new_partition(struct fdisk_context *cxt) if (disklabel == SUN_LABEL || disklabel == SGI_LABEL) partnum = get_partition(cxt, 0, partitions); - /* - * Use default LINUX_NATIVE partition type, DOS labels - * may override this internally. - */ - fdisk_add_partition(cxt, partnum, LINUX_NATIVE); + fdisk_add_partition(cxt, partnum, NULL); } static void write_table(struct fdisk_context *cxt) diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index 5af172fcf2..d80f97517b 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -171,7 +171,7 @@ struct fdisk_label { /* create new disk label */ int (*create)(struct fdisk_context *cxt); /* new partition */ - void (*part_add)(struct fdisk_context *cxt, int partnum, int parttype); + void (*part_add)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t); /* delete partition */ void (*part_delete)(struct fdisk_context *cxt, int partnum); /* get partition type */ @@ -201,7 +201,7 @@ extern int fdisk_context_set_user_geometry(struct fdisk_context *cxt, unsigned int cylinders, unsigned int heads, unsigned int sectors); extern int fdisk_delete_partition(struct fdisk_context *cxt, int partnum); -extern int fdisk_add_partition(struct fdisk_context *cxt, int partnum, int parttype); +extern int fdisk_add_partition(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t); extern int fdisk_write_disklabel(struct fdisk_context *cxt); extern int fdisk_verify_disklabel(struct fdisk_context *cxt); extern int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name); diff --git a/fdisks/fdiskaixlabel.c b/fdisks/fdiskaixlabel.c index 6fe7b59d8a..3ee37cb4e2 100644 --- a/fdisks/fdiskaixlabel.c +++ b/fdisks/fdiskaixlabel.c @@ -69,7 +69,7 @@ static int aix_probe_label(struct fdisk_context *cxt) static void aix_add_partition( struct fdisk_context *cxt __attribute__((__unused__)), int partnum __attribute__((__unused__)), - int parttype __attribute__((__unused__))) + struct fdisk_parttype *t __attribute__((__unused__))) { printf(_("\tSorry - this fdisk cannot handle AIX disk labels." "\n\tIf you want to add DOS-type partitions, create" diff --git a/fdisks/fdiskbsdlabel.c b/fdisks/fdiskbsdlabel.c index b11bcf1cb7..af7513f5e1 100644 --- a/fdisks/fdiskbsdlabel.c +++ b/fdisks/fdiskbsdlabel.c @@ -153,7 +153,7 @@ static int xbsd_write_disklabel (struct fdisk_context *cxt) static void xbsd_add_part (struct fdisk_context *cxt, int partnum __attribute__((__unused__)), - int parttype __attribute__((__unused__))) + struct fdisk_parttype *t __attribute__((__unused__))) { unsigned int begin, end; char mesg[256]; diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c index d391126ecc..2436af533c 100644 --- a/fdisks/fdiskdoslabel.c +++ b/fdisks/fdiskdoslabel.c @@ -487,15 +487,17 @@ static sector_t align_lba_in_range(struct fdisk_context *cxt, return lba; } -static void add_partition(struct fdisk_context *cxt, int n, int sys) +static void add_partition(struct fdisk_context *cxt, int n, struct fdisk_parttype *t) { char mesg[256]; /* 48 does not suffice in Japanese */ - int i, read = 0; + int i, sys, read = 0; struct partition *p = ptes[n].part_table; struct partition *q = ptes[ext_index].part_table; sector_t start, stop = 0, limit, temp, first[partitions], last[partitions]; + sys = t ? t->type : LINUX_NATIVE; + if (p && p->sys_ind) { printf(_("Partition %d is already defined. Delete " "it before re-adding it.\n"), n + 1); @@ -646,7 +648,7 @@ static void add_logical(struct fdisk_context *cxt) partitions++; } printf(_("Adding logical partition %d\n"), partitions); - add_partition(cxt, partitions - 1, LINUX_NATIVE); + add_partition(cxt, partitions - 1, NULL); } static int dos_verify_disklabel(struct fdisk_context *cxt) @@ -722,13 +724,10 @@ static int dos_verify_disklabel(struct fdisk_context *cxt) static void dos_add_partition( struct fdisk_context *cxt, int partnum __attribute__ ((__unused__)), - int parttype) + struct fdisk_parttype *t) { int i, free_primary = 0; - /* default */ - parttype = LINUX_NATIVE; - for (i = 0; i < 4; i++) free_primary += !ptes[i].part_table->sys_ind; @@ -747,7 +746,7 @@ static void dos_add_partition( } else if (partitions >= MAXIMUM_PARTS) { printf(_("All logical partitions are in use\n")); printf(_("Adding a primary partition\n")); - add_partition(cxt, get_partition(cxt, 0, 4), parttype); + add_partition(cxt, get_partition(cxt, 0, 4), t); } else { char c, dflt, line[LINE_LENGTH]; @@ -769,15 +768,17 @@ static void dos_add_partition( if (c == 'p') { int i = get_nonexisting_partition(cxt, 0, 4); if (i >= 0) - add_partition(cxt, i, parttype); + add_partition(cxt, i, t); return; } else if (c == 'l' && extended_offset) { add_logical(cxt); return; } else if (c == 'e' && !extended_offset) { int i = get_nonexisting_partition(cxt, 0, 4); - if (i >= 0) - add_partition(cxt, i, EXTENDED); + if (i >= 0) { + t = fdisk_get_parttype_from_code(cxt, EXTENDED); + add_partition(cxt, i, t); + } return; } else printf(_("Invalid partition type `%c'\n"), c); diff --git a/fdisks/fdiskmaclabel.c b/fdisks/fdiskmaclabel.c index 34db9d62d6..e09d5e4fca 100644 --- a/fdisks/fdiskmaclabel.c +++ b/fdisks/fdiskmaclabel.c @@ -87,7 +87,7 @@ IS_MAC: static void mac_add_partition( struct fdisk_context *cxt __attribute__ ((__unused__)), int partnum __attribute__ ((__unused__)), - int parttype __attribute__ ((__unused__))) + struct fdisk_parttype *t __attribute__ ((__unused__))) { printf(_("\tSorry - this fdisk cannot handle Mac disk labels." "\n\tIf you want to add DOS-type partitions, create" diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c index 6cef145e4d..aa46fd5ff5 100644 --- a/fdisks/fdisksgilabel.c +++ b/fdisks/fdisksgilabel.c @@ -636,16 +636,18 @@ static void sgi_delete_partition(struct fdisk_context *cxt, int partnum) sgi_set_partition(cxt, partnum, 0, 0, 0); } -static void sgi_add_partition(struct fdisk_context *cxt, int n, int sys) +static void sgi_add_partition(struct fdisk_context *cxt, int n, + struct fdisk_parttype *t) { char mesg[256]; unsigned int first=0, last=0; + int sys = t ? t->type : SGI_XFS; - if (n == 10) { + if (n == 10) sys = SGI_VOLUME; - } else if (n == 8) { + else if (n == 8) sys = 0; - } + if (sgi_get_num_sectors(cxt, n)) { printf(_("Partition %d is already defined. Delete " "it before re-adding it.\n"), n + 1); diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c index 43d3cdfd94..9d3c3d1972 100644 --- a/fdisks/fdisksunlabel.c +++ b/fdisks/fdisksunlabel.c @@ -364,13 +364,14 @@ static int sun_verify_disklabel(struct fdisk_context *cxt) return 0; } -static void sun_add_partition(struct fdisk_context *cxt, int n, int sys) +static void sun_add_partition(struct fdisk_context *cxt, int n, + struct fdisk_parttype *t) { uint32_t starts[SUN_NUM_PARTITIONS], lens[SUN_NUM_PARTITIONS]; struct sun_partition *part = &sunlabel->partitions[n]; struct sun_tag_flag *tag = &sunlabel->part_tags[n]; uint32_t start, stop, stop2; - int whole_disk = 0; + int whole_disk = 0, sys = t ? t->type : SUN_TAG_LINUX_NATIVE; char mesg[256]; int i; diff --git a/fdisks/utils.c b/fdisks/utils.c index e9bc0182c2..482a6cf928 100644 --- a/fdisks/utils.c +++ b/fdisks/utils.c @@ -88,20 +88,21 @@ int fdisk_verify_disklabel(struct fdisk_context *cxt) * fdisk_add_partition: * @cxt: fdisk context * @partnum: partition number to create - * @parttype: partition type to create + * @t: partition type to create or NULL for label-specific default * * Creates a new partition, with number @partnum and type @parttype. * * Returns 0. */ -int fdisk_add_partition(struct fdisk_context *cxt, int partnum, int parttype) +int fdisk_add_partition(struct fdisk_context *cxt, int partnum, + struct fdisk_parttype *t) { if (!cxt || !cxt->label) return -EINVAL; if (!cxt->label->part_add) return -ENOSYS; - cxt->label->part_add(cxt, partnum, parttype); + cxt->label->part_add(cxt, partnum, t); return 0; }