migration: remove the QEMUFileOps 'shut_down' callback

This directly implements the shutdown logic using QIOChannel APIs.

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2022-06-20 12:01:59 +01:00 committed by Dr. David Alan Gilbert
parent 0f58c3fcc7
commit d3c581b750
3 changed files with 10 additions and 40 deletions

View File

@ -112,31 +112,6 @@ static int channel_close(void *opaque, Error **errp)
}
static int channel_shutdown(void *opaque,
bool rd,
bool wr,
Error **errp)
{
QIOChannel *ioc = QIO_CHANNEL(opaque);
if (qio_channel_has_feature(ioc,
QIO_CHANNEL_FEATURE_SHUTDOWN)) {
QIOChannelShutdown mode;
if (rd && wr) {
mode = QIO_CHANNEL_SHUTDOWN_BOTH;
} else if (rd) {
mode = QIO_CHANNEL_SHUTDOWN_READ;
} else {
mode = QIO_CHANNEL_SHUTDOWN_WRITE;
}
if (qio_channel_shutdown(ioc, mode, errp) < 0) {
return -EIO;
}
}
return 0;
}
static int channel_set_blocking(void *opaque,
bool enabled,
Error **errp)
@ -166,7 +141,6 @@ static QEMUFile *channel_get_output_return_path(void *opaque)
static const QEMUFileOps channel_input_ops = {
.get_buffer = channel_get_buffer,
.close = channel_close,
.shut_down = channel_shutdown,
.set_blocking = channel_set_blocking,
.get_return_path = channel_get_input_return_path,
};
@ -175,7 +149,6 @@ static const QEMUFileOps channel_input_ops = {
static const QEMUFileOps channel_output_ops = {
.writev_buffer = channel_writev_buffer,
.close = channel_close,
.shut_down = channel_shutdown,
.set_blocking = channel_set_blocking,
.get_return_path = channel_get_output_return_path,
};

View File

@ -71,16 +71,23 @@ struct QEMUFile {
/*
* Stop a file from being read/written - not all backing files can do this
* typically only sockets can.
*
* TODO: convert to propagate Error objects instead of squashing
* to a fixed errno value
*/
int qemu_file_shutdown(QEMUFile *f)
{
int ret;
int ret = 0;
f->shutdown = true;
if (!f->ops->shut_down) {
if (!qio_channel_has_feature(f->ioc,
QIO_CHANNEL_FEATURE_SHUTDOWN)) {
return -ENOSYS;
}
ret = f->ops->shut_down(f->ioc, true, true, NULL);
if (qio_channel_shutdown(f->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL) < 0) {
ret = -EIO;
}
if (!f->last_error) {
qemu_file_set_error(f, -EIO);

View File

@ -89,22 +89,12 @@ typedef size_t (QEMURamSaveFunc)(QEMUFile *f,
*/
typedef QEMUFile *(QEMURetPathFunc)(void *opaque);
/*
* Stop any read or write (depending on flags) on the underlying
* transport on the QEMUFile.
* Existing blocking reads/writes must be woken
* Returns 0 on success, -err on error
*/
typedef int (QEMUFileShutdownFunc)(void *opaque, bool rd, bool wr,
Error **errp);
typedef struct QEMUFileOps {
QEMUFileGetBufferFunc *get_buffer;
QEMUFileCloseFunc *close;
QEMUFileSetBlocking *set_blocking;
QEMUFileWritevBufferFunc *writev_buffer;
QEMURetPathFunc *get_return_path;
QEMUFileShutdownFunc *shut_down;
} QEMUFileOps;
typedef struct QEMUFileHooks {