int write_mbr_partition_table(void) { printf("write mbr partition \n"); emmc_part_device_init(); //write pmbr struct disk_info *device_disk_info; if (!(device_disk_info = load_diskconfig())) { printf("Errors encountered while loading disk partation\n"); return 1; } /* First, partition the drive */ if (apply_disk_config(device_disk_info)) printf("write partition list success\n"); return 1; }
int main(int argc, char *argv[]) { struct disk_info *dinfo = NULL; int test = 0; int verbose = 0; int cnt; if (parse_args(argc, argv, &dinfo, &test, &verbose)) return 1; if (process_disk_config(dinfo)) { fprintf(stderr, "Disk configuration is bad\n"); return 1; } if (verbose) dump_disk_config(dinfo); if (test) printf("Test mode enabled. Actions will not be committed to disk!\n"); if (apply_disk_config(dinfo, test)) { fprintf(stderr, "Could not apply disk configuration!\n"); return 1; } printf("Copying images to specified partition offsets\n"); /* now copy the images to their appropriate locations on disk */ for (cnt = 0; cnt < MAX_NUM_PARTS && part_file_map[cnt].pinfo; ++cnt) { off64_t offs = part_file_map[cnt].pinfo->start_lba * dinfo->sect_size; const char *dest_fn = dinfo->device; if (write_raw_image(dest_fn, part_file_map[cnt].filename, offs, test)) { fprintf(stderr, "Could not write images after editing label.\n"); return 1; } } printf("File edit complete. Wrote %d images.\n", cnt); return 0; }
int Volume::initializeMbr(const char *deviceNode) { struct disk_info dinfo; memset(&dinfo, 0, sizeof(dinfo)); if (!(dinfo.part_lst = (struct part_info *) malloc(MAX_NUM_PARTS * sizeof(struct part_info)))) { SLOGE("Failed to malloc prt_lst"); return -1; } memset(dinfo.part_lst, 0, MAX_NUM_PARTS * sizeof(struct part_info)); dinfo.device = strdup(deviceNode); dinfo.scheme = PART_SCHEME_MBR; dinfo.sect_size = 512; dinfo.skip_lba = 2048; dinfo.num_lba = 0; dinfo.num_parts = 1; struct part_info *pinfo = &dinfo.part_lst[0]; pinfo->name = strdup("android_sdcard"); pinfo->flags |= PART_ACTIVE_FLAG; pinfo->type = PC_PART_TYPE_FAT32; pinfo->len_kb = -1; int rc = apply_disk_config(&dinfo, 0); if (rc) { SLOGE("Failed to apply disk configuration (%d)", rc); goto out; } out: free(pinfo->name); free(dinfo.device); free(dinfo.part_lst); return rc; }
void setup_disk_information(char *disk_layout_location) { char *disk_force; /* Read the preos.fstab, which is used to for filesystem * meta-data and also the sd card device node */ load_volume_table(); /* * If all device nodes exist and disk_force set to no in * config file, skip to load/write partition table */ disk_force = tboot_config_get(DISK_FORCE_KEY); if (!disk_force) { pr_error("Invalid tboot config disk_force.\n"); tboot_config_set(DISK_FORCE_KEY, "yes"); } if (!check_devnodes() && !strcasecmp(disk_force, "no")) { pr_debug("bypass load disk config\n"); return; } /* Read disk_layout.conf, which provides physical partition * layout information */ pr_debug("Reading disk layout from %s\n", disk_layout_location); disk_info = load_diskconfig(disk_layout_location, NULL); if (!disk_info) { pr_error("Disk layout unreadable.\n"); die(); } process_disk_config(disk_info); dump_disk_config(disk_info); /* Set up the partition table */ if (apply_disk_config(disk_info, 0)) { pr_error("Couldn't apply disk configuration.\n"); die(); } }
int Volume::initializeMbr(const char *deviceNode) { struct disk_info dinfo; int ret = -1; struct timeval now; struct timespec outtime; SLOGI("Enter Volume::initializeMbr()\n"); memset(&dinfo, 0, sizeof(dinfo)); if (!(dinfo.part_lst = (struct part_info *) malloc(MAX_NUM_PARTS * sizeof(struct part_info)))) { SLOGE("Failed to malloc prt_lst"); return -1; } memset(dinfo.part_lst, 0, MAX_NUM_PARTS * sizeof(struct part_info)); dinfo.device = strdup(deviceNode); dinfo.scheme = PART_SCHEME_MBR; dinfo.sect_size = 512; dinfo.skip_lba = 2048; dinfo.num_lba = 0; dinfo.num_parts = 1; struct part_info *pinfo = &dinfo.part_lst[0]; pinfo->name = strdup("android_sdcard"); pinfo->flags |= PART_ACTIVE_FLAG; pinfo->type = PC_PART_TYPE_FAT32; pinfo->len_kb = -1; SLOGI("Volume::initializeMbr() -- calls apply_disk_config()\n"); int rc = apply_disk_config(&dinfo, 0); SLOGI("Volume::initializeMbr() -- exit apply_disk_config()\n"); if (rc) { SLOGE("Failed to apply disk configuration (%d)", rc); goto out; } gettimeofday(&now, NULL); outtime.tv_sec = now.tv_sec + PART_RESCAN_UEVENT_TO; outtime.tv_nsec = now.tv_usec * 1000L; pthread_mutex_lock(&part_rescan_mutex); part_rescan_wait = WAIT_ON_ADD_EVENT; if((ret = pthread_cond_timedwait(&part_rescan_cond, &part_rescan_mutex, &outtime))){ SLOGE("Wait for partition rescan uevent %d seconds timeout. ret:%d, error:%s", PART_RESCAN_UEVENT_TO, ret, strerror(ret)); } SLOGD("%s: return: %d(%s)", __FUNCTION__, ret, strerror(ret)); part_rescan_wait = WAIT_ON_NO_EVENT; pthread_mutex_unlock(&part_rescan_mutex); out: SLOGI("Exit Volume::initializeMbr() -- free name\n"); free(pinfo->name); SLOGI("Exit Volume::initializeMbr() -- free dinfo.device\n"); free(dinfo.device); SLOGI("Exit Volume::initializeMbr() -- free dinfo.part_lst\n"); free(dinfo.part_lst); SLOGI("Exit initializeMbr().\n"); return rc; }