Commit a6aeca0c authored by Kevin Wolf's avatar Kevin Wolf
Browse files

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: default avatarKevin Wolf <kwolf@redhat.com>
parent e0c9cf3a
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -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;