file-posix: Switch to .bdrv_co_ioctl

No real reason to keep using the callback based mechanism here when the
rest of the file-posix driver is coroutine based. Changing it brings
ioctls more in line with how other request types work.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2018-10-31 11:25:18 +01:00
parent c9db2b6489
commit 2f3a7ab39b
4 changed files with 24 additions and 28 deletions

View File

@ -3109,24 +3109,25 @@ hdev_open_Mac_error:
} }
#if defined(__linux__) #if defined(__linux__)
static int coroutine_fn
static BlockAIOCB *hdev_aio_ioctl(BlockDriverState *bs, hdev_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
unsigned long int req, void *buf,
BlockCompletionFunc *cb, void *opaque)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
RawPosixAIOData *acb; RawPosixAIOData *acb;
ThreadPool *pool; ThreadPool *pool;
int ret;
if (fd_open(bs) < 0) ret = fd_open(bs);
return NULL; if (ret < 0) {
return ret;
}
if (req == SG_IO && s->pr_mgr) { if (req == SG_IO && s->pr_mgr) {
struct sg_io_hdr *io_hdr = buf; struct sg_io_hdr *io_hdr = buf;
if (io_hdr->cmdp[0] == PERSISTENT_RESERVE_OUT || if (io_hdr->cmdp[0] == PERSISTENT_RESERVE_OUT ||
io_hdr->cmdp[0] == PERSISTENT_RESERVE_IN) { io_hdr->cmdp[0] == PERSISTENT_RESERVE_IN) {
return pr_manager_execute(s->pr_mgr, bdrv_get_aio_context(bs), return pr_manager_execute(s->pr_mgr, bdrv_get_aio_context(bs),
s->fd, io_hdr, cb, opaque); s->fd, io_hdr);
} }
} }
@ -3138,7 +3139,7 @@ static BlockAIOCB *hdev_aio_ioctl(BlockDriverState *bs,
acb->ioctl.buf = buf; acb->ioctl.buf = buf;
acb->ioctl.cmd = req; acb->ioctl.cmd = req;
pool = aio_get_thread_pool(bdrv_get_aio_context(bs)); pool = aio_get_thread_pool(bdrv_get_aio_context(bs));
return thread_pool_submit_aio(pool, aio_worker, acb, cb, opaque); return thread_pool_submit_co(pool, aio_worker, acb);
} }
#endif /* linux */ #endif /* linux */
@ -3279,7 +3280,7 @@ static BlockDriver bdrv_host_device = {
/* generic scsi device */ /* generic scsi device */
#ifdef __linux__ #ifdef __linux__
.bdrv_aio_ioctl = hdev_aio_ioctl, .bdrv_co_ioctl = hdev_co_ioctl,
#endif #endif
}; };
@ -3401,7 +3402,7 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_lock_medium = cdrom_lock_medium, .bdrv_lock_medium = cdrom_lock_medium,
/* generic scsi device */ /* generic scsi device */
.bdrv_aio_ioctl = hdev_aio_ioctl, .bdrv_co_ioctl = hdev_co_ioctl,
}; };
#endif /* __linux__ */ #endif /* __linux__ */

View File

@ -5,6 +5,7 @@
#include "qapi/visitor.h" #include "qapi/visitor.h"
#include "qom/object_interfaces.h" #include "qom/object_interfaces.h"
#include "block/aio.h" #include "block/aio.h"
#include "qemu/coroutine.h"
#define TYPE_PR_MANAGER "pr-manager" #define TYPE_PR_MANAGER "pr-manager"
@ -37,11 +38,8 @@ typedef struct PRManagerClass {
} PRManagerClass; } PRManagerClass;
bool pr_manager_is_connected(PRManager *pr_mgr); bool pr_manager_is_connected(PRManager *pr_mgr);
BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd,
AioContext *ctx, int fd, struct sg_io_hdr *hdr);
struct sg_io_hdr *hdr,
BlockCompletionFunc *complete,
void *opaque);
PRManager *pr_manager_lookup(const char *id, Error **errp); PRManager *pr_manager_lookup(const char *id, Error **errp);

View File

@ -48,24 +48,21 @@ static int pr_manager_worker(void *opaque)
} }
BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd,
AioContext *ctx, int fd, struct sg_io_hdr *hdr)
struct sg_io_hdr *hdr,
BlockCompletionFunc *complete,
void *opaque)
{ {
PRManagerData *data = g_new(PRManagerData, 1);
ThreadPool *pool = aio_get_thread_pool(ctx); ThreadPool *pool = aio_get_thread_pool(ctx);
PRManagerData data = {
.pr_mgr = pr_mgr,
.fd = fd,
.hdr = hdr,
};
trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1], opaque); trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1]);
data->pr_mgr = pr_mgr;
data->fd = fd;
data->hdr = hdr;
/* The matching object_unref is in pr_manager_worker. */ /* The matching object_unref is in pr_manager_worker. */
object_ref(OBJECT(pr_mgr)); object_ref(OBJECT(pr_mgr));
return thread_pool_submit_aio(pool, pr_manager_worker, return thread_pool_submit_co(pool, pr_manager_worker, &data);
data, complete, opaque);
} }
bool pr_manager_is_connected(PRManager *pr_mgr) bool pr_manager_is_connected(PRManager *pr_mgr)

View File

@ -1,3 +1,3 @@
# scsi/pr-manager.c # scsi/pr-manager.c
pr_manager_execute(int fd, int cmd, int sa, void *opaque) "fd=%d cmd=0x%02x service action=0x%02x opaque=%p" pr_manager_execute(int fd, int cmd, int sa) "fd=%d cmd=0x%02x service action=0x%02x"
pr_manager_run(int fd, int cmd, int sa) "fd=%d cmd=0x%02x service action=0x%02x" pr_manager_run(int fd, int cmd, int sa) "fd=%d cmd=0x%02x service action=0x%02x"