static status_t checksumfs_initialize(int fd, partition_id partition, const char* name, const char* parameters, off_t partitionSize, disk_job_id job) { if (name == NULL || strlen(name) >= kCheckSumFSNameLength) return B_BAD_VALUE; // TODO: Forcing a non-empty name here. Superfluous when the userland disk // system add-on has a parameter editor for it. if (*name == '\0') name = "Unnamed"; update_disk_device_job_progress(job, 0); Volume volume(0); status_t error = volume.Init(fd, partitionSize / B_PAGE_SIZE); if (error != B_OK) return error; error = volume.Initialize(name); if (error != B_OK) return error; // rescan partition error = scan_partition(partition); if (error != B_OK) return error; update_disk_device_job_progress(job, 1); return B_OK; }
int main(int argc, char **argv) { if (argc != 7 && (argc != 3 || (argc == 3 && strcmp(argv[1],"scan"))!=0) && (argc != 6 || (argc == 6 && strcmp(argv[1],"scan"))!=0)) return die("Usage: %s dump|flash <partition> <partition_start_block> <reservoirpartition> <reservoir_start_block> <file>\n" "E.g. %s dump boot 72 reservoir 2004 file.bin\n" "Usage: %s scan <partition> [<partition_start_block> <reservoirpartition> <reservoir_start_block>]\n" ,argv[0], argv[0], argv[0]); int num_partitions = mtd_scan_partitions(); const MtdPartition *pSrcPart = mtd_find_partition_by_name(argv[2]); if (pSrcPart == NULL) return die("Cannot find partition %s", argv[2]); int scanResult = scan_partition(pSrcPart); if (argc == 3 && strcmp(argv[1],"scan")==0) { return (scanResult == 0 ? 0 : EXIT_CODE_BAD_BLOCKS); } int retVal = 0; const MtdPartition* pReservoirPart = mtd_find_partition_by_name(argv[4]); if (pReservoirPart == NULL) return die("Cannot find partition %s", argv[4]); int srcPartStartBlock = atoi(argv[3]); int reservoirPartStartBlock = atoi(argv[5]); const unsigned short* pMapping = CreateBlockMapping(pSrcPart, srcPartStartBlock, pReservoirPart, reservoirPartStartBlock); if (pMapping == NULL && scanResult == 0) { printf("Generating empty block mapping table for error-free partition.\n"); pMapping = CreateEmptyBlockMapping(pSrcPart); } if (argc == 6 && strcmp(argv[1],"scan")==0) { retVal = (scanResult == 0 ? 0 : EXIT_CODE_BAD_BLOCKS); } if (pMapping == NULL) return die("Failed to create block mapping table"); if (strcmp(argv[1],"dump")==0) { retVal = dump_bml_partition(pSrcPart, pReservoirPart, pMapping, argv[6]); if (retVal == 0) printf("Successfully dumped partition to %s\n", argv[6]); } if (strcmp(argv[1],"flash")==0) { retVal = flash_bml_partition(pSrcPart, pReservoirPart, pMapping, argv[6]); if (retVal == 0) printf("Successfully wrote %s to partition\n", argv[6]); } ReleaseBlockMapping(pMapping); return retVal; }