diff options
| author | Peter Maydell | 2016-06-08 18:17:16 +0200 |
|---|---|---|
| committer | Peter Maydell | 2016-06-08 18:17:16 +0200 |
| commit | 6f50f25c825fbd0edd2dc43b9a63edfecfd4a3e9 (patch) | |
| tree | 80fee285db6153395963b01591d27d5053c1ec4c /blockdev.c | |
| parent | Merge remote-tracking branch 'remotes/famz/tags/pull-docker-20160608' into st... (diff) | |
| parent | qemu-img bench: Add --flush-interval (diff) | |
| download | qemu-6f50f25c825fbd0edd2dc43b9a63edfecfd4a3e9.tar.gz qemu-6f50f25c825fbd0edd2dc43b9a63edfecfd4a3e9.tar.xz qemu-6f50f25c825fbd0edd2dc43b9a63edfecfd4a3e9.zip | |
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer patches
# gpg: Signature made Wed 08 Jun 2016 09:31:38 BST
# gpg: using RSA key 0x7F09B272C88F2FD6
# gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>"
* remotes/kevin/tags/for-upstream: (31 commits)
qemu-img bench: Add --flush-interval
qemu-img bench: Implement -S (step size)
qemu-img bench: Make start offset configurable
qemu-img bench: Sequential writes
qemu-img bench
block: Don't emulate natively supported pwritev flags
blockdev: clean up error handling in do_open_tray
block: Fix bdrv_all_delete_snapshot() error handling
qcow2: avoid extra flushes in qcow2
raw-posix: Fetch max sectors for host block device
block: assert that bs->request_alignment is a power of 2
migration/block: Convert saving to BlockBackend
migration/block: Convert load to BlockBackend
block: Kill bdrv_co_write_zeroes()
vmdk: Convert to bdrv_co_pwrite_zeroes()
raw_bsd: Convert to bdrv_co_pwrite_zeroes()
raw-posix: Convert to bdrv_co_pwrite_zeroes()
qed: Convert to bdrv_co_pwrite_zeroes()
gluster: Convert to bdrv_co_pwrite_zeroes()
blkreplay: Convert to bdrv_co_pwrite_zeroes()
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'blockdev.c')
| -rw-r--r-- | blockdev.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/blockdev.c b/blockdev.c index 6ccb8e1f84..7fd515a4fa 100644 --- a/blockdev.c +++ b/blockdev.c @@ -56,6 +56,8 @@ static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states = QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states); +static int do_open_tray(const char *device, bool force, Error **errp); + static const char *const if_name[IF_COUNT] = { [IF_NONE] = "none", [IF_IDE] = "ide", @@ -2274,8 +2276,6 @@ exit: block_job_txn_unref(block_job_txn); } -static int do_open_tray(const char *device, bool force, Error **errp); - void qmp_eject(const char *device, bool has_force, bool force, Error **errp) { Error *local_err = NULL; @@ -2286,16 +2286,11 @@ void qmp_eject(const char *device, bool has_force, bool force, Error **errp) } rc = do_open_tray(device, force, &local_err); - if (local_err) { + if (rc && rc != -ENOSYS) { error_propagate(errp, local_err); return; } - - if (rc == EINPROGRESS) { - error_setg(errp, "Device '%s' is locked and force was not specified, " - "wait for tray to open and try again", device); - return; - } + error_free(local_err); qmp_x_blockdev_remove_medium(device, errp); } @@ -2324,11 +2319,16 @@ void qmp_block_passwd(bool has_device, const char *device, aio_context_release(aio_context); } -/** - * returns -errno on fatal error, +errno for non-fatal situations. - * errp will always be set when the return code is negative. - * May return +ENOSYS if the device has no tray, - * or +EINPROGRESS if the tray is locked and the guest has been notified. +/* + * Attempt to open the tray of @device. + * If @force, ignore its tray lock. + * Else, if the tray is locked, don't open it, but ask the guest to open it. + * On error, store an error through @errp and return -errno. + * If @device does not exist, return -ENODEV. + * If it has no removable media, return -ENOTSUP. + * If it has no tray, return -ENOSYS. + * If the guest was asked to open the tray, return -EINPROGRESS. + * Else, return 0. */ static int do_open_tray(const char *device, bool force, Error **errp) { @@ -2348,8 +2348,8 @@ static int do_open_tray(const char *device, bool force, Error **errp) } if (!blk_dev_has_tray(blk)) { - /* Ignore this command on tray-less devices */ - return ENOSYS; + error_setg(errp, "Device '%s' does not have a tray", device); + return -ENOSYS; } if (blk_dev_is_tray_open(blk)) { @@ -2366,7 +2366,9 @@ static int do_open_tray(const char *device, bool force, Error **errp) } if (locked && !force) { - return EINPROGRESS; + error_setg(errp, "Device '%s' is locked and force was not specified, " + "wait for tray to open and try again", device); + return -EINPROGRESS; } return 0; @@ -2375,10 +2377,18 @@ static int do_open_tray(const char *device, bool force, Error **errp) void qmp_blockdev_open_tray(const char *device, bool has_force, bool force, Error **errp) { + Error *local_err = NULL; + int rc; + if (!has_force) { force = false; } - do_open_tray(device, force, errp); + rc = do_open_tray(device, force, &local_err); + if (rc && rc != -ENOSYS && rc != -EINPROGRESS) { + error_propagate(errp, local_err); + return; + } + error_free(local_err); } void qmp_blockdev_close_tray(const char *device, Error **errp) |
