diff options
author | Kevin Wolf <kwolf@redhat.com> | 2019-03-01 22:48:45 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2019-03-12 20:30:14 +0100 |
commit | a6aeca0ca530f104b5a5dd6704fca22b2c5edefa (patch) | |
tree | 63f30f13d284a71712264f51b2b4c7c60272de85 | |
parent | e0c9cf3a484beb746996c0cd63e5585fecb3fd25 (diff) | |
download | qemu-a6aeca0ca530f104b5a5dd6704fca22b2c5edefa.zip |
file-posix: Lock new fd in raw_reopen_prepare()
There is no reason why we can take locks on the new file descriptor only
in raw_reopen_commit() where error handling isn't possible any more.
Instead, we can already do this in raw_reopen_prepare().
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block/file-posix.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/block/file-posix.c b/block/file-posix.c index 6aaee1df16..932cc8e58c 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -906,7 +906,7 @@ static int raw_reopen_prepare(BDRVReopenState *state, BDRVRawState *s; BDRVRawReopenState *rs; QemuOpts *opts; - int ret = 0; + int ret; Error *local_err = NULL; assert(state != NULL); @@ -947,14 +947,27 @@ static int raw_reopen_prepare(BDRVReopenState *state, if (rs->fd != -1) { raw_probe_alignment(state->bs, rs->fd, &local_err); if (local_err) { - qemu_close(rs->fd); - rs->fd = -1; error_propagate(errp, local_err); ret = -EINVAL; + goto out_fd; + } + + /* Copy locks to the new fd */ + ret = raw_apply_lock_bytes(NULL, rs->fd, s->locked_perm, + s->locked_shared_perm, false, errp); + if (ret < 0) { + ret = -EINVAL; + goto out_fd; } } s->reopen_state = state; + ret = 0; +out_fd: + if (ret < 0) { + qemu_close(rs->fd); + rs->fd = -1; + } out: qemu_opts_del(opts); return ret; @@ -964,18 +977,10 @@ static void raw_reopen_commit(BDRVReopenState *state) { BDRVRawReopenState *rs = state->opaque; BDRVRawState *s = state->bs->opaque; - Error *local_err = NULL; s->check_cache_dropped = rs->check_cache_dropped; s->open_flags = rs->open_flags; - /* Copy locks to the new fd before closing the old one. */ - raw_apply_lock_bytes(NULL, rs->fd, s->locked_perm, - s->locked_shared_perm, false, &local_err); - if (local_err) { - /* shouldn't fail in a sane host, but report it just in case. */ - error_report_err(local_err); - } qemu_close(s->fd); s->fd = rs->fd; |