Beispiel #1
0
static int cmd_blockdev_exec(struct vmm_chardev *cdev, int argc, char **argv)
{
	struct vmm_blockdev *bdev = NULL;

	if (argc == 2) {
		if (strcmp(argv[1], "help") == 0) {
			cmd_blockdev_usage(cdev);
			return VMM_OK;
		} else if (strcmp(argv[1], "list") == 0) {
			cmd_blockdev_list(cdev);
			return VMM_OK;
		}
	} else if (argc >= 3) {
		bdev = vmm_blockdev_find(argv[2]);

		if (!bdev) {
			vmm_cprintf(cdev, "Error: cannot find blockdev %s\n",
				    argv[2]);
			return VMM_EINVALID;
		}

		if (strcmp(argv[1], "info") == 0) {
			return cmd_blockdev_info(cdev, bdev);
		} else if (strcmp(argv[1], "dump8") == 0) {
			return cmd_blockdev_dump8(cdev, bdev,
						 argc - 3, argv + 3);
		}
	}
	cmd_blockdev_usage(cdev);
	return VMM_EFAIL;
}
void mtdblock_remove(struct mtd_info *mtd)
{
	struct vmm_blockdev	*bdev = NULL;
	struct vmm_blockrq	*brq = NULL;

	if (NULL == (bdev = vmm_blockdev_find(mtd->name)))
		return;
	brq = vmm_blockrq_from_rq(bdev->rq);

	vmm_blockdev_unregister(bdev);
	if (brq)
		vmm_blockrq_destroy(brq);
	vmm_blockdev_free(bdev);
}
Beispiel #3
0
static int cmd_vfs_mount(struct vmm_chardev *cdev, 
			 const char *dev, const char *path)
{
	int rc;
	bool found;
	int fd, num, count;
	struct vmm_blockdev *bdev;
	struct filesystem *fs;

	bdev = vmm_blockdev_find(dev);
	if (!bdev) {
		vmm_cprintf(cdev, "Block device %s not found\n", dev);
		return VMM_ENODEV;
	}

	if (strcmp(path, "/") != 0) {
		fd = vfs_opendir(path);
		if (fd < 0) {
			vmm_cprintf(cdev, "Directory %s not found\n", path);
			return fd;
		} else {
			vfs_closedir(fd);
		}
	}

	found = FALSE;
	count = vfs_filesystem_count();
	vmm_cprintf(cdev, "Trying:");
	for (num = 0; num < count; num++) {
		fs = vfs_filesystem_get(num);
		vmm_cprintf(cdev, " %s", fs->name);
		rc = vfs_mount(path, fs->name, dev, MOUNT_RW);
		if (!rc) {
			found = TRUE;
			vmm_cprintf(cdev, "\n"); 
			break;
		}
	}

	if (!found) {
		vmm_cprintf(cdev, "\nMount failed\n");
		return VMM_ENOSYS;
	}

	vmm_cprintf(cdev, "Mounted %s using %s at %s\n", dev, fs->name, path);

	return VMM_OK;
}
Beispiel #4
0
static int virtio_blk_connect(struct virtio_device *dev, 
			      struct virtio_emulator *emu)
{
	int rc;
	char *attr;
	struct virtio_blk_dev *bdev;

	bdev = vmm_zalloc(sizeof(struct virtio_blk_dev));
	if (!bdev) {
		vmm_printf("Failed to allocate virtio block device....\n");
		return VMM_ENOMEM;
	}
	bdev->vdev = dev;

	bdev->blk_client.notifier_call = &virtio_blk_notification;
	bdev->blk_client.priority = 0;
	rc = vmm_blockdev_register_client(&bdev->blk_client);
	if (rc) {
		vmm_free(bdev);
		return rc;
	}

	INIT_SPIN_LOCK(&bdev->blk_lock);

	attr = vmm_devtree_attrval(dev->edev->node, "blkdev");
	if (attr) {
		if (strlcpy(bdev->blk_name,attr, sizeof(bdev->blk_name)) >=
		    sizeof(bdev->blk_name)) {
			vmm_free(bdev);
			return VMM_EOVERFLOW;
		}
		bdev->blk = vmm_blockdev_find(bdev->blk_name);
	} else {
		bdev->blk_name[0] = 0;
		bdev->blk = NULL;
	}

	bdev->config.capacity = (bdev->blk) ? bdev->blk->num_blocks : 0;
	bdev->config.seg_max = VIRTIO_BLK_DISK_SEG_MAX,
	bdev->config.blk_size = 
		(bdev->blk) ? bdev->blk->block_size : VIRTIO_BLK_SECTOR_SIZE;

	dev->emu_data = bdev;

	return VMM_OK;
}
Beispiel #5
0
int cmd_blockdev_info(struct vmm_chardev *cdev, const char *name)
{
	struct vmm_blockdev *bdev = vmm_blockdev_find(name);

	if (!bdev) {
		vmm_cprintf(cdev, "Error: cannot find blockdev %s\n", name);
		return VMM_EINVALID;
	}

	vmm_cprintf(cdev, "Name       : %s\n", bdev->name);
	vmm_cprintf(cdev, "Parent     : %s\n", 
				(bdev->parent) ? bdev->parent->name : "---");
	vmm_cprintf(cdev, "Description: %s\n", bdev->desc);
	vmm_cprintf(cdev, "Access     : %s\n", 
		(bdev->flags & VMM_BLOCKDEV_RW) ? "Read-Write" : "Read-Only");
	vmm_cprintf(cdev, "Start LBA  : %ll\n", bdev->start_lba);
	vmm_cprintf(cdev, "Block Size : %d\n", bdev->block_size);
	vmm_cprintf(cdev, "Block Count: %ll\n", bdev->num_blocks);

	return VMM_OK;
}