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)
/* 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 */
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);
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"
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];
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);
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)
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;
} 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];
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);
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"
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);
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;
* 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;
}