From e05e51a987b384eca913806ba306d3be70ccb57b Mon Sep 17 00:00:00 2001 From: Adygzhy Ondar Date: Mon, 6 Jun 2016 00:57:48 +0300 Subject: [PATCH] lkl: Convert union lkl_disk to struct, add lkl_disk_remove function --- tools/lkl/cptofs.c | 4 ++-- tools/lkl/fs2tar.c | 4 ++-- tools/lkl/include/lkl.h | 22 ++++++++++++++++++---- tools/lkl/include/lkl_host.h | 4 ++-- tools/lkl/lib/nt-host.c | 4 ++-- tools/lkl/lib/posix-host.c | 6 +++--- tools/lkl/lib/virtio_blk.c | 23 +++++++++++++++++++---- tools/lkl/lklfuse.c | 4 ++-- tools/lkl/tests/boot.c | 5 +++-- 9 files changed, 53 insertions(+), 23 deletions(-) diff --git a/tools/lkl/cptofs.c b/tools/lkl/cptofs.c index 8fbe3d11b92ddc..37133c7f8f11ad 100644 --- a/tools/lkl/cptofs.c +++ b/tools/lkl/cptofs.c @@ -399,7 +399,7 @@ static int searchdir(const char *src, const char *dst, const char *match) int main(int argc, char **argv) { - union lkl_disk disk; + struct lkl_disk disk; long ret; char mpoint[32], src_path[PATH_MAX], dst_path[PATH_MAX]; char *src_path_dir, *src_path_base; @@ -426,7 +426,7 @@ int main(int argc, char **argv) goto out; } - ret = lkl_disk_add(disk); + ret = lkl_disk_add(&disk); if (ret < 0) { fprintf(stderr, "can't add disk: %s\n", lkl_strerror(ret)); goto out_close; diff --git a/tools/lkl/fs2tar.c b/tools/lkl/fs2tar.c index 7a1a73483c98a0..211bf0f58ad996 100644 --- a/tools/lkl/fs2tar.c +++ b/tools/lkl/fs2tar.c @@ -334,7 +334,7 @@ static int searchdir(const char *fsimg_path, const char *path) int main(int argc, char **argv) { - union lkl_disk disk; + struct lkl_disk disk; long ret; char mpoint[32]; unsigned int disk_id; @@ -353,7 +353,7 @@ int main(int argc, char **argv) goto out; } - ret = lkl_disk_add(disk); + ret = lkl_disk_add(&disk); if (ret < 0) { fprintf(stderr, "can't add disk: %s\n", lkl_strerror(ret)); goto out_close; diff --git a/tools/lkl/include/lkl.h b/tools/lkl/include/lkl.h index b000286d0dc33c..23e3d11fcef717 100644 --- a/tools/lkl/include/lkl.h +++ b/tools/lkl/include/lkl.h @@ -72,12 +72,16 @@ void lkl_perror(char *msg, int err); /** * lkl_disk - host disk handle * + * @dev - a pointer to 'virtio_blk_dev' structure for this disk * @fd - a POSIX file descriptor that can be used by preadv/pwritev * @handle - an NT file handle that can be used by ReadFile/WriteFile */ -union lkl_disk { - int fd; - void *handle; +struct lkl_disk { + void *dev; + union { + int fd; + void *handle; + }; }; /** @@ -88,7 +92,17 @@ union lkl_disk { * @disk - the host disk handle * @returns a disk id (0 is valid) or a strictly negative value in case of error */ -int lkl_disk_add(union lkl_disk disk); +int lkl_disk_add(struct lkl_disk *disk); + +/** + * lkl_disk_remove - remove a disk + * + * This function makes a cleanup of the @disk's virtio_dev structure + * that was initialized by lkl_disk_add before. + * + * @disk - the host disk handle + */ +void lkl_disk_remove(struct lkl_disk disk); /** * lkl_mount_dev - mount a disk diff --git a/tools/lkl/include/lkl_host.h b/tools/lkl/include/lkl_host.h index 3e9f65ae6678a8..2ccaa90153c22d 100644 --- a/tools/lkl/include/lkl_host.h +++ b/tools/lkl/include/lkl_host.h @@ -40,11 +40,11 @@ struct lkl_blk_req { }; struct lkl_dev_blk_ops { - int (*get_capacity)(union lkl_disk disk, unsigned long long *res); + int (*get_capacity)(struct lkl_disk disk, unsigned long long *res); #define LKL_DEV_BLK_STATUS_OK 0 #define LKL_DEV_BLK_STATUS_IOERR 1 #define LKL_DEV_BLK_STATUS_UNSUP 2 - int (*request)(union lkl_disk disk, struct lkl_blk_req *req); + int (*request)(struct lkl_disk disk, struct lkl_blk_req *req); }; struct lkl_netdev { diff --git a/tools/lkl/lib/nt-host.c b/tools/lkl/lib/nt-host.c index d4af1f55c234e6..f6c04624117c69 100644 --- a/tools/lkl/lib/nt-host.c +++ b/tools/lkl/lib/nt-host.c @@ -237,7 +237,7 @@ struct lkl_host_operations lkl_host_ops = { .gettid = gettid, }; -int handle_get_capacity(union lkl_disk disk, unsigned long long *res) +int handle_get_capacity(struct lkl_disk disk, unsigned long long *res) { LARGE_INTEGER tmp; @@ -248,7 +248,7 @@ int handle_get_capacity(union lkl_disk disk, unsigned long long *res) return 0; } -static int blk_request(union lkl_disk disk, struct lkl_blk_req *req) +static int blk_request(struct lkl_disk disk, struct lkl_blk_req *req) { unsigned long long offset = req->sector * 512; OVERLAPPED ov = { 0, }; diff --git a/tools/lkl/lib/posix-host.c b/tools/lkl/lib/posix-host.c index 0d5f21136f0f5b..e18c051fd1bda6 100644 --- a/tools/lkl/lib/posix-host.c +++ b/tools/lkl/lib/posix-host.c @@ -326,7 +326,7 @@ struct lkl_host_operations lkl_host_ops = { .gettid = _gettid, }; -static int fd_get_capacity(union lkl_disk disk, unsigned long long *res) +static int fd_get_capacity(struct lkl_disk disk, unsigned long long *res) { off_t off; @@ -338,7 +338,7 @@ static int fd_get_capacity(union lkl_disk disk, unsigned long long *res) return 0; } -static int do_rw(ssize_t (*fn)(), union lkl_disk disk, struct lkl_blk_req *req) +static int do_rw(ssize_t (*fn)(), struct lkl_disk disk, struct lkl_blk_req *req) { off_t off = req->sector * 512; void *addr; @@ -370,7 +370,7 @@ static int do_rw(ssize_t (*fn)(), union lkl_disk disk, struct lkl_blk_req *req) return ret; } -static int blk_request(union lkl_disk disk, struct lkl_blk_req *req) +static int blk_request(struct lkl_disk disk, struct lkl_blk_req *req) { int err = 0; diff --git a/tools/lkl/lib/virtio_blk.c b/tools/lkl/lib/virtio_blk.c index d712a410e9a531..023d0b435296cc 100644 --- a/tools/lkl/lib/virtio_blk.c +++ b/tools/lkl/lib/virtio_blk.c @@ -6,7 +6,7 @@ struct virtio_blk_dev { struct virtio_dev dev; struct lkl_virtio_blk_config config; struct lkl_dev_blk_ops *ops; - union lkl_disk disk; + struct lkl_disk disk; }; struct virtio_blk_req_trailer { @@ -67,7 +67,8 @@ static struct virtio_dev_ops blk_ops = { .enqueue = blk_enqueue, }; -int lkl_disk_add(union lkl_disk disk) + +int lkl_disk_add(struct lkl_disk *disk) { struct virtio_blk_dev *dev; unsigned long long capacity; @@ -78,6 +79,8 @@ int lkl_disk_add(union lkl_disk disk) if (!dev) return -LKL_ENOMEM; + disk->dev = dev; + dev->dev.device_id = LKL_VIRTIO_ID_BLOCK; dev->dev.vendor_id = 0; dev->dev.device_features = 0; @@ -86,9 +89,9 @@ int lkl_disk_add(union lkl_disk disk) dev->dev.config_len = sizeof(dev->config); dev->dev.ops = &blk_ops; dev->ops = &lkl_dev_blk_ops; - dev->disk = disk; + dev->disk = *disk; - ret = dev->ops->get_capacity(disk, &capacity); + ret = dev->ops->get_capacity(*disk, &capacity); if (ret) { ret = -LKL_ENOMEM; goto out_free; @@ -106,3 +109,15 @@ int lkl_disk_add(union lkl_disk disk) return ret; } + +void lkl_disk_remove(struct lkl_disk disk) +{ + struct virtio_blk_dev *dev; + + dev = (struct virtio_blk_dev *)disk.dev; + if (!dev) + return; + + virtio_dev_cleanup(&dev->dev); + lkl_host_ops.mem_free(dev); +} diff --git a/tools/lkl/lklfuse.c b/tools/lkl/lklfuse.c index e9871d33c99ba0..d6730a28c1e021 100644 --- a/tools/lkl/lklfuse.c +++ b/tools/lkl/lklfuse.c @@ -20,7 +20,7 @@ struct lklfuse { const char *file; const char *log; const char *type; - union lkl_disk disk; + struct lkl_disk disk; int disk_id; int ro; int mb; @@ -585,7 +585,7 @@ int main(int argc, char **argv) lklfuse.disk.fd = ret; - ret = lkl_disk_add(lklfuse.disk); + ret = lkl_disk_add(&lklfuse.disk); if (ret < 0) { fprintf(stderr, "can't add disk: %s\n", lkl_strerror(ret)); goto out_close_disk; diff --git a/tools/lkl/tests/boot.c b/tools/lkl/tests/boot.c index a43a58f8626c06..885f9f96d38ea7 100644 --- a/tools/lkl/tests/boot.c +++ b/tools/lkl/tests/boot.c @@ -276,7 +276,7 @@ int test_stat(char *str, int len) return TEST_FAILURE; } -static union lkl_disk disk; +static struct lkl_disk disk; static int disk_id = -1; int test_disk_add(char *str, int len) @@ -291,7 +291,7 @@ int test_disk_add(char *str, int len) #endif goto out_unlink; - disk_id = lkl_disk_add(disk); + disk_id = lkl_disk_add(&disk); if (disk_id < 0) goto out_close; @@ -821,6 +821,7 @@ int main(int argc, char **argv) lkl_sys_halt(); + lkl_disk_remove(disk); close(disk.fd); return g_test_pass;