static int register_aio_file(const char *path) { struct ns_entry *entry; int flags, fd; uint64_t size; uint32_t blklen; if (g_rw_percentage == 100) { flags = O_RDONLY; } else if (g_rw_percentage == 0) { flags = O_WRONLY; } else { flags = O_RDWR; } flags |= O_DIRECT; fd = open(path, flags); if (fd < 0) { fprintf(stderr, "Could not open AIO device %s: %s\n", path, strerror(errno)); return -1; } size = spdk_fd_get_size(fd); if (size == 0) { fprintf(stderr, "Could not determine size of AIO device %s\n", path); close(fd); return -1; } blklen = spdk_fd_get_blocklen(fd); if (blklen == 0) { fprintf(stderr, "Could not determine block size of AIO device %s\n", path); close(fd); return -1; } entry = malloc(sizeof(struct ns_entry)); if (entry == NULL) { close(fd); perror("aio ns_entry malloc"); return -1; } entry->type = ENTRY_TYPE_AIO_FILE; entry->u.aio.fd = fd; entry->size_in_ios = size / g_io_size_bytes; entry->io_size_blocks = g_io_size_bytes / blklen; snprintf(entry->name, sizeof(entry->name), "%s", path); g_num_namespaces++; entry->next = g_namespaces; g_namespaces = entry; return 0; }
static int register_aio_file(const char *path) { struct ns_entry *entry; int fd; uint64_t size; uint32_t blklen; fd = open(path, O_RDWR | O_DIRECT); if (fd < 0) { fprintf(stderr, "Could not open AIO device %s: %s\n", path, strerror(errno)); return -1; } size = spdk_fd_get_size(fd); if (size == 0) { fprintf(stderr, "Could not determine size of AIO device %s\n", path); close(fd); return -1; } blklen = spdk_fd_get_blocklen(fd); if (blklen == 0) { fprintf(stderr, "Could not determine block size of AIO device %s\n", path); close(fd); return -1; } entry = calloc(1, sizeof(struct ns_entry)); if (entry == NULL) { close(fd); perror("aio ns_entry malloc"); return -1; } entry->type = ENTRY_TYPE_AIO_FILE; entry->u.aio.fd = fd; entry->size_in_ios = size / g_io_size_bytes; entry->io_size_blocks = g_io_size_bytes / blklen; snprintf(entry->name, sizeof(entry->name), "%s", path); g_ns = entry; return 0; }
struct spdk_bdev * create_aio_disk(char *fname) { struct file_disk *fdisk; fdisk = calloc(sizeof(*fdisk), 1); if (!fdisk) { SPDK_ERRLOG("Unable to allocate enough memory for aio backend\n"); return NULL; } fdisk->file = fname; if (blockdev_aio_open(fdisk)) { SPDK_ERRLOG("Unable to open file %s. fd: %d errno: %d\n", fname, fdisk->fd, errno); goto error_return; } fdisk->size = spdk_fd_get_size(fdisk->fd); TAILQ_INIT(&fdisk->sync_completion_list); snprintf(fdisk->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "AIO%d", g_blockdev_count); snprintf(fdisk->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "AIO disk"); fdisk->disk.need_aligned_buffer = 1; fdisk->disk.write_cache = 1; fdisk->disk.blocklen = spdk_fd_get_blocklen(fdisk->fd); fdisk->disk.blockcnt = fdisk->size / fdisk->disk.blocklen; fdisk->disk.ctxt = fdisk; fdisk->disk.fn_table = &aio_fn_table; g_blockdev_count++; spdk_io_device_register(&fdisk->disk, blockdev_aio_create_cb, blockdev_aio_destroy_cb, sizeof(struct blockdev_aio_io_channel)); spdk_bdev_register(&fdisk->disk); return &fdisk->disk; error_return: blockdev_aio_close(fdisk); aio_free_disk(fdisk); return NULL; }