コード例 #1
0
ファイル: test_lwext4.c プロジェクト: GarethNelson/lwext4
bool test_lwext4_mount(struct ext4_blockdev *bdev, struct ext4_bcache *bcache)
{
	int r;

	bc = bcache;
	bd = bdev;

	if (!bd) {
		printf("test_lwext4_mount: no block device\n");
		return false;
	}

	ext4_dmask_set(DEBUG_ALL);

	r = ext4_device_register(bd, bc ? bc : 0, "ext4_fs");
	if (r != EOK) {
		printf("ext4_device_register: rc = %d\n", r);
		return false;
	}

	r = ext4_mount("ext4_fs", "/mp/", false);
	if (r != EOK) {
		printf("ext4_mount: rc = %d\n", r);
		return false;
	}

	r = ext4_recover("/mp/");
	if (r != EOK && r != ENOTSUP) {
		printf("ext4_recover: rc = %d\n", r);
		return false;
	}

	r = ext4_journal_start("/mp/");
	if (r != EOK) {
		printf("ext4_journal_start: rc = %d\n", r);
		return false;
	}

	ext4_cache_write_back("/mp/", 1);
	return true;
}
コード例 #2
0
ファイル: grub.c プロジェクト: sndnvaps/lk-1
static int grub_load_from_mmc(void) {
	ext4_file f;
	uint32_t bytes_read;
	int ret = 0, allow = 0;

	dprintf(INFO, "%s: part=[%s] path=[%s]\n", __func__, GRUB_BOOT_PARTITION, GRUB_PATH);

	// create ext4 device
	struct ext4_blockdev* mmcdev = ext4_mmcdev_get(GRUB_BOOT_PARTITION);
	if(!mmcdev){
		dprintf(CRITICAL, "MMC device ERROR\n");
		return -1;
	}

	// register it
	ret = ext4_device_register(mmcdev, 0, GRUB_BOOT_PARTITION);
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_device_register ERROR = %d\n", ret);
		return ret;
	}

	// mount it
	ret = ext4_mount(GRUB_BOOT_PARTITION, GRUB_MOUNTPOINT);
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_mount ERROR = %d\n", ret);
		return -1;
	}

	// check permissions of crucial files
	if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/core.img", &allow)==EOK && !allow)
		return -1;
	if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/grub.cfg", &allow)==EOK && !allow)
		return -1;
	if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/grubenv", &allow)==EOK && !allow)
		return -1;
	dprintf(INFO, "Permissions are good\n");

	// open file
	ret = ext4_fopen(&f, GRUB_MOUNTPOINT GRUB_PATH "/core.img", "rb");
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_fopen ERROR = %d\n", ret);
		return -1;
	}

	// read file
	ret = ext4_fread(&f, (void*)GRUB_LOADING_ADDRESS_VIRT, ext4_fsize(&f), &bytes_read);
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_fread ERROR = %d\n", ret);
		return -1;
	}

	// close file
	ret = ext4_fclose(&f);
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_fclose ERROR = %d\n", ret);
		return -1;
	}

	// unmount partition
	ret = ext4_umount(GRUB_MOUNTPOINT);
	if(ret != EOK){
		dprintf(CRITICAL, "ext4_umount ERROR = %d\n", ret);
		return -1;
	}

	// store bootdev
	unsigned int index = (unsigned int) partition_get_index(GRUB_BOOT_PARTITION);
	char buf[20];
	sprintf(buf, "hd0,%u", index+1);
	grub_bootdev = strdup(buf);
	grub_bootpath = strdup(GRUB_BOOT_PATH_PREFIX "boot/grub");

	dprintf(INFO, "Loaded GRUB from MMC\n");
	return 0;
}