static int bsd_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) { BSDPartitionData* bsd_data = part->disk_specific; part->fs_type = fs_type; if (!fs_type) bsd_data->type = 0x8; else if (is_linux_swap (fs_type->name)) bsd_data->type = 0x1; else bsd_data->type = 0x8; return 1; }
static int amiga_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) { struct PartitionBlock *partition; PED_ASSERT (part != NULL); PED_ASSERT (part->disk_specific != NULL); partition = PART(part->disk_specific); part->fs_type = fs_type; if (!fs_type) partition->de_DosType = PED_CPU_TO_BE32(0x4c4e5800); /* 'LNX\0' */ else if (!strcmp (fs_type->name, "ext2")) partition->de_DosType = PED_CPU_TO_BE32(0x4c4e5800); /* 'LNX\0' */ else if (!strcmp (fs_type->name, "ext3")) partition->de_DosType = PED_CPU_TO_BE32(0x45585403); /* 'EXT\3' */ else if (is_linux_swap (fs_type->name)) partition->de_DosType = PED_CPU_TO_BE32(0x53575000); /* 'SWP\0' */ else if (!strcmp (fs_type->name, "fat16")) partition->de_DosType = PED_CPU_TO_BE32(0x46415400); /* 'FAT\0' */ else if (!strcmp (fs_type->name, "fat32")) partition->de_DosType = PED_CPU_TO_BE32(0x46415401); /* 'FAT\1'*/ else if (!strcmp (fs_type->name, "hfs")) partition->de_DosType = PED_CPU_TO_BE32(0x48465300); /* 'HFS\0' */ else if (!strcmp (fs_type->name, "jfs")) partition->de_DosType = PED_CPU_TO_BE32(0x4a465300); /* 'JFS\0' */ else if (!strcmp (fs_type->name, "ntfs")) partition->de_DosType = PED_CPU_TO_BE32(0x4e544653); /* 'NTFS' */ else if (!strcmp (fs_type->name, "reiserfs")) partition->de_DosType = PED_CPU_TO_BE32(0x52465300); /* 'RFS\0' */ else if (!strcmp (fs_type->name, "sun-ufs")) partition->de_DosType = PED_CPU_TO_BE32(0x53554653); /* 'SUFS' */ else if (!strcmp (fs_type->name, "hp-ufs")) partition->de_DosType = PED_CPU_TO_BE32(0x48554653); /* 'HUFS' */ else if (!strcmp (fs_type->name, "xfs")) partition->de_DosType = PED_CPU_TO_BE32(0x58465300); /* 'XFS\0' */ else partition->de_DosType = PED_CPU_TO_BE32(0x00000000); /* unknown */ return 1; }
static int dasd_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) { DasdPartitionData* dasd_data = part->disk_specific; PedSector cyl_size; cyl_size=part->disk->dev->hw_geom.sectors * part->disk->dev->hw_geom.heads; PDEBUG; part->fs_type = fs_type; if (dasd_data->lvm) { dasd_data->system = PARTITION_LINUX_LVM; PDEBUG; return 1; } if (dasd_data->raid) { dasd_data->system = PARTITION_LINUX_RAID; PDEBUG; return 1; } if (!fs_type) { dasd_data->system = PARTITION_LINUX; PDEBUG; } else if (is_linux_swap (fs_type->name)) { dasd_data->system = PARTITION_LINUX_SWAP; PDEBUG; } else { dasd_data->system = PARTITION_LINUX; PDEBUG; } return 1; }
static int dasd_read (PedDisk* disk) { int i; char str[20]; PedDevice* dev; PedPartition* part; PedFileSystemType *fs; PedSector start, end; PedConstraint* constraint_exact; partition_info_t *p; LinuxSpecific* arch_specific; DasdDiskSpecific* disk_specific; struct fdasd_anchor anchor; PDEBUG; PED_ASSERT (disk != NULL); PDEBUG; PED_ASSERT (disk->dev != NULL); PDEBUG; dev = disk->dev; arch_specific = LINUX_SPECIFIC(dev); disk_specific = disk->disk_specific; PDEBUG; fdasd_initialize_anchor(&anchor); if (fdasd_get_geometry(disk->dev, &anchor, arch_specific->fd) == 0) goto error_close_dev; disk_specific->label_block = anchor.label_block; if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE) anchor.big_disk++; /* check dasd for labels and vtoc */ if (fdasd_check_volume(&anchor, arch_specific->fd)) { DasdPartitionData* dasd_data; /* Kernel partitioning code will report 'implicit' partitions * for non-CDL format DASDs even when there is no * label/VTOC. */ if (anchor.FBA_layout == 0) goto error_close_dev; disk_specific->format_type = 1; /* Register implicit partition */ ped_disk_delete_all (disk); start = (PedSector) arch_specific->real_sector_size / (PedSector) disk->dev->sector_size * (PedSector) (anchor.label_block + 1); end = disk->dev->length - 1; part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, start, end); if (!part) goto error_close_dev; part->num = 1; part->fs_type = ped_file_system_probe (&part->geom); dasd_data = part->disk_specific; dasd_data->raid = 0; dasd_data->lvm = 0; dasd_data->type = 0; if (!ped_disk_add_partition (disk, part, NULL)) goto error_close_dev; fdasd_cleanup(&anchor); return 1; } /* Save volume label (read by fdasd_check_volume) for writing */ memcpy(&disk_specific->vlabel, anchor.vlabel, sizeof(volume_label_t)); ped_disk_delete_all (disk); bool is_ldl = strncmp(anchor.vlabel->volkey, vtoc_ebcdic_enc("LNX1", str, 4), 4) == 0; bool is_cms = strncmp(anchor.vlabel->volkey, vtoc_ebcdic_enc("CMS1", str, 4), 4) == 0; if (is_ldl || is_cms) { DasdPartitionData* dasd_data; union vollabel { volume_label_t ldl; cms_volume_label_t cms; }; union vollabel *cms_ptr1 = (union vollabel *) anchor.vlabel; cms_volume_label_t *cms_ptr = &cms_ptr1->cms; volume_label_t *ldl_ptr = &cms_ptr1->ldl; int partition_start_block; disk_specific->format_type = 1; if (is_cms && cms_ptr->usable_count >= cms_ptr->block_count) partition_start_block = 2; /* FBA DASD */ else partition_start_block = 3; /* CKD DASD */ if (is_ldl) start = (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size * (long long) partition_start_block; else if (cms_ptr->disk_offset == 0) start = (long long) cms_ptr->block_size / (long long) disk->dev->sector_size * (long long) partition_start_block; else start = (long long) cms_ptr->block_size / (long long) disk->dev->sector_size * (long long) cms_ptr->disk_offset; if (is_ldl) if (ldl_ptr->ldl_version >= 0xf2) end = (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size * (long long) ldl_ptr->formatted_blocks - 1; else end = disk->dev->length - 1; else if (cms_ptr->disk_offset == 0) end = (long long) cms_ptr->block_size / (long long) disk->dev->sector_size * (long long) cms_ptr->block_count - 1; else /* Frankly, I do not understand why the last block of the CMS reserved file is not included in the partition; but this is the algorithm used by the Linux kernel. See fs/partitions/ibm.c in the Linux kernel source code. */ end = (long long) cms_ptr->block_size / (long long) disk->dev->sector_size * (long long) (cms_ptr->block_count - 1) - 1; part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, start, end); if (!part) goto error_close_dev; part->num = 1; part->fs_type = ped_file_system_probe (&part->geom); dasd_data = part->disk_specific; dasd_data->raid = 0; dasd_data->lvm = 0; dasd_data->type = 0; if (!ped_disk_add_partition (disk, part, NULL)) goto error_close_dev; fdasd_cleanup(&anchor); return 1; } /* CDL format, newer */ disk_specific->format_type = 2; p = anchor.first; PDEBUG; for (i = 1 ; i <= USABLE_PARTITIONS; i++) { char *ch = p->f1->DS1DSNAM; DasdPartitionData* dasd_data; if (p->used != 0x01) continue; PDEBUG; start = (long long)(long long) p->start_trk * (long long) disk->dev->hw_geom.sectors * (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size; end = (long long)((long long) p->end_trk + 1) * (long long) disk->dev->hw_geom.sectors * (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size - 1; part = ped_partition_new(disk, PED_PARTITION_NORMAL, NULL, start, end); PDEBUG; if (!part) goto error_close_dev; PDEBUG; part->num = i; part->fs_type = ped_file_system_probe(&part->geom); vtoc_ebcdic_dec(p->f1->DS1DSNAM, p->f1->DS1DSNAM, 44); ch = strstr(p->f1->DS1DSNAM, "PART"); if (ch != NULL) { strncpy(str, ch+9, 6); str[6] = '\0'; } dasd_data = part->disk_specific; if ((strncmp(PART_TYPE_RAID, str, 6) == 0) && (ped_file_system_probe(&part->geom) == NULL)) ped_partition_set_flag(part, PED_PARTITION_RAID, 1); else ped_partition_set_flag(part, PED_PARTITION_RAID, 0); if ((strncmp(PART_TYPE_LVM, str, 6) == 0) && (ped_file_system_probe(&part->geom) == NULL)) ped_partition_set_flag(part, PED_PARTITION_LVM, 1); else ped_partition_set_flag(part, PED_PARTITION_LVM, 0); if (strncmp(PART_TYPE_SWAP, str, 6) == 0) { fs = ped_file_system_probe(&part->geom); if (fs && is_linux_swap(fs->name)) { dasd_data->system = PARTITION_LINUX_SWAP; PDEBUG; } } vtoc_ebcdic_enc(p->f1->DS1DSNAM, p->f1->DS1DSNAM, 44); dasd_data->type = 0; constraint_exact = ped_constraint_exact (&part->geom); if (!constraint_exact) goto error_close_dev; if (!ped_disk_add_partition(disk, part, constraint_exact)) { ped_constraint_destroy(constraint_exact); goto error_close_dev; } ped_constraint_destroy(constraint_exact); if (p->fspace_trk > 0) { start = (long long)((long long) p->end_trk + 1) * (long long) disk->dev->hw_geom.sectors * (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size; end = (long long)((long long) p->end_trk + 1 + p->fspace_trk) * (long long) disk->dev->hw_geom.sectors * (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size - 1; part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, start, end); if (!part) goto error_close_dev; part->type = PED_PARTITION_FREESPACE; constraint_exact = ped_constraint_exact(&part->geom); if (!constraint_exact) goto error_close_dev; if (!ped_disk_add_partition(disk, part, constraint_exact)) { ped_constraint_destroy(constraint_exact); goto error_close_dev; } ped_constraint_destroy (constraint_exact); } p = p->next; } PDEBUG; fdasd_cleanup(&anchor); return 1; error_close_dev: PDEBUG; fdasd_cleanup(&anchor); return 0; }