mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
Merge remote-tracking branch 'mreitz/block' into queue-block
* mreitz/block: qemu-img: Print error if check failed block: char devices on FreeBSD are not behind a pager
This commit is contained in:
commit
d4db399b8b
2 changed files with 35 additions and 12 deletions
|
@ -150,6 +150,7 @@ typedef struct BDRVRawState {
|
||||||
bool has_discard:1;
|
bool has_discard:1;
|
||||||
bool has_write_zeroes:1;
|
bool has_write_zeroes:1;
|
||||||
bool discard_zeroes:1;
|
bool discard_zeroes:1;
|
||||||
|
bool needs_alignment;
|
||||||
#ifdef CONFIG_FIEMAP
|
#ifdef CONFIG_FIEMAP
|
||||||
bool skip_fiemap;
|
bool skip_fiemap;
|
||||||
#endif
|
#endif
|
||||||
|
@ -230,7 +231,7 @@ static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
|
||||||
|
|
||||||
/* For /dev/sg devices the alignment is not really used.
|
/* For /dev/sg devices the alignment is not really used.
|
||||||
With buffered I/O, we don't have any restrictions. */
|
With buffered I/O, we don't have any restrictions. */
|
||||||
if (bs->sg || !(s->open_flags & O_DIRECT)) {
|
if (bs->sg || !s->needs_alignment) {
|
||||||
bs->request_alignment = 1;
|
bs->request_alignment = 1;
|
||||||
s->buf_align = 1;
|
s->buf_align = 1;
|
||||||
return;
|
return;
|
||||||
|
@ -446,6 +447,9 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||||
|
|
||||||
s->has_discard = true;
|
s->has_discard = true;
|
||||||
s->has_write_zeroes = true;
|
s->has_write_zeroes = true;
|
||||||
|
if ((bs->open_flags & BDRV_O_NOCACHE) != 0) {
|
||||||
|
s->needs_alignment = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (fstat(s->fd, &st) < 0) {
|
if (fstat(s->fd, &st) < 0) {
|
||||||
error_setg_errno(errp, errno, "Could not stat file");
|
error_setg_errno(errp, errno, "Could not stat file");
|
||||||
|
@ -472,6 +476,17 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
if (S_ISCHR(st.st_mode)) {
|
||||||
|
/*
|
||||||
|
* The file is a char device (disk), which on FreeBSD isn't behind
|
||||||
|
* a pager, so force all requests to be aligned. This is needed
|
||||||
|
* so QEMU makes sure all IO operations on the device are aligned
|
||||||
|
* to sector size, or else FreeBSD will reject them with EINVAL.
|
||||||
|
*/
|
||||||
|
s->needs_alignment = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_XFS
|
#ifdef CONFIG_XFS
|
||||||
if (platform_test_xfs_fd(s->fd)) {
|
if (platform_test_xfs_fd(s->fd)) {
|
||||||
|
@ -1076,11 +1091,12 @@ static BlockAIOCB *raw_aio_submit(BlockDriverState *bs,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If O_DIRECT is used the buffer needs to be aligned on a sector
|
* Check if the underlying device requires requests to be aligned,
|
||||||
* boundary. Check if this is the case or tell the low-level
|
* and if the request we are trying to submit is aligned or not.
|
||||||
* driver that it needs to copy the buffer.
|
* If this is the case tell the low-level driver that it needs
|
||||||
|
* to copy the buffer.
|
||||||
*/
|
*/
|
||||||
if ((bs->open_flags & BDRV_O_NOCACHE)) {
|
if (s->needs_alignment) {
|
||||||
if (!bdrv_qiov_is_aligned(bs, qiov)) {
|
if (!bdrv_qiov_is_aligned(bs, qiov)) {
|
||||||
type |= QEMU_AIO_MISALIGNED;
|
type |= QEMU_AIO_MISALIGNED;
|
||||||
#ifdef CONFIG_LINUX_AIO
|
#ifdef CONFIG_LINUX_AIO
|
||||||
|
|
|
@ -687,6 +687,7 @@ static int img_check(int argc, char **argv)
|
||||||
check->corruptions_fixed = corruptions_fixed;
|
check->corruptions_fixed = corruptions_fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
switch (output_format) {
|
switch (output_format) {
|
||||||
case OFORMAT_HUMAN:
|
case OFORMAT_HUMAN:
|
||||||
dump_human_image_check(check, quiet);
|
dump_human_image_check(check, quiet);
|
||||||
|
@ -695,8 +696,14 @@ static int img_check(int argc, char **argv)
|
||||||
dump_json_image_check(check, quiet);
|
dump_json_image_check(check, quiet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ret || check->check_errors) {
|
if (ret || check->check_errors) {
|
||||||
|
if (ret) {
|
||||||
|
error_report("Check failed: %s", strerror(-ret));
|
||||||
|
} else {
|
||||||
|
error_report("Check failed");
|
||||||
|
}
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue