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:
parent
c9db2b6489
commit
2f3a7ab39b
@ -3109,24 +3109,25 @@ hdev_open_Mac_error:
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
|
||||
static BlockAIOCB *hdev_aio_ioctl(BlockDriverState *bs,
|
||||
unsigned long int req, void *buf,
|
||||
BlockCompletionFunc *cb, void *opaque)
|
||||
static int coroutine_fn
|
||||
hdev_co_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
|
||||
{
|
||||
BDRVRawState *s = bs->opaque;
|
||||
RawPosixAIOData *acb;
|
||||
ThreadPool *pool;
|
||||
int ret;
|
||||
|
||||
if (fd_open(bs) < 0)
|
||||
return NULL;
|
||||
ret = fd_open(bs);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (req == SG_IO && s->pr_mgr) {
|
||||
struct sg_io_hdr *io_hdr = buf;
|
||||
if (io_hdr->cmdp[0] == PERSISTENT_RESERVE_OUT ||
|
||||
io_hdr->cmdp[0] == PERSISTENT_RESERVE_IN) {
|
||||
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.cmd = req;
|
||||
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 */
|
||||
|
||||
@ -3279,7 +3280,7 @@ static BlockDriver bdrv_host_device = {
|
||||
|
||||
/* generic scsi device */
|
||||
#ifdef __linux__
|
||||
.bdrv_aio_ioctl = hdev_aio_ioctl,
|
||||
.bdrv_co_ioctl = hdev_co_ioctl,
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -3401,7 +3402,7 @@ static BlockDriver bdrv_host_cdrom = {
|
||||
.bdrv_lock_medium = cdrom_lock_medium,
|
||||
|
||||
/* generic scsi device */
|
||||
.bdrv_aio_ioctl = hdev_aio_ioctl,
|
||||
.bdrv_co_ioctl = hdev_co_ioctl,
|
||||
};
|
||||
#endif /* __linux__ */
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "qapi/visitor.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "block/aio.h"
|
||||
#include "qemu/coroutine.h"
|
||||
|
||||
#define TYPE_PR_MANAGER "pr-manager"
|
||||
|
||||
@ -37,11 +38,8 @@ typedef struct PRManagerClass {
|
||||
} PRManagerClass;
|
||||
|
||||
bool pr_manager_is_connected(PRManager *pr_mgr);
|
||||
BlockAIOCB *pr_manager_execute(PRManager *pr_mgr,
|
||||
AioContext *ctx, int fd,
|
||||
struct sg_io_hdr *hdr,
|
||||
BlockCompletionFunc *complete,
|
||||
void *opaque);
|
||||
int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd,
|
||||
struct sg_io_hdr *hdr);
|
||||
|
||||
PRManager *pr_manager_lookup(const char *id, Error **errp);
|
||||
|
||||
|
@ -48,24 +48,21 @@ static int pr_manager_worker(void *opaque)
|
||||
}
|
||||
|
||||
|
||||
BlockAIOCB *pr_manager_execute(PRManager *pr_mgr,
|
||||
AioContext *ctx, int fd,
|
||||
struct sg_io_hdr *hdr,
|
||||
BlockCompletionFunc *complete,
|
||||
void *opaque)
|
||||
int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd,
|
||||
struct sg_io_hdr *hdr)
|
||||
{
|
||||
PRManagerData *data = g_new(PRManagerData, 1);
|
||||
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);
|
||||
data->pr_mgr = pr_mgr;
|
||||
data->fd = fd;
|
||||
data->hdr = hdr;
|
||||
trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1]);
|
||||
|
||||
/* The matching object_unref is in pr_manager_worker. */
|
||||
object_ref(OBJECT(pr_mgr));
|
||||
return thread_pool_submit_aio(pool, pr_manager_worker,
|
||||
data, complete, opaque);
|
||||
return thread_pool_submit_co(pool, pr_manager_worker, &data);
|
||||
}
|
||||
|
||||
bool pr_manager_is_connected(PRManager *pr_mgr)
|
||||
|
@ -1,3 +1,3 @@
|
||||
# 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"
|
||||
|
Loading…
Reference in New Issue
Block a user