static bool_t msdos_partition(struct disk_t * disk, size_t sector, size_t relative) { struct msdos_partition_mbr_t mbr; struct partition_t * part; size_t start; int i; if(!disk || !disk->name) return FALSE; if(!disk->size || !disk->count) return FALSE; if(disk_read(disk, (u8_t *)(&mbr), sector * disk->size, sizeof(struct msdos_partition_mbr_t)) != sizeof(struct msdos_partition_mbr_t)) return FALSE; if((mbr.signature[0] != 0x55) || mbr.signature[1] != 0xaa) return FALSE; for(i = 0; i < 4; i++) { if((mbr.entry[i].type != 0) && (is_msdos_extended(mbr.entry[i].type)==FALSE)) { part = malloc(sizeof(struct partition_t)); if(!part) return FALSE; strlcpy(part->name, "", sizeof(part->name)); part->from = sector + ((mbr.entry[i].start[3] << 24) | (mbr.entry[i].start[2] << 16) | (mbr.entry[i].start[1] << 8) | (mbr.entry[i].start[0] << 0)); part->to = part->from + ((mbr.entry[i].length[3] << 24) | (mbr.entry[i].length[2] << 16) | (mbr.entry[i].length[1] << 8) | (mbr.entry[i].length[0] << 0)) - 1; part->size = disk->size; list_add_tail(&part->entry, &(disk->part.entry)); } } for(i = 0; i < 4; i++) { if(is_msdos_extended(mbr.entry[i].type) == TRUE) { start = ((mbr.entry[i].start[3] << 24) | (mbr.entry[i].start[2] << 16) | (mbr.entry[i].start[1] << 8) | (mbr.entry[i].start[0] << 0)) + relative; return msdos_partition(disk, start, (sector == 0) ? start : relative); } } return TRUE; }
static void check_partition(struct gendisk *hd, kdev_t dev) { static int first_time = 1; unsigned long first_sector; char buf[8]; if (first_time) printk("Partition check:\n"); first_time = 0; first_sector = hd->part[MINOR(dev)].start_sect; /* * This is a kludge to allow the partition check to be * skipped for specific drives (e.g. IDE cd-rom drives) */ if ((int)first_sector == -1) { hd->part[MINOR(dev)].start_sect = 0; return; } printk(" %s:", disk_name(hd, MINOR(dev), buf)); #ifdef CONFIG_MSDOS_PARTITION if (msdos_partition(hd, dev, first_sector)) return; #endif #ifdef CONFIG_OSF_PARTITION if (osf_partition(hd, dev, first_sector)) return; #endif #ifdef CONFIG_SUN_PARTITION if(sun_partition(hd, dev, first_sector)) return; #endif #ifdef CONFIG_AMIGA_PARTITION if(amiga_partition(hd, dev, first_sector)) return; #endif printk(" unknown partition table\n"); }
static bool_t msdos_map(struct disk_t * disk) { return msdos_partition(disk, 0, 0); }