mirror of https://gitee.com/openkylin/qemu.git
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__)
|
#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__ */
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue