From 1787cd88f968426a3f8a447408ed03f7778dc18a Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 15 Mar 2019 18:10:06 +0100 Subject: [PATCH 010/163] file-posix: Factor out raw_reconfigure_getfd() RH-Author: Kevin Wolf Message-id: <20190315181010.14964-11-kwolf@redhat.com> Patchwork-id: 84887 O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 10/14] file-posix: Factor out raw_reconfigure_getfd() Bugzilla: 1685989 RH-Acked-by: John Snow RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Miroslav Rezanina Signed-off-by: Kevin Wolf (cherry picked from commit 5cec28702587d8dc9792f8274bfc6bb91f07d672) Signed-off-by: Kevin Wolf Signed-off-by: Miroslav Rezanina --- block/file-posix.c | 87 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 419781c..e50eb0e 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -834,35 +834,24 @@ static int raw_handle_perm_lock(BlockDriverState *bs, return ret; } -static int raw_reopen_prepare(BDRVReopenState *state, - BlockReopenQueue *queue, Error **errp) +static int raw_reconfigure_getfd(BlockDriverState *bs, int flags, + int *open_flags, Error **errp) { - BDRVRawState *s; - BDRVRawReopenState *rs; - int ret = 0; - Error *local_err = NULL; - - assert(state != NULL); - assert(state->bs != NULL); - - s = state->bs->opaque; - - state->opaque = g_new0(BDRVRawReopenState, 1); - rs = state->opaque; - - if (s->type == FTYPE_CD) { - rs->open_flags |= O_NONBLOCK; - } - - raw_parse_flags(state->flags, &rs->open_flags); - - rs->fd = -1; - + BDRVRawState *s = bs->opaque; + int fd = -1; + int ret; int fcntl_flags = O_APPEND | O_NONBLOCK; #ifdef O_NOATIME fcntl_flags |= O_NOATIME; #endif + *open_flags = 0; + if (s->type == FTYPE_CD) { + *open_flags |= O_NONBLOCK; + } + + raw_parse_flags(flags, open_flags); + #ifdef O_ASYNC /* Not all operating systems have O_ASYNC, and those that don't * will not let us track the state into rs->open_flags (typically @@ -872,32 +861,59 @@ static int raw_reopen_prepare(BDRVReopenState *state, assert((s->open_flags & O_ASYNC) == 0); #endif - if ((rs->open_flags & ~fcntl_flags) == (s->open_flags & ~fcntl_flags)) { + if ((*open_flags & ~fcntl_flags) == (s->open_flags & ~fcntl_flags)) { /* dup the original fd */ - rs->fd = qemu_dup(s->fd); - if (rs->fd >= 0) { - ret = fcntl_setfl(rs->fd, rs->open_flags); + fd = qemu_dup(s->fd); + if (fd >= 0) { + ret = fcntl_setfl(fd, *open_flags); if (ret) { - qemu_close(rs->fd); - rs->fd = -1; + qemu_close(fd); + fd = -1; } } } /* If we cannot use fcntl, or fcntl failed, fall back to qemu_open() */ - if (rs->fd == -1) { - const char *normalized_filename = state->bs->filename; + if (fd == -1) { + const char *normalized_filename = bs->filename; ret = raw_normalize_devicepath(&normalized_filename, errp); if (ret >= 0) { - assert(!(rs->open_flags & O_CREAT)); - rs->fd = qemu_open(normalized_filename, rs->open_flags); - if (rs->fd == -1) { + assert(!(*open_flags & O_CREAT)); + fd = qemu_open(normalized_filename, *open_flags); + if (fd == -1) { error_setg_errno(errp, errno, "Could not reopen file"); - ret = -1; + return -1; } } } + return fd; +} + +static int raw_reopen_prepare(BDRVReopenState *state, + BlockReopenQueue *queue, Error **errp) +{ + BDRVRawState *s; + BDRVRawReopenState *rs; + int ret = 0; + Error *local_err = NULL; + + assert(state != NULL); + assert(state->bs != NULL); + + s = state->bs->opaque; + + state->opaque = g_new0(BDRVRawReopenState, 1); + rs = state->opaque; + + rs->fd = raw_reconfigure_getfd(state->bs, state->flags, &rs->open_flags, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret = -1; + goto out; + } + /* Fail already reopen_prepare() if we can't get a working O_DIRECT * alignment with the new fd. */ if (rs->fd != -1) { @@ -910,6 +926,7 @@ static int raw_reopen_prepare(BDRVReopenState *state, } } +out: return ret; } -- 1.8.3.1