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); }
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; }
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; }
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; }