示例#1
0
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;
}