mirror of https://github.com/xemu-project/xemu.git
Block layer patches
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZ8dz+AAoJEH8JsnLIjy/WuxUP/Rt4LpvwO8d22z0EOAbXkE4z 9KD9AdFvr5lLc+ZkwE29txsN6paZ9LGFpO5Nd1XnkbbAMLHarC0H+chioF861pei WZ38PLRWvTM8FCP3/pGAwcHYQ4rOMdYWqx3EQNPS+wfypl6nrBnXMJhmia4C2Yu7 6+jhJ6xh49SvjgixvMVuhwdL3DWyX2t/qdAif3It6CWY3BgQWltSmIlpKO/6OqE4 7KIaTSHwz7Fi3oWKZLIXiuJ/W4hruMb3J+beAHS/yKPSX3yQ5PwlMz8NI86SF8JR e3veiXHrNLySfVLi34A9AsLL/KLxyXk8we/PHGB0MEzTkFU8FiRPaEPoZW9Balle /2Xp4w4DSQXgWnfNa2Yn5ShwHVgEbvmRxwFT1LoYch+9k0FREoueiPHrlWKFkA1p Rgg12h2C1fJlMMMkg2fr6JQ09fkINnMTHJgQ+T235affTTPFLoZKlBYYeU2VjANP G41MLzHUuoGMxcZgQ/nyzVrvI3muI8fPU8karUwFGmpQoF0XWuD/HlS0GRY5xVnZ Cmo4oTNJK3DJHgDDoYp7/SFy95VGF0Ui1Zp+PtV/HeLKwxjmaj2wdJFpAb7k61c1 /Ss3K+pF6Qkn1x5SlI8U9U1So9BOkjqE0F2TjS04UYzlpFPk1Bm+tfuL6sGMn8AJ et4jgueuBzux/cszMS/g =4jsy -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging Block layer patches # gpg: Signature made Thu 26 Oct 2017 14:02:54 BST # gpg: using RSA key 0x7F09B272C88F2FD6 # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: (35 commits) iotests: Add cluster_size=64k to 125 qcow2: Always execute preallocate() in a coroutine qcow2: Fix unaligned preallocated truncation qcow2: Emit errp when truncating the image tail iotests: Filter actual image size in 184 and 191 iotests: Pull _filter_actual_image_size from 67/87 iotests: Add test for dataplane mirroring qcow2: Use BDRV_SECTOR_BITS instead of its literal value qemu-img.1: Image invalidation on qemu-img commit qemu-io: Relax 'alloc' now that block-status doesn't assert qcow2: Reduce is_zero() rounding block: Reduce bdrv_aligned_preadv() rounding block: Align block status requests qemu-img: Change img_compare() to be byte-based qemu-img: Change img_rebase() to be byte-based qemu-img: Change compare_sectors() to be byte-based qemu-img: Change check_empty_sectors() to byte-based qemu-img: Drop redundant error message in compare qemu-img: Add find_nonzero() qemu-img: Speed up compare on pre-allocated larger file ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
46f63e5b88
3
block.c
3
block.c
|
@ -2245,7 +2245,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
||||||
goto free_exit;
|
goto free_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
|
if (!reference &&
|
||||||
|
bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
|
||||||
qdict_put_str(options, "driver", bs->backing_format);
|
qdict_put_str(options, "driver", bs->backing_format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -627,6 +627,17 @@ static int coroutine_fn blkdebug_co_pdiscard(BlockDriverState *bs,
|
||||||
return bdrv_co_pdiscard(bs->file->bs, offset, bytes);
|
return bdrv_co_pdiscard(bs->file->bs, offset, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int64_t coroutine_fn blkdebug_co_get_block_status(
|
||||||
|
BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum,
|
||||||
|
BlockDriverState **file)
|
||||||
|
{
|
||||||
|
assert(QEMU_IS_ALIGNED(sector_num | nb_sectors,
|
||||||
|
DIV_ROUND_UP(bs->bl.request_alignment,
|
||||||
|
BDRV_SECTOR_SIZE)));
|
||||||
|
return bdrv_co_get_block_status_from_file(bs, sector_num, nb_sectors,
|
||||||
|
pnum, file);
|
||||||
|
}
|
||||||
|
|
||||||
static void blkdebug_close(BlockDriverState *bs)
|
static void blkdebug_close(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
BDRVBlkdebugState *s = bs->opaque;
|
BDRVBlkdebugState *s = bs->opaque;
|
||||||
|
@ -896,7 +907,7 @@ static BlockDriver bdrv_blkdebug = {
|
||||||
.bdrv_co_flush_to_disk = blkdebug_co_flush,
|
.bdrv_co_flush_to_disk = blkdebug_co_flush,
|
||||||
.bdrv_co_pwrite_zeroes = blkdebug_co_pwrite_zeroes,
|
.bdrv_co_pwrite_zeroes = blkdebug_co_pwrite_zeroes,
|
||||||
.bdrv_co_pdiscard = blkdebug_co_pdiscard,
|
.bdrv_co_pdiscard = blkdebug_co_pdiscard,
|
||||||
.bdrv_co_get_block_status = bdrv_co_get_block_status_from_file,
|
.bdrv_co_get_block_status = blkdebug_co_get_block_status,
|
||||||
|
|
||||||
.bdrv_debug_event = blkdebug_debug_event,
|
.bdrv_debug_event = blkdebug_debug_event,
|
||||||
.bdrv_debug_breakpoint = blkdebug_debug_breakpoint,
|
.bdrv_debug_breakpoint = blkdebug_debug_breakpoint,
|
||||||
|
|
332
block/io.c
332
block/io.c
|
@ -469,9 +469,9 @@ static void mark_request_serialising(BdrvTrackedRequest *req, uint64_t align)
|
||||||
* Round a region to cluster boundaries
|
* Round a region to cluster boundaries
|
||||||
*/
|
*/
|
||||||
void bdrv_round_to_clusters(BlockDriverState *bs,
|
void bdrv_round_to_clusters(BlockDriverState *bs,
|
||||||
int64_t offset, unsigned int bytes,
|
int64_t offset, int64_t bytes,
|
||||||
int64_t *cluster_offset,
|
int64_t *cluster_offset,
|
||||||
unsigned int *cluster_bytes)
|
int64_t *cluster_bytes)
|
||||||
{
|
{
|
||||||
BlockDriverInfo bdi;
|
BlockDriverInfo bdi;
|
||||||
|
|
||||||
|
@ -716,39 +716,37 @@ int bdrv_pwrite_zeroes(BdrvChild *child, int64_t offset,
|
||||||
*/
|
*/
|
||||||
int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags)
|
int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
int64_t target_sectors, ret, nb_sectors, sector_num = 0;
|
int ret;
|
||||||
|
int64_t target_size, bytes, offset = 0;
|
||||||
BlockDriverState *bs = child->bs;
|
BlockDriverState *bs = child->bs;
|
||||||
BlockDriverState *file;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
target_sectors = bdrv_nb_sectors(bs);
|
target_size = bdrv_getlength(bs);
|
||||||
if (target_sectors < 0) {
|
if (target_size < 0) {
|
||||||
return target_sectors;
|
return target_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
nb_sectors = MIN(target_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
|
bytes = MIN(target_size - offset, BDRV_REQUEST_MAX_BYTES);
|
||||||
if (nb_sectors <= 0) {
|
if (bytes <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n, &file);
|
ret = bdrv_block_status(bs, offset, bytes, &bytes, NULL, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error getting block status at sector %" PRId64 ": %s",
|
error_report("error getting block status at offset %" PRId64 ": %s",
|
||||||
sector_num, strerror(-ret));
|
offset, strerror(-ret));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (ret & BDRV_BLOCK_ZERO) {
|
if (ret & BDRV_BLOCK_ZERO) {
|
||||||
sector_num += n;
|
offset += bytes;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ret = bdrv_pwrite_zeroes(child, sector_num << BDRV_SECTOR_BITS,
|
ret = bdrv_pwrite_zeroes(child, offset, bytes, flags);
|
||||||
n << BDRV_SECTOR_BITS, flags);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error writing zeroes at sector %" PRId64 ": %s",
|
error_report("error writing zeroes at offset %" PRId64 ": %s",
|
||||||
sector_num, strerror(-ret));
|
offset, strerror(-ret));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
sector_num += n;
|
offset += bytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -970,7 +968,7 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BdrvChild *child,
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
QEMUIOVector local_qiov;
|
QEMUIOVector local_qiov;
|
||||||
int64_t cluster_offset;
|
int64_t cluster_offset;
|
||||||
unsigned int cluster_bytes;
|
int64_t cluster_bytes;
|
||||||
size_t skip_bytes;
|
size_t skip_bytes;
|
||||||
int ret;
|
int ret;
|
||||||
int max_transfer = MIN_NON_ZERO(bs->bl.max_transfer,
|
int max_transfer = MIN_NON_ZERO(bs->bl.max_transfer,
|
||||||
|
@ -1126,18 +1124,14 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & BDRV_REQ_COPY_ON_READ) {
|
if (flags & BDRV_REQ_COPY_ON_READ) {
|
||||||
/* TODO: Simplify further once bdrv_is_allocated no longer
|
|
||||||
* requires sector alignment */
|
|
||||||
int64_t start = QEMU_ALIGN_DOWN(offset, BDRV_SECTOR_SIZE);
|
|
||||||
int64_t end = QEMU_ALIGN_UP(offset + bytes, BDRV_SECTOR_SIZE);
|
|
||||||
int64_t pnum;
|
int64_t pnum;
|
||||||
|
|
||||||
ret = bdrv_is_allocated(bs, start, end - start, &pnum);
|
ret = bdrv_is_allocated(bs, offset, bytes, &pnum);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ret || pnum != end - start) {
|
if (!ret || pnum != bytes) {
|
||||||
ret = bdrv_co_do_copy_on_readv(child, offset, bytes, qiov);
|
ret = bdrv_co_do_copy_on_readv(child, offset, bytes, qiov);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1767,16 +1761,18 @@ int bdrv_flush_all(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct BdrvCoGetBlockStatusData {
|
typedef struct BdrvCoBlockStatusData {
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriverState *base;
|
BlockDriverState *base;
|
||||||
|
bool want_zero;
|
||||||
|
int64_t offset;
|
||||||
|
int64_t bytes;
|
||||||
|
int64_t *pnum;
|
||||||
|
int64_t *map;
|
||||||
BlockDriverState **file;
|
BlockDriverState **file;
|
||||||
int64_t sector_num;
|
int ret;
|
||||||
int nb_sectors;
|
|
||||||
int *pnum;
|
|
||||||
int64_t ret;
|
|
||||||
bool done;
|
bool done;
|
||||||
} BdrvCoGetBlockStatusData;
|
} BdrvCoBlockStatusData;
|
||||||
|
|
||||||
int64_t coroutine_fn bdrv_co_get_block_status_from_file(BlockDriverState *bs,
|
int64_t coroutine_fn bdrv_co_get_block_status_from_file(BlockDriverState *bs,
|
||||||
int64_t sector_num,
|
int64_t sector_num,
|
||||||
|
@ -1809,99 +1805,157 @@ int64_t coroutine_fn bdrv_co_get_block_status_from_backing(BlockDriverState *bs,
|
||||||
* Drivers not implementing the functionality are assumed to not support
|
* Drivers not implementing the functionality are assumed to not support
|
||||||
* backing files, hence all their sectors are reported as allocated.
|
* backing files, hence all their sectors are reported as allocated.
|
||||||
*
|
*
|
||||||
* If 'sector_num' is beyond the end of the disk image the return value is
|
* If 'want_zero' is true, the caller is querying for mapping purposes,
|
||||||
|
* and the result should include BDRV_BLOCK_OFFSET_VALID and
|
||||||
|
* BDRV_BLOCK_ZERO where possible; otherwise, the result may omit those
|
||||||
|
* bits particularly if it allows for a larger value in 'pnum'.
|
||||||
|
*
|
||||||
|
* If 'offset' is beyond the end of the disk image the return value is
|
||||||
* BDRV_BLOCK_EOF and 'pnum' is set to 0.
|
* BDRV_BLOCK_EOF and 'pnum' is set to 0.
|
||||||
*
|
*
|
||||||
* 'pnum' is set to the number of sectors (including and immediately following
|
* 'bytes' is the max value 'pnum' should be set to. If bytes goes
|
||||||
* the specified sector) that are known to be in the same
|
|
||||||
* allocated/unallocated state.
|
|
||||||
*
|
|
||||||
* 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes
|
|
||||||
* beyond the end of the disk image it will be clamped; if 'pnum' is set to
|
* beyond the end of the disk image it will be clamped; if 'pnum' is set to
|
||||||
* the end of the image, then the returned value will include BDRV_BLOCK_EOF.
|
* the end of the image, then the returned value will include BDRV_BLOCK_EOF.
|
||||||
*
|
*
|
||||||
* If returned value is positive and BDRV_BLOCK_OFFSET_VALID bit is set, 'file'
|
* 'pnum' is set to the number of bytes (including and immediately
|
||||||
* points to the BDS which the sector range is allocated in.
|
* following the specified offset) that are easily known to be in the
|
||||||
|
* same allocated/unallocated state. Note that a second call starting
|
||||||
|
* at the original offset plus returned pnum may have the same status.
|
||||||
|
* The returned value is non-zero on success except at end-of-file.
|
||||||
|
*
|
||||||
|
* Returns negative errno on failure. Otherwise, if the
|
||||||
|
* BDRV_BLOCK_OFFSET_VALID bit is set, 'map' and 'file' (if non-NULL) are
|
||||||
|
* set to the host mapping and BDS corresponding to the guest offset.
|
||||||
*/
|
*/
|
||||||
static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
|
static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs,
|
||||||
int64_t sector_num,
|
bool want_zero,
|
||||||
int nb_sectors, int *pnum,
|
int64_t offset, int64_t bytes,
|
||||||
BlockDriverState **file)
|
int64_t *pnum, int64_t *map,
|
||||||
|
BlockDriverState **file)
|
||||||
{
|
{
|
||||||
int64_t total_sectors;
|
int64_t total_size;
|
||||||
int64_t n;
|
int64_t n; /* bytes */
|
||||||
int64_t ret, ret2;
|
int ret;
|
||||||
|
int64_t local_map = 0;
|
||||||
|
BlockDriverState *local_file = NULL;
|
||||||
|
int64_t aligned_offset, aligned_bytes;
|
||||||
|
uint32_t align;
|
||||||
|
|
||||||
*file = NULL;
|
assert(pnum);
|
||||||
total_sectors = bdrv_nb_sectors(bs);
|
*pnum = 0;
|
||||||
if (total_sectors < 0) {
|
total_size = bdrv_getlength(bs);
|
||||||
return total_sectors;
|
if (total_size < 0) {
|
||||||
|
ret = total_size;
|
||||||
|
goto early_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sector_num >= total_sectors) {
|
if (offset >= total_size) {
|
||||||
*pnum = 0;
|
ret = BDRV_BLOCK_EOF;
|
||||||
return BDRV_BLOCK_EOF;
|
goto early_out;
|
||||||
}
|
}
|
||||||
if (!nb_sectors) {
|
if (!bytes) {
|
||||||
*pnum = 0;
|
ret = 0;
|
||||||
return 0;
|
goto early_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = total_sectors - sector_num;
|
n = total_size - offset;
|
||||||
if (n < nb_sectors) {
|
if (n < bytes) {
|
||||||
nb_sectors = n;
|
bytes = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bs->drv->bdrv_co_get_block_status) {
|
if (!bs->drv->bdrv_co_get_block_status) {
|
||||||
*pnum = nb_sectors;
|
*pnum = bytes;
|
||||||
ret = BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED;
|
ret = BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED;
|
||||||
if (sector_num + nb_sectors == total_sectors) {
|
if (offset + bytes == total_size) {
|
||||||
ret |= BDRV_BLOCK_EOF;
|
ret |= BDRV_BLOCK_EOF;
|
||||||
}
|
}
|
||||||
if (bs->drv->protocol_name) {
|
if (bs->drv->protocol_name) {
|
||||||
ret |= BDRV_BLOCK_OFFSET_VALID | (sector_num * BDRV_SECTOR_SIZE);
|
ret |= BDRV_BLOCK_OFFSET_VALID;
|
||||||
*file = bs;
|
local_map = offset;
|
||||||
|
local_file = bs;
|
||||||
}
|
}
|
||||||
return ret;
|
goto early_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_inc_in_flight(bs);
|
bdrv_inc_in_flight(bs);
|
||||||
ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum,
|
|
||||||
file);
|
/* Round out to request_alignment boundaries */
|
||||||
if (ret < 0) {
|
/* TODO: until we have a byte-based driver callback, we also have to
|
||||||
*pnum = 0;
|
* round out to sectors, even if that is bigger than request_alignment */
|
||||||
goto out;
|
align = MAX(bs->bl.request_alignment, BDRV_SECTOR_SIZE);
|
||||||
|
aligned_offset = QEMU_ALIGN_DOWN(offset, align);
|
||||||
|
aligned_bytes = ROUND_UP(offset + bytes, align) - aligned_offset;
|
||||||
|
|
||||||
|
{
|
||||||
|
int count; /* sectors */
|
||||||
|
int64_t longret;
|
||||||
|
|
||||||
|
assert(QEMU_IS_ALIGNED(aligned_offset | aligned_bytes,
|
||||||
|
BDRV_SECTOR_SIZE));
|
||||||
|
/*
|
||||||
|
* The contract allows us to return pnum smaller than bytes, even
|
||||||
|
* if the next query would see the same status; we truncate the
|
||||||
|
* request to avoid overflowing the driver's 32-bit interface.
|
||||||
|
*/
|
||||||
|
longret = bs->drv->bdrv_co_get_block_status(
|
||||||
|
bs, aligned_offset >> BDRV_SECTOR_BITS,
|
||||||
|
MIN(INT_MAX, aligned_bytes) >> BDRV_SECTOR_BITS, &count,
|
||||||
|
&local_file);
|
||||||
|
if (longret < 0) {
|
||||||
|
assert(INT_MIN <= longret);
|
||||||
|
ret = longret;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (longret & BDRV_BLOCK_OFFSET_VALID) {
|
||||||
|
local_map = longret & BDRV_BLOCK_OFFSET_MASK;
|
||||||
|
}
|
||||||
|
ret = longret & ~BDRV_BLOCK_OFFSET_MASK;
|
||||||
|
*pnum = count * BDRV_SECTOR_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The driver's result must be a multiple of request_alignment.
|
||||||
|
* Clamp pnum and adjust map to original request.
|
||||||
|
*/
|
||||||
|
assert(QEMU_IS_ALIGNED(*pnum, align) && align > offset - aligned_offset);
|
||||||
|
*pnum -= offset - aligned_offset;
|
||||||
|
if (*pnum > bytes) {
|
||||||
|
*pnum = bytes;
|
||||||
|
}
|
||||||
|
if (ret & BDRV_BLOCK_OFFSET_VALID) {
|
||||||
|
local_map += offset - aligned_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret & BDRV_BLOCK_RAW) {
|
if (ret & BDRV_BLOCK_RAW) {
|
||||||
assert(ret & BDRV_BLOCK_OFFSET_VALID && *file);
|
assert(ret & BDRV_BLOCK_OFFSET_VALID && local_file);
|
||||||
ret = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
|
ret = bdrv_co_block_status(local_file, want_zero, local_map,
|
||||||
*pnum, pnum, file);
|
*pnum, pnum, &local_map, &local_file);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) {
|
if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) {
|
||||||
ret |= BDRV_BLOCK_ALLOCATED;
|
ret |= BDRV_BLOCK_ALLOCATED;
|
||||||
} else {
|
} else if (want_zero) {
|
||||||
if (bdrv_unallocated_blocks_are_zero(bs)) {
|
if (bdrv_unallocated_blocks_are_zero(bs)) {
|
||||||
ret |= BDRV_BLOCK_ZERO;
|
ret |= BDRV_BLOCK_ZERO;
|
||||||
} else if (bs->backing) {
|
} else if (bs->backing) {
|
||||||
BlockDriverState *bs2 = bs->backing->bs;
|
BlockDriverState *bs2 = bs->backing->bs;
|
||||||
int64_t nb_sectors2 = bdrv_nb_sectors(bs2);
|
int64_t size2 = bdrv_getlength(bs2);
|
||||||
if (nb_sectors2 >= 0 && sector_num >= nb_sectors2) {
|
|
||||||
|
if (size2 >= 0 && offset >= size2) {
|
||||||
ret |= BDRV_BLOCK_ZERO;
|
ret |= BDRV_BLOCK_ZERO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*file && *file != bs &&
|
if (want_zero && local_file && local_file != bs &&
|
||||||
(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
|
(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
|
||||||
(ret & BDRV_BLOCK_OFFSET_VALID)) {
|
(ret & BDRV_BLOCK_OFFSET_VALID)) {
|
||||||
BlockDriverState *file2;
|
int64_t file_pnum;
|
||||||
int file_pnum;
|
int ret2;
|
||||||
|
|
||||||
ret2 = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
|
ret2 = bdrv_co_block_status(local_file, want_zero, local_map,
|
||||||
*pnum, &file_pnum, &file2);
|
*pnum, &file_pnum, NULL, NULL);
|
||||||
if (ret2 >= 0) {
|
if (ret2 >= 0) {
|
||||||
/* Ignore errors. This is just providing extra information, it
|
/* Ignore errors. This is just providing extra information, it
|
||||||
* is useful but not necessary.
|
* is useful but not necessary.
|
||||||
|
@ -1924,26 +1978,36 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
|
||||||
|
|
||||||
out:
|
out:
|
||||||
bdrv_dec_in_flight(bs);
|
bdrv_dec_in_flight(bs);
|
||||||
if (ret >= 0 && sector_num + *pnum == total_sectors) {
|
if (ret >= 0 && offset + *pnum == total_size) {
|
||||||
ret |= BDRV_BLOCK_EOF;
|
ret |= BDRV_BLOCK_EOF;
|
||||||
}
|
}
|
||||||
|
early_out:
|
||||||
|
if (file) {
|
||||||
|
*file = local_file;
|
||||||
|
}
|
||||||
|
if (map) {
|
||||||
|
*map = local_map;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t coroutine_fn bdrv_co_get_block_status_above(BlockDriverState *bs,
|
static int coroutine_fn bdrv_co_block_status_above(BlockDriverState *bs,
|
||||||
BlockDriverState *base,
|
BlockDriverState *base,
|
||||||
int64_t sector_num,
|
bool want_zero,
|
||||||
int nb_sectors,
|
int64_t offset,
|
||||||
int *pnum,
|
int64_t bytes,
|
||||||
BlockDriverState **file)
|
int64_t *pnum,
|
||||||
|
int64_t *map,
|
||||||
|
BlockDriverState **file)
|
||||||
{
|
{
|
||||||
BlockDriverState *p;
|
BlockDriverState *p;
|
||||||
int64_t ret = 0;
|
int ret = 0;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
|
||||||
assert(bs != base);
|
assert(bs != base);
|
||||||
for (p = bs; p != base; p = backing_bs(p)) {
|
for (p = bs; p != base; p = backing_bs(p)) {
|
||||||
ret = bdrv_co_get_block_status(p, sector_num, nb_sectors, pnum, file);
|
ret = bdrv_co_block_status(p, want_zero, offset, bytes, pnum, map,
|
||||||
|
file);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1954,94 +2018,94 @@ static int64_t coroutine_fn bdrv_co_get_block_status_above(BlockDriverState *bs,
|
||||||
* unallocated length we learned from an earlier
|
* unallocated length we learned from an earlier
|
||||||
* iteration.
|
* iteration.
|
||||||
*/
|
*/
|
||||||
*pnum = nb_sectors;
|
*pnum = bytes;
|
||||||
}
|
}
|
||||||
if (ret & (BDRV_BLOCK_ZERO | BDRV_BLOCK_DATA)) {
|
if (ret & (BDRV_BLOCK_ZERO | BDRV_BLOCK_DATA)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* [sector_num, pnum] unallocated on this layer, which could be only
|
/* [offset, pnum] unallocated on this layer, which could be only
|
||||||
* the first part of [sector_num, nb_sectors]. */
|
* the first part of [offset, bytes]. */
|
||||||
nb_sectors = MIN(nb_sectors, *pnum);
|
bytes = MIN(bytes, *pnum);
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Coroutine wrapper for bdrv_get_block_status_above() */
|
/* Coroutine wrapper for bdrv_block_status_above() */
|
||||||
static void coroutine_fn bdrv_get_block_status_above_co_entry(void *opaque)
|
static void coroutine_fn bdrv_block_status_above_co_entry(void *opaque)
|
||||||
{
|
{
|
||||||
BdrvCoGetBlockStatusData *data = opaque;
|
BdrvCoBlockStatusData *data = opaque;
|
||||||
|
|
||||||
data->ret = bdrv_co_get_block_status_above(data->bs, data->base,
|
data->ret = bdrv_co_block_status_above(data->bs, data->base,
|
||||||
data->sector_num,
|
data->want_zero,
|
||||||
data->nb_sectors,
|
data->offset, data->bytes,
|
||||||
data->pnum,
|
data->pnum, data->map, data->file);
|
||||||
data->file);
|
|
||||||
data->done = true;
|
data->done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Synchronous wrapper around bdrv_co_get_block_status_above().
|
* Synchronous wrapper around bdrv_co_block_status_above().
|
||||||
*
|
*
|
||||||
* See bdrv_co_get_block_status_above() for details.
|
* See bdrv_co_block_status_above() for details.
|
||||||
*/
|
*/
|
||||||
int64_t bdrv_get_block_status_above(BlockDriverState *bs,
|
static int bdrv_common_block_status_above(BlockDriverState *bs,
|
||||||
BlockDriverState *base,
|
BlockDriverState *base,
|
||||||
int64_t sector_num,
|
bool want_zero, int64_t offset,
|
||||||
int nb_sectors, int *pnum,
|
int64_t bytes, int64_t *pnum,
|
||||||
BlockDriverState **file)
|
int64_t *map,
|
||||||
|
BlockDriverState **file)
|
||||||
{
|
{
|
||||||
Coroutine *co;
|
Coroutine *co;
|
||||||
BdrvCoGetBlockStatusData data = {
|
BdrvCoBlockStatusData data = {
|
||||||
.bs = bs,
|
.bs = bs,
|
||||||
.base = base,
|
.base = base,
|
||||||
.file = file,
|
.want_zero = want_zero,
|
||||||
.sector_num = sector_num,
|
.offset = offset,
|
||||||
.nb_sectors = nb_sectors,
|
.bytes = bytes,
|
||||||
.pnum = pnum,
|
.pnum = pnum,
|
||||||
|
.map = map,
|
||||||
|
.file = file,
|
||||||
.done = false,
|
.done = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (qemu_in_coroutine()) {
|
if (qemu_in_coroutine()) {
|
||||||
/* Fast-path if already in coroutine context */
|
/* Fast-path if already in coroutine context */
|
||||||
bdrv_get_block_status_above_co_entry(&data);
|
bdrv_block_status_above_co_entry(&data);
|
||||||
} else {
|
} else {
|
||||||
co = qemu_coroutine_create(bdrv_get_block_status_above_co_entry,
|
co = qemu_coroutine_create(bdrv_block_status_above_co_entry, &data);
|
||||||
&data);
|
|
||||||
bdrv_coroutine_enter(bs, co);
|
bdrv_coroutine_enter(bs, co);
|
||||||
BDRV_POLL_WHILE(bs, !data.done);
|
BDRV_POLL_WHILE(bs, !data.done);
|
||||||
}
|
}
|
||||||
return data.ret;
|
return data.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t bdrv_get_block_status(BlockDriverState *bs,
|
int bdrv_block_status_above(BlockDriverState *bs, BlockDriverState *base,
|
||||||
int64_t sector_num,
|
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||||
int nb_sectors, int *pnum,
|
int64_t *map, BlockDriverState **file)
|
||||||
BlockDriverState **file)
|
|
||||||
{
|
{
|
||||||
return bdrv_get_block_status_above(bs, backing_bs(bs),
|
return bdrv_common_block_status_above(bs, base, true, offset, bytes,
|
||||||
sector_num, nb_sectors, pnum, file);
|
pnum, map, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
int bdrv_block_status(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||||
|
int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||||
|
{
|
||||||
|
return bdrv_block_status_above(bs, backing_bs(bs),
|
||||||
|
offset, bytes, pnum, map, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t offset,
|
int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||||
int64_t bytes, int64_t *pnum)
|
int64_t bytes, int64_t *pnum)
|
||||||
{
|
{
|
||||||
BlockDriverState *file;
|
int ret;
|
||||||
int64_t sector_num = offset >> BDRV_SECTOR_BITS;
|
int64_t dummy;
|
||||||
int nb_sectors = bytes >> BDRV_SECTOR_BITS;
|
|
||||||
int64_t ret;
|
|
||||||
int psectors;
|
|
||||||
|
|
||||||
assert(QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE));
|
ret = bdrv_common_block_status_above(bs, backing_bs(bs), false, offset,
|
||||||
assert(QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE) && bytes < INT_MAX);
|
bytes, pnum ? pnum : &dummy, NULL,
|
||||||
ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &psectors,
|
NULL);
|
||||||
&file);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (pnum) {
|
|
||||||
*pnum = psectors * BDRV_SECTOR_SIZE;
|
|
||||||
}
|
|
||||||
return !!(ret & BDRV_BLOCK_ALLOCATED);
|
return !!(ret & BDRV_BLOCK_ALLOCATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -190,10 +190,9 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,
|
||||||
bool need_cow;
|
bool need_cow;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int64_t align_offset = *offset;
|
int64_t align_offset = *offset;
|
||||||
unsigned int align_bytes = *bytes;
|
int64_t align_bytes = *bytes;
|
||||||
int max_bytes = s->granularity * s->max_iov;
|
int max_bytes = s->granularity * s->max_iov;
|
||||||
|
|
||||||
assert(*bytes < INT_MAX);
|
|
||||||
need_cow = !test_bit(*offset / s->granularity, s->cow_bitmap);
|
need_cow = !test_bit(*offset / s->granularity, s->cow_bitmap);
|
||||||
need_cow |= !test_bit((*offset + *bytes - 1) / s->granularity,
|
need_cow |= !test_bit((*offset + *bytes - 1) / s->granularity,
|
||||||
s->cow_bitmap);
|
s->cow_bitmap);
|
||||||
|
@ -329,7 +328,6 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
uint64_t delay_ns = 0;
|
uint64_t delay_ns = 0;
|
||||||
/* At least the first dirty chunk is mirrored in one iteration. */
|
/* At least the first dirty chunk is mirrored in one iteration. */
|
||||||
int nb_chunks = 1;
|
int nb_chunks = 1;
|
||||||
int sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
|
|
||||||
bool write_zeroes_ok = bdrv_can_write_zeroes_with_unmap(blk_bs(s->target));
|
bool write_zeroes_ok = bdrv_can_write_zeroes_with_unmap(blk_bs(s->target));
|
||||||
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
|
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
|
||||||
|
|
||||||
|
@ -377,7 +375,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear dirty bits before querying the block status, because
|
/* Clear dirty bits before querying the block status, because
|
||||||
* calling bdrv_get_block_status_above could yield - if some blocks are
|
* calling bdrv_block_status_above could yield - if some blocks are
|
||||||
* marked dirty in this window, we need to know.
|
* marked dirty in this window, we need to know.
|
||||||
*/
|
*/
|
||||||
bdrv_reset_dirty_bitmap_locked(s->dirty_bitmap, offset,
|
bdrv_reset_dirty_bitmap_locked(s->dirty_bitmap, offset,
|
||||||
|
@ -386,11 +384,9 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
|
|
||||||
bitmap_set(s->in_flight_bitmap, offset / s->granularity, nb_chunks);
|
bitmap_set(s->in_flight_bitmap, offset / s->granularity, nb_chunks);
|
||||||
while (nb_chunks > 0 && offset < s->bdev_length) {
|
while (nb_chunks > 0 && offset < s->bdev_length) {
|
||||||
int64_t ret;
|
int ret;
|
||||||
int io_sectors;
|
int64_t io_bytes;
|
||||||
unsigned int io_bytes;
|
|
||||||
int64_t io_bytes_acct;
|
int64_t io_bytes_acct;
|
||||||
BlockDriverState *file;
|
|
||||||
enum MirrorMethod {
|
enum MirrorMethod {
|
||||||
MIRROR_METHOD_COPY,
|
MIRROR_METHOD_COPY,
|
||||||
MIRROR_METHOD_ZERO,
|
MIRROR_METHOD_ZERO,
|
||||||
|
@ -398,11 +394,9 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
} mirror_method = MIRROR_METHOD_COPY;
|
} mirror_method = MIRROR_METHOD_COPY;
|
||||||
|
|
||||||
assert(!(offset % s->granularity));
|
assert(!(offset % s->granularity));
|
||||||
ret = bdrv_get_block_status_above(source, NULL,
|
ret = bdrv_block_status_above(source, NULL, offset,
|
||||||
offset >> BDRV_SECTOR_BITS,
|
nb_chunks * s->granularity,
|
||||||
nb_chunks * sectors_per_chunk,
|
&io_bytes, NULL, NULL);
|
||||||
&io_sectors, &file);
|
|
||||||
io_bytes = io_sectors * BDRV_SECTOR_SIZE;
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
io_bytes = MIN(nb_chunks * s->granularity, max_io_bytes);
|
io_bytes = MIN(nb_chunks * s->granularity, max_io_bytes);
|
||||||
} else if (ret & BDRV_BLOCK_DATA) {
|
} else if (ret & BDRV_BLOCK_DATA) {
|
||||||
|
@ -414,7 +408,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
io_bytes = s->granularity;
|
io_bytes = s->granularity;
|
||||||
} else if (ret >= 0 && !(ret & BDRV_BLOCK_DATA)) {
|
} else if (ret >= 0 && !(ret & BDRV_BLOCK_DATA)) {
|
||||||
int64_t target_offset;
|
int64_t target_offset;
|
||||||
unsigned int target_bytes;
|
int64_t target_bytes;
|
||||||
bdrv_round_to_clusters(blk_bs(s->target), offset, io_bytes,
|
bdrv_round_to_clusters(blk_bs(s->target), offset, io_bytes,
|
||||||
&target_offset, &target_bytes);
|
&target_offset, &target_bytes);
|
||||||
if (target_offset == offset &&
|
if (target_offset == offset &&
|
||||||
|
@ -1133,9 +1127,7 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
|
||||||
granularity = bdrv_get_default_bitmap_granularity(target);
|
granularity = bdrv_get_default_bitmap_granularity(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert ((granularity & (granularity - 1)) == 0);
|
assert(is_power_of_2(granularity));
|
||||||
/* Granularity must be large enough for sector-based dirty bitmap */
|
|
||||||
assert(granularity >= BDRV_SECTOR_SIZE);
|
|
||||||
|
|
||||||
if (buf_size < 0) {
|
if (buf_size < 0) {
|
||||||
error_setg(errp, "Invalid parameter 'buf-size'");
|
error_setg(errp, "Invalid parameter 'buf-size'");
|
||||||
|
|
|
@ -1632,7 +1632,7 @@ static int discard_single_l2(BlockDriverState *bs, uint64_t offset,
|
||||||
* cluster is already marked as zero, or if it's unallocated and we
|
* cluster is already marked as zero, or if it's unallocated and we
|
||||||
* don't have a backing file.
|
* don't have a backing file.
|
||||||
*
|
*
|
||||||
* TODO We might want to use bdrv_get_block_status(bs) here, but we're
|
* TODO We might want to use bdrv_block_status(bs) here, but we're
|
||||||
* holding s->lock, so that doesn't work today.
|
* holding s->lock, so that doesn't work today.
|
||||||
*
|
*
|
||||||
* If full_discard is true, the sector should not read back as zeroes,
|
* If full_discard is true, the sector should not read back as zeroes,
|
||||||
|
|
112
block/qcow2.c
112
block/qcow2.c
|
@ -1139,7 +1139,7 @@ static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
|
|
||||||
s->cluster_bits = header.cluster_bits;
|
s->cluster_bits = header.cluster_bits;
|
||||||
s->cluster_size = 1 << s->cluster_bits;
|
s->cluster_size = 1 << s->cluster_bits;
|
||||||
s->cluster_sectors = 1 << (s->cluster_bits - 9);
|
s->cluster_sectors = 1 << (s->cluster_bits - BDRV_SECTOR_BITS);
|
||||||
|
|
||||||
/* Initialise version 3 header fields */
|
/* Initialise version 3 header fields */
|
||||||
if (header.version == 2) {
|
if (header.version == 2) {
|
||||||
|
@ -1636,7 +1636,7 @@ static int64_t coroutine_fn qcow2_co_get_block_status(BlockDriverState *bs,
|
||||||
|
|
||||||
bytes = MIN(INT_MAX, nb_sectors * BDRV_SECTOR_SIZE);
|
bytes = MIN(INT_MAX, nb_sectors * BDRV_SECTOR_SIZE);
|
||||||
qemu_co_mutex_lock(&s->lock);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
ret = qcow2_get_cluster_offset(bs, sector_num << 9, &bytes,
|
ret = qcow2_get_cluster_offset(bs, sector_num << BDRV_SECTOR_BITS, &bytes,
|
||||||
&cluster_offset);
|
&cluster_offset);
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -2460,6 +2460,14 @@ static int qcow2_set_up_encryption(BlockDriverState *bs, const char *encryptfmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct PreallocCo {
|
||||||
|
BlockDriverState *bs;
|
||||||
|
uint64_t offset;
|
||||||
|
uint64_t new_length;
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
} PreallocCo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preallocates metadata structures for data clusters between @offset (in the
|
* Preallocates metadata structures for data clusters between @offset (in the
|
||||||
* guest disk) and @new_length (which is thus generally the new guest disk
|
* guest disk) and @new_length (which is thus generally the new guest disk
|
||||||
|
@ -2467,9 +2475,12 @@ static int qcow2_set_up_encryption(BlockDriverState *bs, const char *encryptfmt,
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -errno on failure.
|
* Returns: 0 on success, -errno on failure.
|
||||||
*/
|
*/
|
||||||
static int preallocate(BlockDriverState *bs,
|
static void coroutine_fn preallocate_co(void *opaque)
|
||||||
uint64_t offset, uint64_t new_length)
|
|
||||||
{
|
{
|
||||||
|
PreallocCo *params = opaque;
|
||||||
|
BlockDriverState *bs = params->bs;
|
||||||
|
uint64_t offset = params->offset;
|
||||||
|
uint64_t new_length = params->new_length;
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
uint64_t bytes;
|
uint64_t bytes;
|
||||||
uint64_t host_offset = 0;
|
uint64_t host_offset = 0;
|
||||||
|
@ -2477,9 +2488,7 @@ static int preallocate(BlockDriverState *bs,
|
||||||
int ret;
|
int ret;
|
||||||
QCowL2Meta *meta;
|
QCowL2Meta *meta;
|
||||||
|
|
||||||
if (qemu_in_coroutine()) {
|
qemu_co_mutex_lock(&s->lock);
|
||||||
qemu_co_mutex_lock(&s->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(offset <= new_length);
|
assert(offset <= new_length);
|
||||||
bytes = new_length - offset;
|
bytes = new_length - offset;
|
||||||
|
@ -2533,10 +2542,28 @@ static int preallocate(BlockDriverState *bs,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
|
params->ret = ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int preallocate(BlockDriverState *bs,
|
||||||
|
uint64_t offset, uint64_t new_length)
|
||||||
|
{
|
||||||
|
PreallocCo params = {
|
||||||
|
.bs = bs,
|
||||||
|
.offset = offset,
|
||||||
|
.new_length = new_length,
|
||||||
|
.ret = -EINPROGRESS,
|
||||||
|
};
|
||||||
|
|
||||||
if (qemu_in_coroutine()) {
|
if (qemu_in_coroutine()) {
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
preallocate_co(¶ms);
|
||||||
|
} else {
|
||||||
|
Coroutine *co = qemu_coroutine_create(preallocate_co, ¶ms);
|
||||||
|
bdrv_coroutine_enter(bs, co);
|
||||||
|
BDRV_POLL_WHILE(bs, params.ret == -EINPROGRESS);
|
||||||
}
|
}
|
||||||
return ret;
|
return params.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* qcow2_refcount_metadata_size:
|
/* qcow2_refcount_metadata_size:
|
||||||
|
@ -2972,23 +2999,21 @@ finish:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool is_zero_sectors(BlockDriverState *bs, int64_t start,
|
static bool is_zero(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||||
uint32_t count)
|
|
||||||
{
|
{
|
||||||
int nr;
|
int64_t nr;
|
||||||
BlockDriverState *file;
|
int res;
|
||||||
int64_t res;
|
|
||||||
|
|
||||||
if (start + count > bs->total_sectors) {
|
/* Clamp to image length, before checking status of underlying sectors */
|
||||||
count = bs->total_sectors - start;
|
if (offset + bytes > bs->total_sectors * BDRV_SECTOR_SIZE) {
|
||||||
|
bytes = bs->total_sectors * BDRV_SECTOR_SIZE - offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!count) {
|
if (!bytes) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
res = bdrv_get_block_status_above(bs, NULL, start, count,
|
res = bdrv_block_status_above(bs, NULL, offset, bytes, &nr, NULL, NULL);
|
||||||
&nr, &file);
|
return res >= 0 && (res & BDRV_BLOCK_ZERO) && nr == bytes;
|
||||||
return res >= 0 && (res & BDRV_BLOCK_ZERO) && nr == count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static coroutine_fn int qcow2_co_pwrite_zeroes(BlockDriverState *bs,
|
static coroutine_fn int qcow2_co_pwrite_zeroes(BlockDriverState *bs,
|
||||||
|
@ -3006,24 +3031,21 @@ static coroutine_fn int qcow2_co_pwrite_zeroes(BlockDriverState *bs,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (head || tail) {
|
if (head || tail) {
|
||||||
int64_t cl_start = (offset - head) >> BDRV_SECTOR_BITS;
|
|
||||||
uint64_t off;
|
uint64_t off;
|
||||||
unsigned int nr;
|
unsigned int nr;
|
||||||
|
|
||||||
assert(head + bytes <= s->cluster_size);
|
assert(head + bytes <= s->cluster_size);
|
||||||
|
|
||||||
/* check whether remainder of cluster already reads as zero */
|
/* check whether remainder of cluster already reads as zero */
|
||||||
if (!(is_zero_sectors(bs, cl_start,
|
if (!(is_zero(bs, offset - head, head) &&
|
||||||
DIV_ROUND_UP(head, BDRV_SECTOR_SIZE)) &&
|
is_zero(bs, offset + bytes,
|
||||||
is_zero_sectors(bs, (offset + bytes) >> BDRV_SECTOR_BITS,
|
tail ? s->cluster_size - tail : 0))) {
|
||||||
DIV_ROUND_UP(-tail & (s->cluster_size - 1),
|
|
||||||
BDRV_SECTOR_SIZE)))) {
|
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&s->lock);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
/* We can have new write after previous check */
|
/* We can have new write after previous check */
|
||||||
offset = cl_start << BDRV_SECTOR_BITS;
|
offset = QEMU_ALIGN_DOWN(offset, s->cluster_size);
|
||||||
bytes = s->cluster_size;
|
bytes = s->cluster_size;
|
||||||
nr = s->cluster_size;
|
nr = s->cluster_size;
|
||||||
ret = qcow2_get_cluster_offset(bs, offset, &nr, &off);
|
ret = qcow2_get_cluster_offset(bs, offset, &nr, &off);
|
||||||
|
@ -3150,12 +3172,13 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t offset,
|
||||||
return last_cluster;
|
return last_cluster;
|
||||||
}
|
}
|
||||||
if ((last_cluster + 1) * s->cluster_size < old_file_size) {
|
if ((last_cluster + 1) * s->cluster_size < old_file_size) {
|
||||||
ret = bdrv_truncate(bs->file, (last_cluster + 1) * s->cluster_size,
|
Error *local_err = NULL;
|
||||||
PREALLOC_MODE_OFF, NULL);
|
|
||||||
if (ret < 0) {
|
bdrv_truncate(bs->file, (last_cluster + 1) * s->cluster_size,
|
||||||
warn_report("Failed to truncate the tail of the image: %s",
|
PREALLOC_MODE_OFF, &local_err);
|
||||||
strerror(-ret));
|
if (local_err) {
|
||||||
ret = 0;
|
warn_reportf_err(local_err,
|
||||||
|
"Failed to truncate the tail of the image: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -3192,6 +3215,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t offset,
|
||||||
"Failed to inquire current file length");
|
"Failed to inquire current file length");
|
||||||
return old_file_size;
|
return old_file_size;
|
||||||
}
|
}
|
||||||
|
old_file_size = ROUND_UP(old_file_size, s->cluster_size);
|
||||||
|
|
||||||
nb_new_data_clusters = DIV_ROUND_UP(offset - old_length,
|
nb_new_data_clusters = DIV_ROUND_UP(offset - old_length,
|
||||||
s->cluster_size);
|
s->cluster_size);
|
||||||
|
@ -3697,19 +3721,14 @@ static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, BlockDriverState *in_bs,
|
||||||
required = virtual_size;
|
required = virtual_size;
|
||||||
} else {
|
} else {
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
int pnum = 0;
|
int64_t pnum = 0;
|
||||||
|
|
||||||
for (offset = 0; offset < ssize;
|
for (offset = 0; offset < ssize; offset += pnum) {
|
||||||
offset += pnum * BDRV_SECTOR_SIZE) {
|
int ret;
|
||||||
int nb_sectors = MIN(ssize - offset,
|
|
||||||
BDRV_REQUEST_MAX_BYTES) / BDRV_SECTOR_SIZE;
|
|
||||||
BlockDriverState *file;
|
|
||||||
int64_t ret;
|
|
||||||
|
|
||||||
ret = bdrv_get_block_status_above(in_bs, NULL,
|
ret = bdrv_block_status_above(in_bs, NULL, offset,
|
||||||
offset >> BDRV_SECTOR_BITS,
|
ssize - offset, &pnum, NULL,
|
||||||
nb_sectors,
|
NULL);
|
||||||
&pnum, &file);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg_errno(&local_err, -ret,
|
error_setg_errno(&local_err, -ret,
|
||||||
"Unable to get block status");
|
"Unable to get block status");
|
||||||
|
@ -3721,11 +3740,10 @@ static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, BlockDriverState *in_bs,
|
||||||
} else if ((ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED)) ==
|
} else if ((ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED)) ==
|
||||||
(BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED)) {
|
(BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED)) {
|
||||||
/* Extend pnum to end of cluster for next iteration */
|
/* Extend pnum to end of cluster for next iteration */
|
||||||
pnum = (ROUND_UP(offset + pnum * BDRV_SECTOR_SIZE,
|
pnum = ROUND_UP(offset + pnum, cluster_size) - offset;
|
||||||
cluster_size) - offset) >> BDRV_SECTOR_BITS;
|
|
||||||
|
|
||||||
/* Count clusters we've seen */
|
/* Count clusters we've seen */
|
||||||
required += offset % cluster_size + pnum * BDRV_SECTOR_SIZE;
|
required += offset % cluster_size + pnum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ blk_co_pwritev(void *blk, void *bs, int64_t offset, unsigned int bytes, int flag
|
||||||
bdrv_co_preadv(void *bs, int64_t offset, int64_t nbytes, unsigned int flags) "bs %p offset %"PRId64" nbytes %"PRId64" flags 0x%x"
|
bdrv_co_preadv(void *bs, int64_t offset, int64_t nbytes, unsigned int flags) "bs %p offset %"PRId64" nbytes %"PRId64" flags 0x%x"
|
||||||
bdrv_co_pwritev(void *bs, int64_t offset, int64_t nbytes, unsigned int flags) "bs %p offset %"PRId64" nbytes %"PRId64" flags 0x%x"
|
bdrv_co_pwritev(void *bs, int64_t offset, int64_t nbytes, unsigned int flags) "bs %p offset %"PRId64" nbytes %"PRId64" flags 0x%x"
|
||||||
bdrv_co_pwrite_zeroes(void *bs, int64_t offset, int count, int flags) "bs %p offset %"PRId64" count %d flags 0x%x"
|
bdrv_co_pwrite_zeroes(void *bs, int64_t offset, int count, int flags) "bs %p offset %"PRId64" count %d flags 0x%x"
|
||||||
bdrv_co_do_copy_on_readv(void *bs, int64_t offset, unsigned int bytes, int64_t cluster_offset, unsigned int cluster_bytes) "bs %p offset %"PRId64" bytes %u cluster_offset %"PRId64" cluster_bytes %u"
|
bdrv_co_do_copy_on_readv(void *bs, int64_t offset, unsigned int bytes, int64_t cluster_offset, int64_t cluster_bytes) "bs %p offset %"PRId64" bytes %u cluster_offset %"PRId64" cluster_bytes %"PRId64
|
||||||
|
|
||||||
# block/stream.c
|
# block/stream.c
|
||||||
stream_one_iteration(void *s, int64_t offset, uint64_t bytes, int is_allocated) "s %p offset %" PRId64 " bytes %" PRIu64 " is_allocated %d"
|
stream_one_iteration(void *s, int64_t offset, uint64_t bytes, int is_allocated) "s %p offset %" PRId64 " bytes %" PRIu64 " is_allocated %d"
|
||||||
|
|
|
@ -121,7 +121,7 @@ typedef struct HDGeometry {
|
||||||
#define BDRV_REQUEST_MAX_BYTES (BDRV_REQUEST_MAX_SECTORS << BDRV_SECTOR_BITS)
|
#define BDRV_REQUEST_MAX_BYTES (BDRV_REQUEST_MAX_SECTORS << BDRV_SECTOR_BITS)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocation status flags for bdrv_get_block_status() and friends.
|
* Allocation status flags for bdrv_block_status() and friends.
|
||||||
*
|
*
|
||||||
* Public flags:
|
* Public flags:
|
||||||
* BDRV_BLOCK_DATA: allocation for data at offset is tied to this layer
|
* BDRV_BLOCK_DATA: allocation for data at offset is tied to this layer
|
||||||
|
@ -136,10 +136,11 @@ typedef struct HDGeometry {
|
||||||
* that the block layer recompute the answer from the returned
|
* that the block layer recompute the answer from the returned
|
||||||
* BDS; must be accompanied by just BDRV_BLOCK_OFFSET_VALID.
|
* BDS; must be accompanied by just BDRV_BLOCK_OFFSET_VALID.
|
||||||
*
|
*
|
||||||
* If BDRV_BLOCK_OFFSET_VALID is set, bits 9-62 (BDRV_BLOCK_OFFSET_MASK)
|
* If BDRV_BLOCK_OFFSET_VALID is set, bits 9-62 (BDRV_BLOCK_OFFSET_MASK) of
|
||||||
* represent the offset in the returned BDS that is allocated for the
|
* the return value (old interface) or the entire map parameter (new
|
||||||
* corresponding raw data; however, whether that offset actually contains
|
* interface) represent the offset in the returned BDS that is allocated for
|
||||||
* data also depends on BDRV_BLOCK_DATA and BDRV_BLOCK_ZERO, as follows:
|
* the corresponding raw data. However, whether that offset actually
|
||||||
|
* contains data also depends on BDRV_BLOCK_DATA, as follows:
|
||||||
*
|
*
|
||||||
* DATA ZERO OFFSET_VALID
|
* DATA ZERO OFFSET_VALID
|
||||||
* t t t sectors read as zero, returned file is zero at offset
|
* t t t sectors read as zero, returned file is zero at offset
|
||||||
|
@ -421,14 +422,12 @@ int bdrv_has_zero_init_1(BlockDriverState *bs);
|
||||||
int bdrv_has_zero_init(BlockDriverState *bs);
|
int bdrv_has_zero_init(BlockDriverState *bs);
|
||||||
bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs);
|
bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs);
|
||||||
bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs);
|
bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs);
|
||||||
int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num,
|
int bdrv_block_status(BlockDriverState *bs, int64_t offset,
|
||||||
int nb_sectors, int *pnum,
|
int64_t bytes, int64_t *pnum, int64_t *map,
|
||||||
BlockDriverState **file);
|
BlockDriverState **file);
|
||||||
int64_t bdrv_get_block_status_above(BlockDriverState *bs,
|
int bdrv_block_status_above(BlockDriverState *bs, BlockDriverState *base,
|
||||||
BlockDriverState *base,
|
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||||
int64_t sector_num,
|
int64_t *map, BlockDriverState **file);
|
||||||
int nb_sectors, int *pnum,
|
|
||||||
BlockDriverState **file);
|
|
||||||
int bdrv_is_allocated(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
int bdrv_is_allocated(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||||
int64_t *pnum);
|
int64_t *pnum);
|
||||||
int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
|
int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
|
||||||
|
@ -474,9 +473,9 @@ int bdrv_get_flags(BlockDriverState *bs);
|
||||||
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs);
|
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs);
|
||||||
void bdrv_round_to_clusters(BlockDriverState *bs,
|
void bdrv_round_to_clusters(BlockDriverState *bs,
|
||||||
int64_t offset, unsigned int bytes,
|
int64_t offset, int64_t bytes,
|
||||||
int64_t *cluster_offset,
|
int64_t *cluster_offset,
|
||||||
unsigned int *cluster_bytes);
|
int64_t *cluster_bytes);
|
||||||
|
|
||||||
const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
|
const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
|
||||||
void bdrv_get_backing_filename(BlockDriverState *bs,
|
void bdrv_get_backing_filename(BlockDriverState *bs,
|
||||||
|
|
|
@ -202,10 +202,13 @@ struct BlockDriver {
|
||||||
int64_t offset, int bytes);
|
int64_t offset, int bytes);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Building block for bdrv_block_status[_above]. The driver should
|
* Building block for bdrv_block_status[_above] and
|
||||||
* answer only according to the current layer, and should not
|
* bdrv_is_allocated[_above]. The driver should answer only
|
||||||
* set BDRV_BLOCK_ALLOCATED, but may set BDRV_BLOCK_RAW. See block.h
|
* according to the current layer, and should not set
|
||||||
* for the meaning of _DATA, _ZERO, and _OFFSET_VALID.
|
* BDRV_BLOCK_ALLOCATED, but may set BDRV_BLOCK_RAW. See block.h
|
||||||
|
* for the meaning of _DATA, _ZERO, and _OFFSET_VALID. The block
|
||||||
|
* layer guarantees input aligned to request_alignment, as well as
|
||||||
|
* non-NULL pnum and file.
|
||||||
*/
|
*/
|
||||||
int64_t coroutine_fn (*bdrv_co_get_block_status)(BlockDriverState *bs,
|
int64_t coroutine_fn (*bdrv_co_get_block_status)(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors, int *pnum,
|
int64_t sector_num, int nb_sectors, int *pnum,
|
||||||
|
|
389
qemu-img.c
389
qemu-img.c
|
@ -1064,6 +1064,28 @@ done:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns -1 if 'buf' contains only zeroes, otherwise the byte index
|
||||||
|
* of the first sector boundary within buf where the sector contains a
|
||||||
|
* non-zero byte. This function is robust to a buffer that is not
|
||||||
|
* sector-aligned.
|
||||||
|
*/
|
||||||
|
static int64_t find_nonzero(const uint8_t *buf, int64_t n)
|
||||||
|
{
|
||||||
|
int64_t i;
|
||||||
|
int64_t end = QEMU_ALIGN_DOWN(n, BDRV_SECTOR_SIZE);
|
||||||
|
|
||||||
|
for (i = 0; i < end; i += BDRV_SECTOR_SIZE) {
|
||||||
|
if (!buffer_is_zero(buf + i, BDRV_SECTOR_SIZE)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i < n && !buffer_is_zero(buf + i, n - end)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns true iff the first sector pointed to by 'buf' contains at least
|
* Returns true iff the first sector pointed to by 'buf' contains at least
|
||||||
* a non-NUL byte.
|
* a non-NUL byte.
|
||||||
|
@ -1134,31 +1156,28 @@ static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compares two buffers sector by sector. Returns 0 if the first sector of both
|
* Compares two buffers sector by sector. Returns 0 if the first
|
||||||
* buffers matches, non-zero otherwise.
|
* sector of each buffer matches, non-zero otherwise.
|
||||||
*
|
*
|
||||||
* pnum is set to the number of sectors (including and immediately following
|
* pnum is set to the sector-aligned size of the buffer prefix that
|
||||||
* the first one) that are known to have the same comparison result
|
* has the same matching status as the first sector.
|
||||||
*/
|
*/
|
||||||
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
|
static int compare_buffers(const uint8_t *buf1, const uint8_t *buf2,
|
||||||
int *pnum)
|
int64_t bytes, int64_t *pnum)
|
||||||
{
|
{
|
||||||
bool res;
|
bool res;
|
||||||
int i;
|
int64_t i = MIN(bytes, BDRV_SECTOR_SIZE);
|
||||||
|
|
||||||
if (n <= 0) {
|
assert(bytes > 0);
|
||||||
*pnum = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = !!memcmp(buf1, buf2, 512);
|
res = !!memcmp(buf1, buf2, i);
|
||||||
for(i = 1; i < n; i++) {
|
while (i < bytes) {
|
||||||
buf1 += 512;
|
int64_t len = MIN(bytes - i, BDRV_SECTOR_SIZE);
|
||||||
buf2 += 512;
|
|
||||||
|
|
||||||
if (!!memcmp(buf1, buf2, 512) != res) {
|
if (!!memcmp(buf1 + i, buf2 + i, len) != res) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
i += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pnum = i;
|
*pnum = i;
|
||||||
|
@ -1167,45 +1186,38 @@ static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
|
||||||
|
|
||||||
#define IO_BUF_SIZE (2 * 1024 * 1024)
|
#define IO_BUF_SIZE (2 * 1024 * 1024)
|
||||||
|
|
||||||
static int64_t sectors_to_bytes(int64_t sectors)
|
|
||||||
{
|
|
||||||
return sectors << BDRV_SECTOR_BITS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t sectors_to_process(int64_t total, int64_t from)
|
|
||||||
{
|
|
||||||
return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if passed sectors are empty (not allocated or contain only 0 bytes)
|
* Check if passed sectors are empty (not allocated or contain only 0 bytes)
|
||||||
*
|
*
|
||||||
* Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
|
* Intended for use by 'qemu-img compare': Returns 0 in case sectors are
|
||||||
* data and negative value on error.
|
* filled with 0, 1 if sectors contain non-zero data (this is a comparison
|
||||||
|
* failure), and 4 on error (the exit status for read errors), after emitting
|
||||||
|
* an error message.
|
||||||
*
|
*
|
||||||
* @param blk: BlockBackend for the image
|
* @param blk: BlockBackend for the image
|
||||||
* @param sect_num: Number of first sector to check
|
* @param offset: Starting offset to check
|
||||||
* @param sect_count: Number of sectors to check
|
* @param bytes: Number of bytes to check
|
||||||
* @param filename: Name of disk file we are checking (logging purpose)
|
* @param filename: Name of disk file we are checking (logging purpose)
|
||||||
* @param buffer: Allocated buffer for storing read data
|
* @param buffer: Allocated buffer for storing read data
|
||||||
* @param quiet: Flag for quiet mode
|
* @param quiet: Flag for quiet mode
|
||||||
*/
|
*/
|
||||||
static int check_empty_sectors(BlockBackend *blk, int64_t sect_num,
|
static int check_empty_sectors(BlockBackend *blk, int64_t offset,
|
||||||
int sect_count, const char *filename,
|
int64_t bytes, const char *filename,
|
||||||
uint8_t *buffer, bool quiet)
|
uint8_t *buffer, bool quiet)
|
||||||
{
|
{
|
||||||
int pnum, ret = 0;
|
int ret = 0;
|
||||||
ret = blk_pread(blk, sect_num << BDRV_SECTOR_BITS, buffer,
|
int64_t idx;
|
||||||
sect_count << BDRV_SECTOR_BITS);
|
|
||||||
|
ret = blk_pread(blk, offset, buffer, bytes);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("Error while reading offset %" PRId64 " of %s: %s",
|
error_report("Error while reading offset %" PRId64 " of %s: %s",
|
||||||
sectors_to_bytes(sect_num), filename, strerror(-ret));
|
offset, filename, strerror(-ret));
|
||||||
return ret;
|
return 4;
|
||||||
}
|
}
|
||||||
ret = is_allocated_sectors(buffer, sect_count, &pnum);
|
idx = find_nonzero(buffer, bytes);
|
||||||
if (ret || pnum != sect_count) {
|
if (idx >= 0) {
|
||||||
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
||||||
sectors_to_bytes(ret ? sect_num : sect_num + pnum));
|
offset + idx);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1224,18 +1236,18 @@ static int img_compare(int argc, char **argv)
|
||||||
const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
|
const char *fmt1 = NULL, *fmt2 = NULL, *cache, *filename1, *filename2;
|
||||||
BlockBackend *blk1, *blk2;
|
BlockBackend *blk1, *blk2;
|
||||||
BlockDriverState *bs1, *bs2;
|
BlockDriverState *bs1, *bs2;
|
||||||
int64_t total_sectors1, total_sectors2;
|
int64_t total_size1, total_size2;
|
||||||
uint8_t *buf1 = NULL, *buf2 = NULL;
|
uint8_t *buf1 = NULL, *buf2 = NULL;
|
||||||
int pnum1, pnum2;
|
int64_t pnum1, pnum2;
|
||||||
int allocated1, allocated2;
|
int allocated1, allocated2;
|
||||||
int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
|
int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
|
||||||
bool progress = false, quiet = false, strict = false;
|
bool progress = false, quiet = false, strict = false;
|
||||||
int flags;
|
int flags;
|
||||||
bool writethrough;
|
bool writethrough;
|
||||||
int64_t total_sectors;
|
int64_t total_size;
|
||||||
int64_t sector_num = 0;
|
int64_t offset = 0;
|
||||||
int64_t nb_sectors;
|
int64_t chunk;
|
||||||
int c, pnum;
|
int c;
|
||||||
uint64_t progress_base;
|
uint64_t progress_base;
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
bool force_share = false;
|
bool force_share = false;
|
||||||
|
@ -1348,42 +1360,37 @@ static int img_compare(int argc, char **argv)
|
||||||
|
|
||||||
buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
|
buf1 = blk_blockalign(blk1, IO_BUF_SIZE);
|
||||||
buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
|
buf2 = blk_blockalign(blk2, IO_BUF_SIZE);
|
||||||
total_sectors1 = blk_nb_sectors(blk1);
|
total_size1 = blk_getlength(blk1);
|
||||||
if (total_sectors1 < 0) {
|
if (total_size1 < 0) {
|
||||||
error_report("Can't get size of %s: %s",
|
error_report("Can't get size of %s: %s",
|
||||||
filename1, strerror(-total_sectors1));
|
filename1, strerror(-total_size1));
|
||||||
ret = 4;
|
ret = 4;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
total_sectors2 = blk_nb_sectors(blk2);
|
total_size2 = blk_getlength(blk2);
|
||||||
if (total_sectors2 < 0) {
|
if (total_size2 < 0) {
|
||||||
error_report("Can't get size of %s: %s",
|
error_report("Can't get size of %s: %s",
|
||||||
filename2, strerror(-total_sectors2));
|
filename2, strerror(-total_size2));
|
||||||
ret = 4;
|
ret = 4;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
total_sectors = MIN(total_sectors1, total_sectors2);
|
total_size = MIN(total_size1, total_size2);
|
||||||
progress_base = MAX(total_sectors1, total_sectors2);
|
progress_base = MAX(total_size1, total_size2);
|
||||||
|
|
||||||
qemu_progress_print(0, 100);
|
qemu_progress_print(0, 100);
|
||||||
|
|
||||||
if (strict && total_sectors1 != total_sectors2) {
|
if (strict && total_size1 != total_size2) {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
qprintf(quiet, "Strict mode: Image size mismatch!\n");
|
qprintf(quiet, "Strict mode: Image size mismatch!\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
while (offset < total_size) {
|
||||||
int64_t status1, status2;
|
int status1, status2;
|
||||||
BlockDriverState *file;
|
|
||||||
|
|
||||||
nb_sectors = sectors_to_process(total_sectors, sector_num);
|
status1 = bdrv_block_status_above(bs1, NULL, offset,
|
||||||
if (nb_sectors <= 0) {
|
total_size1 - offset, &pnum1, NULL,
|
||||||
break;
|
NULL);
|
||||||
}
|
|
||||||
status1 = bdrv_get_block_status_above(bs1, NULL, sector_num,
|
|
||||||
total_sectors1 - sector_num,
|
|
||||||
&pnum1, &file);
|
|
||||||
if (status1 < 0) {
|
if (status1 < 0) {
|
||||||
ret = 3;
|
ret = 3;
|
||||||
error_report("Sector allocation test failed for %s", filename1);
|
error_report("Sector allocation test failed for %s", filename1);
|
||||||
|
@ -1391,112 +1398,92 @@ static int img_compare(int argc, char **argv)
|
||||||
}
|
}
|
||||||
allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
|
allocated1 = status1 & BDRV_BLOCK_ALLOCATED;
|
||||||
|
|
||||||
status2 = bdrv_get_block_status_above(bs2, NULL, sector_num,
|
status2 = bdrv_block_status_above(bs2, NULL, offset,
|
||||||
total_sectors2 - sector_num,
|
total_size2 - offset, &pnum2, NULL,
|
||||||
&pnum2, &file);
|
NULL);
|
||||||
if (status2 < 0) {
|
if (status2 < 0) {
|
||||||
ret = 3;
|
ret = 3;
|
||||||
error_report("Sector allocation test failed for %s", filename2);
|
error_report("Sector allocation test failed for %s", filename2);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
|
allocated2 = status2 & BDRV_BLOCK_ALLOCATED;
|
||||||
if (pnum1) {
|
|
||||||
nb_sectors = MIN(nb_sectors, pnum1);
|
assert(pnum1 && pnum2);
|
||||||
}
|
chunk = MIN(pnum1, pnum2);
|
||||||
if (pnum2) {
|
|
||||||
nb_sectors = MIN(nb_sectors, pnum2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strict) {
|
if (strict) {
|
||||||
if ((status1 & ~BDRV_BLOCK_OFFSET_MASK) !=
|
if (status1 != status2) {
|
||||||
(status2 & ~BDRV_BLOCK_OFFSET_MASK)) {
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
qprintf(quiet, "Strict mode: Offset %" PRId64
|
qprintf(quiet, "Strict mode: Offset %" PRId64
|
||||||
" block status mismatch!\n",
|
" block status mismatch!\n", offset);
|
||||||
sectors_to_bytes(sector_num));
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
|
if ((status1 & BDRV_BLOCK_ZERO) && (status2 & BDRV_BLOCK_ZERO)) {
|
||||||
nb_sectors = MIN(pnum1, pnum2);
|
/* nothing to do */
|
||||||
} else if (allocated1 == allocated2) {
|
} else if (allocated1 == allocated2) {
|
||||||
if (allocated1) {
|
if (allocated1) {
|
||||||
ret = blk_pread(blk1, sector_num << BDRV_SECTOR_BITS, buf1,
|
int64_t pnum;
|
||||||
nb_sectors << BDRV_SECTOR_BITS);
|
|
||||||
if (ret < 0) {
|
chunk = MIN(chunk, IO_BUF_SIZE);
|
||||||
error_report("Error while reading offset %" PRId64 " of %s:"
|
ret = blk_pread(blk1, offset, buf1, chunk);
|
||||||
" %s", sectors_to_bytes(sector_num), filename1,
|
|
||||||
strerror(-ret));
|
|
||||||
ret = 4;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = blk_pread(blk2, sector_num << BDRV_SECTOR_BITS, buf2,
|
|
||||||
nb_sectors << BDRV_SECTOR_BITS);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("Error while reading offset %" PRId64
|
error_report("Error while reading offset %" PRId64
|
||||||
" of %s: %s", sectors_to_bytes(sector_num),
|
" of %s: %s",
|
||||||
filename2, strerror(-ret));
|
offset, filename1, strerror(-ret));
|
||||||
ret = 4;
|
ret = 4;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
|
ret = blk_pread(blk2, offset, buf2, chunk);
|
||||||
if (ret || pnum != nb_sectors) {
|
if (ret < 0) {
|
||||||
|
error_report("Error while reading offset %" PRId64
|
||||||
|
" of %s: %s",
|
||||||
|
offset, filename2, strerror(-ret));
|
||||||
|
ret = 4;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = compare_buffers(buf1, buf2, chunk, &pnum);
|
||||||
|
if (ret || pnum != chunk) {
|
||||||
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
||||||
sectors_to_bytes(
|
offset + (ret ? 0 : pnum));
|
||||||
ret ? sector_num : sector_num + pnum));
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
chunk = MIN(chunk, IO_BUF_SIZE);
|
||||||
if (allocated1) {
|
if (allocated1) {
|
||||||
ret = check_empty_sectors(blk1, sector_num, nb_sectors,
|
ret = check_empty_sectors(blk1, offset, chunk,
|
||||||
filename1, buf1, quiet);
|
filename1, buf1, quiet);
|
||||||
} else {
|
} else {
|
||||||
ret = check_empty_sectors(blk2, sector_num, nb_sectors,
|
ret = check_empty_sectors(blk2, offset, chunk,
|
||||||
filename2, buf1, quiet);
|
filename2, buf1, quiet);
|
||||||
}
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret < 0) {
|
|
||||||
error_report("Error while reading offset %" PRId64 ": %s",
|
|
||||||
sectors_to_bytes(sector_num), strerror(-ret));
|
|
||||||
ret = 4;
|
|
||||||
}
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sector_num += nb_sectors;
|
offset += chunk;
|
||||||
qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
|
qemu_progress_print(((float) chunk / progress_base) * 100, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (total_sectors1 != total_sectors2) {
|
if (total_size1 != total_size2) {
|
||||||
BlockBackend *blk_over;
|
BlockBackend *blk_over;
|
||||||
int64_t total_sectors_over;
|
|
||||||
const char *filename_over;
|
const char *filename_over;
|
||||||
|
|
||||||
qprintf(quiet, "Warning: Image size mismatch!\n");
|
qprintf(quiet, "Warning: Image size mismatch!\n");
|
||||||
if (total_sectors1 > total_sectors2) {
|
if (total_size1 > total_size2) {
|
||||||
total_sectors_over = total_sectors1;
|
|
||||||
blk_over = blk1;
|
blk_over = blk1;
|
||||||
filename_over = filename1;
|
filename_over = filename1;
|
||||||
} else {
|
} else {
|
||||||
total_sectors_over = total_sectors2;
|
|
||||||
blk_over = blk2;
|
blk_over = blk2;
|
||||||
filename_over = filename2;
|
filename_over = filename2;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
while (offset < progress_base) {
|
||||||
int64_t count;
|
ret = bdrv_block_status_above(blk_bs(blk_over), NULL, offset,
|
||||||
|
progress_base - offset, &chunk,
|
||||||
nb_sectors = sectors_to_process(total_sectors_over, sector_num);
|
NULL, NULL);
|
||||||
if (nb_sectors <= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ret = bdrv_is_allocated_above(blk_bs(blk_over), NULL,
|
|
||||||
sector_num * BDRV_SECTOR_SIZE,
|
|
||||||
nb_sectors * BDRV_SECTOR_SIZE,
|
|
||||||
&count);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = 3;
|
ret = 3;
|
||||||
error_report("Sector allocation test failed for %s",
|
error_report("Sector allocation test failed for %s",
|
||||||
|
@ -1504,25 +1491,16 @@ static int img_compare(int argc, char **argv)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
}
|
}
|
||||||
/* TODO relax this once bdrv_is_allocated_above does not enforce
|
if (ret & BDRV_BLOCK_ALLOCATED && !(ret & BDRV_BLOCK_ZERO)) {
|
||||||
* sector alignment */
|
chunk = MIN(chunk, IO_BUF_SIZE);
|
||||||
assert(QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE));
|
ret = check_empty_sectors(blk_over, offset, chunk,
|
||||||
nb_sectors = count >> BDRV_SECTOR_BITS;
|
|
||||||
if (ret) {
|
|
||||||
ret = check_empty_sectors(blk_over, sector_num, nb_sectors,
|
|
||||||
filename_over, buf1, quiet);
|
filename_over, buf1, quiet);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret < 0) {
|
|
||||||
error_report("Error while reading offset %" PRId64
|
|
||||||
" of %s: %s", sectors_to_bytes(sector_num),
|
|
||||||
filename_over, strerror(-ret));
|
|
||||||
ret = 4;
|
|
||||||
}
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sector_num += nb_sectors;
|
offset += chunk;
|
||||||
qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
|
qemu_progress_print(((float) chunk / progress_base) * 100, 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1590,8 +1568,8 @@ static void convert_select_part(ImgConvertState *s, int64_t sector_num,
|
||||||
|
|
||||||
static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
||||||
{
|
{
|
||||||
int64_t ret, src_cur_offset;
|
int64_t src_cur_offset;
|
||||||
int n, src_cur;
|
int ret, n, src_cur;
|
||||||
|
|
||||||
convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
|
convert_select_part(s, sector_num, &src_cur, &src_cur_offset);
|
||||||
|
|
||||||
|
@ -1599,19 +1577,24 @@ static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
||||||
n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
|
n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
|
||||||
|
|
||||||
if (s->sector_next_status <= sector_num) {
|
if (s->sector_next_status <= sector_num) {
|
||||||
BlockDriverState *file;
|
int64_t count = n * BDRV_SECTOR_SIZE;
|
||||||
|
|
||||||
if (s->target_has_backing) {
|
if (s->target_has_backing) {
|
||||||
ret = bdrv_get_block_status(blk_bs(s->src[src_cur]),
|
|
||||||
sector_num - src_cur_offset,
|
ret = bdrv_block_status(blk_bs(s->src[src_cur]),
|
||||||
n, &n, &file);
|
(sector_num - src_cur_offset) *
|
||||||
|
BDRV_SECTOR_SIZE,
|
||||||
|
count, &count, NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
ret = bdrv_get_block_status_above(blk_bs(s->src[src_cur]), NULL,
|
ret = bdrv_block_status_above(blk_bs(s->src[src_cur]), NULL,
|
||||||
sector_num - src_cur_offset,
|
(sector_num - src_cur_offset) *
|
||||||
n, &n, &file);
|
BDRV_SECTOR_SIZE,
|
||||||
|
count, &count, NULL, NULL);
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
n = DIV_ROUND_UP(count, BDRV_SECTOR_SIZE);
|
||||||
|
|
||||||
if (ret & BDRV_BLOCK_ZERO) {
|
if (ret & BDRV_BLOCK_ZERO) {
|
||||||
s->status = BLK_ZERO;
|
s->status = BLK_ZERO;
|
||||||
|
@ -2673,13 +2656,14 @@ static void dump_map_entry(OutputFormat output_format, MapEntry *e,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_block_status(BlockDriverState *bs, int64_t sector_num,
|
static int get_block_status(BlockDriverState *bs, int64_t offset,
|
||||||
int nb_sectors, MapEntry *e)
|
int64_t bytes, MapEntry *e)
|
||||||
{
|
{
|
||||||
int64_t ret;
|
int ret;
|
||||||
int depth;
|
int depth;
|
||||||
BlockDriverState *file;
|
BlockDriverState *file;
|
||||||
bool has_offset;
|
bool has_offset;
|
||||||
|
int64_t map;
|
||||||
|
|
||||||
/* As an optimization, we could cache the current range of unallocated
|
/* As an optimization, we could cache the current range of unallocated
|
||||||
* clusters in each file of the chain, and avoid querying the same
|
* clusters in each file of the chain, and avoid querying the same
|
||||||
|
@ -2688,12 +2672,11 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num,
|
||||||
|
|
||||||
depth = 0;
|
depth = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors,
|
ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file);
|
||||||
&file);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
assert(nb_sectors);
|
assert(bytes);
|
||||||
if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
|
if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2709,11 +2692,11 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num,
|
||||||
has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
|
has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
|
||||||
|
|
||||||
*e = (MapEntry) {
|
*e = (MapEntry) {
|
||||||
.start = sector_num * BDRV_SECTOR_SIZE,
|
.start = offset,
|
||||||
.length = nb_sectors * BDRV_SECTOR_SIZE,
|
.length = bytes,
|
||||||
.data = !!(ret & BDRV_BLOCK_DATA),
|
.data = !!(ret & BDRV_BLOCK_DATA),
|
||||||
.zero = !!(ret & BDRV_BLOCK_ZERO),
|
.zero = !!(ret & BDRV_BLOCK_ZERO),
|
||||||
.offset = ret & BDRV_BLOCK_OFFSET_MASK,
|
.offset = map,
|
||||||
.has_offset = has_offset,
|
.has_offset = has_offset,
|
||||||
.depth = depth,
|
.depth = depth,
|
||||||
.has_filename = file && has_offset,
|
.has_filename = file && has_offset,
|
||||||
|
@ -2839,16 +2822,12 @@ static int img_map(int argc, char **argv)
|
||||||
|
|
||||||
length = blk_getlength(blk);
|
length = blk_getlength(blk);
|
||||||
while (curr.start + curr.length < length) {
|
while (curr.start + curr.length < length) {
|
||||||
int64_t nsectors_left;
|
int64_t offset = curr.start + curr.length;
|
||||||
int64_t sector_num;
|
int64_t n;
|
||||||
int n;
|
|
||||||
|
|
||||||
sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
|
|
||||||
|
|
||||||
/* Probe up to 1 GiB at a time. */
|
/* Probe up to 1 GiB at a time. */
|
||||||
nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
|
n = QEMU_ALIGN_DOWN(MIN(1 << 30, length - offset), BDRV_SECTOR_SIZE);
|
||||||
n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
|
ret = get_block_status(bs, offset, n, &next);
|
||||||
ret = get_block_status(bs, sector_num, n, &next);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("Could not read file metadata: %s", strerror(-ret));
|
error_report("Could not read file metadata: %s", strerror(-ret));
|
||||||
|
@ -3241,70 +3220,58 @@ static int img_rebase(int argc, char **argv)
|
||||||
* the image is the same as the original one at any time.
|
* the image is the same as the original one at any time.
|
||||||
*/
|
*/
|
||||||
if (!unsafe) {
|
if (!unsafe) {
|
||||||
int64_t num_sectors;
|
int64_t size;
|
||||||
int64_t old_backing_num_sectors;
|
int64_t old_backing_size;
|
||||||
int64_t new_backing_num_sectors = 0;
|
int64_t new_backing_size = 0;
|
||||||
uint64_t sector;
|
uint64_t offset;
|
||||||
int n;
|
int64_t n;
|
||||||
int64_t count;
|
|
||||||
float local_progress = 0;
|
float local_progress = 0;
|
||||||
|
|
||||||
buf_old = blk_blockalign(blk, IO_BUF_SIZE);
|
buf_old = blk_blockalign(blk, IO_BUF_SIZE);
|
||||||
buf_new = blk_blockalign(blk, IO_BUF_SIZE);
|
buf_new = blk_blockalign(blk, IO_BUF_SIZE);
|
||||||
|
|
||||||
num_sectors = blk_nb_sectors(blk);
|
size = blk_getlength(blk);
|
||||||
if (num_sectors < 0) {
|
if (size < 0) {
|
||||||
error_report("Could not get size of '%s': %s",
|
error_report("Could not get size of '%s': %s",
|
||||||
filename, strerror(-num_sectors));
|
filename, strerror(-size));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
old_backing_num_sectors = blk_nb_sectors(blk_old_backing);
|
old_backing_size = blk_getlength(blk_old_backing);
|
||||||
if (old_backing_num_sectors < 0) {
|
if (old_backing_size < 0) {
|
||||||
char backing_name[PATH_MAX];
|
char backing_name[PATH_MAX];
|
||||||
|
|
||||||
bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
|
bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
|
||||||
error_report("Could not get size of '%s': %s",
|
error_report("Could not get size of '%s': %s",
|
||||||
backing_name, strerror(-old_backing_num_sectors));
|
backing_name, strerror(-old_backing_size));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (blk_new_backing) {
|
if (blk_new_backing) {
|
||||||
new_backing_num_sectors = blk_nb_sectors(blk_new_backing);
|
new_backing_size = blk_getlength(blk_new_backing);
|
||||||
if (new_backing_num_sectors < 0) {
|
if (new_backing_size < 0) {
|
||||||
error_report("Could not get size of '%s': %s",
|
error_report("Could not get size of '%s': %s",
|
||||||
out_baseimg, strerror(-new_backing_num_sectors));
|
out_baseimg, strerror(-new_backing_size));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_sectors != 0) {
|
if (size != 0) {
|
||||||
local_progress = (float)100 /
|
local_progress = (float)100 / (size / MIN(size, IO_BUF_SIZE));
|
||||||
(num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (sector = 0; sector < num_sectors; sector += n) {
|
for (offset = 0; offset < size; offset += n) {
|
||||||
|
/* How many bytes can we handle with the next read? */
|
||||||
/* How many sectors can we handle with the next read? */
|
n = MIN(IO_BUF_SIZE, size - offset);
|
||||||
if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
|
|
||||||
n = (IO_BUF_SIZE / 512);
|
|
||||||
} else {
|
|
||||||
n = num_sectors - sector;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the cluster is allocated, we don't need to take action */
|
/* If the cluster is allocated, we don't need to take action */
|
||||||
ret = bdrv_is_allocated(bs, sector << BDRV_SECTOR_BITS,
|
ret = bdrv_is_allocated(bs, offset, n, &n);
|
||||||
n << BDRV_SECTOR_BITS, &count);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error while reading image metadata: %s",
|
error_report("error while reading image metadata: %s",
|
||||||
strerror(-ret));
|
strerror(-ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* TODO relax this once bdrv_is_allocated does not enforce
|
|
||||||
* sector alignment */
|
|
||||||
assert(QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE));
|
|
||||||
n = count >> BDRV_SECTOR_BITS;
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3313,30 +3280,28 @@ static int img_rebase(int argc, char **argv)
|
||||||
* Read old and new backing file and take into consideration that
|
* Read old and new backing file and take into consideration that
|
||||||
* backing files may be smaller than the COW image.
|
* backing files may be smaller than the COW image.
|
||||||
*/
|
*/
|
||||||
if (sector >= old_backing_num_sectors) {
|
if (offset >= old_backing_size) {
|
||||||
memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
|
memset(buf_old, 0, n);
|
||||||
} else {
|
} else {
|
||||||
if (sector + n > old_backing_num_sectors) {
|
if (offset + n > old_backing_size) {
|
||||||
n = old_backing_num_sectors - sector;
|
n = old_backing_size - offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = blk_pread(blk_old_backing, sector << BDRV_SECTOR_BITS,
|
ret = blk_pread(blk_old_backing, offset, buf_old, n);
|
||||||
buf_old, n << BDRV_SECTOR_BITS);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error while reading from old backing file");
|
error_report("error while reading from old backing file");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sector >= new_backing_num_sectors || !blk_new_backing) {
|
if (offset >= new_backing_size || !blk_new_backing) {
|
||||||
memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
|
memset(buf_new, 0, n);
|
||||||
} else {
|
} else {
|
||||||
if (sector + n > new_backing_num_sectors) {
|
if (offset + n > new_backing_size) {
|
||||||
n = new_backing_num_sectors - sector;
|
n = new_backing_size - offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = blk_pread(blk_new_backing, sector << BDRV_SECTOR_BITS,
|
ret = blk_pread(blk_new_backing, offset, buf_new, n);
|
||||||
buf_new, n << BDRV_SECTOR_BITS);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error while reading from new backing file");
|
error_report("error while reading from new backing file");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -3347,15 +3312,13 @@ static int img_rebase(int argc, char **argv)
|
||||||
uint64_t written = 0;
|
uint64_t written = 0;
|
||||||
|
|
||||||
while (written < n) {
|
while (written < n) {
|
||||||
int pnum;
|
int64_t pnum;
|
||||||
|
|
||||||
if (compare_sectors(buf_old + written * 512,
|
if (compare_buffers(buf_old + written, buf_new + written,
|
||||||
buf_new + written * 512, n - written, &pnum))
|
n - written, &pnum))
|
||||||
{
|
{
|
||||||
ret = blk_pwrite(blk,
|
ret = blk_pwrite(blk, offset + written,
|
||||||
(sector + written) << BDRV_SECTOR_BITS,
|
buf_old + written, pnum, 0);
|
||||||
buf_old + written * 512,
|
|
||||||
pnum << BDRV_SECTOR_BITS, 0);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("Error while writing to COW image: %s",
|
error_report("Error while writing to COW image: %s",
|
||||||
strerror(-ret));
|
strerror(-ret));
|
||||||
|
|
|
@ -274,11 +274,10 @@ If the backing chain of the given image file @var{filename} has more than one
|
||||||
layer, the backing file into which the changes will be committed may be
|
layer, the backing file into which the changes will be committed may be
|
||||||
specified as @var{base} (which has to be part of @var{filename}'s backing
|
specified as @var{base} (which has to be part of @var{filename}'s backing
|
||||||
chain). If @var{base} is not specified, the immediate backing file of the top
|
chain). If @var{base} is not specified, the immediate backing file of the top
|
||||||
image (which is @var{filename}) will be used. For reasons of consistency,
|
image (which is @var{filename}) will be used. Note that after a commit operation
|
||||||
explicitly specifying @var{base} will always imply @code{-d} (since emptying an
|
all images between @var{base} and the top image will be invalid and may return
|
||||||
image after committing to an indirect backing file would lead to different data
|
garbage data when read. For this reason, @code{-b} implies @code{-d} (so that
|
||||||
being read from the image due to content in the intermediate backing chain
|
the top image stays valid).
|
||||||
overruling the commit target).
|
|
||||||
|
|
||||||
@item compare [-f @var{fmt}] [-F @var{fmt}] [-T @var{src_cache}] [-p] [-s] [-q] @var{filename1} @var{filename2}
|
@item compare [-f @var{fmt}] [-F @var{fmt}] [-T @var{src_cache}] [-p] [-s] [-q] @var{filename1} @var{filename2}
|
||||||
|
|
||||||
|
|
|
@ -1769,10 +1769,6 @@ static int alloc_f(BlockBackend *blk, int argc, char **argv)
|
||||||
if (offset < 0) {
|
if (offset < 0) {
|
||||||
print_cvtnum_err(offset, argv[1]);
|
print_cvtnum_err(offset, argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (!QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE)) {
|
|
||||||
printf("%" PRId64 " is not a sector-aligned value for 'offset'\n",
|
|
||||||
offset);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc == 3) {
|
if (argc == 3) {
|
||||||
|
@ -1780,19 +1776,10 @@ static int alloc_f(BlockBackend *blk, int argc, char **argv)
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
print_cvtnum_err(count, argv[2]);
|
print_cvtnum_err(count, argv[2]);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (count > INT_MAX * BDRV_SECTOR_SIZE) {
|
|
||||||
printf("length argument cannot exceed %llu, given %s\n",
|
|
||||||
INT_MAX * BDRV_SECTOR_SIZE, argv[2]);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
count = BDRV_SECTOR_SIZE;
|
count = BDRV_SECTOR_SIZE;
|
||||||
}
|
}
|
||||||
if (!QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE)) {
|
|
||||||
printf("%" PRId64 " is not a sector-aligned value for 'count'\n",
|
|
||||||
count);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
remaining = count;
|
remaining = count;
|
||||||
sum_alloc = 0;
|
sum_alloc = 0;
|
||||||
|
|
|
@ -56,7 +56,7 @@ _filter_qmp_events()
|
||||||
function run_qemu()
|
function run_qemu()
|
||||||
{
|
{
|
||||||
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp | _filter_qemu \
|
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp | _filter_qemu \
|
||||||
| sed -e 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g' \
|
| _filter_actual_image_size \
|
||||||
| _filter_generated_node_ids | _filter_qmp_events
|
| _filter_generated_node_ids | _filter_qmp_events
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
|
||||||
wrote 512/512 bytes at offset 512
|
wrote 512/512 bytes at offset 512
|
||||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
|
qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
|
||||||
qemu-img: Error while reading offset 0: Input/output error
|
|
||||||
4
|
4
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
|
||||||
Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=0
|
Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=0
|
||||||
|
@ -12,7 +11,6 @@ Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=0
|
||||||
wrote 512/512 bytes at offset 512
|
wrote 512/512 bytes at offset 512
|
||||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
|
qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
|
||||||
qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
|
|
||||||
Warning: Image size mismatch!
|
Warning: Image size mismatch!
|
||||||
4
|
4
|
||||||
Cleanup
|
Cleanup
|
||||||
|
|
|
@ -46,7 +46,7 @@ function run_qemu()
|
||||||
{
|
{
|
||||||
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
|
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
|
||||||
| _filter_qemu | _filter_imgfmt \
|
| _filter_qemu | _filter_imgfmt \
|
||||||
| sed -e 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g'
|
| _filter_actual_image_size
|
||||||
}
|
}
|
||||||
|
|
||||||
size=128M
|
size=128M
|
||||||
|
|
|
@ -69,13 +69,15 @@ fi
|
||||||
# in B
|
# in B
|
||||||
CREATION_SIZE=$((2 * 1024 * 1024 - 48 * 1024))
|
CREATION_SIZE=$((2 * 1024 * 1024 - 48 * 1024))
|
||||||
|
|
||||||
|
# 512 is the actual test -- but it's good to test 64k as well, just to be sure.
|
||||||
|
for cluster_size in 512 64k; do
|
||||||
# in kB
|
# in kB
|
||||||
for GROWTH_SIZE in 16 48 80; do
|
for GROWTH_SIZE in 16 48 80; do
|
||||||
for create_mode in off metadata falloc full; do
|
for create_mode in off metadata falloc full; do
|
||||||
for growth_mode in off metadata falloc full; do
|
for growth_mode in off metadata falloc full; do
|
||||||
echo "--- growth_size=$GROWTH_SIZE create_mode=$create_mode growth_mode=$growth_mode ---"
|
echo "--- cluster_size=$cluster_size growth_size=$GROWTH_SIZE create_mode=$create_mode growth_mode=$growth_mode ---"
|
||||||
|
|
||||||
IMGOPTS="preallocation=$create_mode,cluster_size=512" _make_test_img ${CREATION_SIZE}
|
IMGOPTS="preallocation=$create_mode,cluster_size=$cluster_size" _make_test_img ${CREATION_SIZE}
|
||||||
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
|
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
|
||||||
|
|
||||||
host_size_0=$(get_image_size_on_host)
|
host_size_0=$(get_image_size_on_host)
|
||||||
|
@ -123,6 +125,7 @@ for GROWTH_SIZE in 16 48 80; do
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
done
|
||||||
|
|
||||||
# success, all done
|
# success, all done
|
||||||
echo '*** done'
|
echo '*** done'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
QA output created by 125
|
QA output created by 125
|
||||||
--- growth_size=16 create_mode=off growth_mode=off ---
|
--- cluster_size=512 growth_size=16 create_mode=off growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -7,7 +7,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=off growth_mode=metadata ---
|
--- cluster_size=512 growth_size=16 create_mode=off growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -15,7 +15,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=off growth_mode=falloc ---
|
--- cluster_size=512 growth_size=16 create_mode=off growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -23,7 +23,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=off growth_mode=full ---
|
--- cluster_size=512 growth_size=16 create_mode=off growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -31,7 +31,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=metadata growth_mode=off ---
|
--- cluster_size=512 growth_size=16 create_mode=metadata growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -39,7 +39,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=metadata growth_mode=metadata ---
|
--- cluster_size=512 growth_size=16 create_mode=metadata growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -47,7 +47,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=metadata growth_mode=falloc ---
|
--- cluster_size=512 growth_size=16 create_mode=metadata growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -55,7 +55,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=metadata growth_mode=full ---
|
--- cluster_size=512 growth_size=16 create_mode=metadata growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -63,7 +63,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=falloc growth_mode=off ---
|
--- cluster_size=512 growth_size=16 create_mode=falloc growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -71,7 +71,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=falloc growth_mode=metadata ---
|
--- cluster_size=512 growth_size=16 create_mode=falloc growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -79,7 +79,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=falloc growth_mode=falloc ---
|
--- cluster_size=512 growth_size=16 create_mode=falloc growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -87,7 +87,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=falloc growth_mode=full ---
|
--- cluster_size=512 growth_size=16 create_mode=falloc growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -95,7 +95,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=full growth_mode=off ---
|
--- cluster_size=512 growth_size=16 create_mode=full growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -103,7 +103,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=full growth_mode=metadata ---
|
--- cluster_size=512 growth_size=16 create_mode=full growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -111,7 +111,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=full growth_mode=falloc ---
|
--- cluster_size=512 growth_size=16 create_mode=full growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -119,7 +119,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=16 create_mode=full growth_mode=full ---
|
--- cluster_size=512 growth_size=16 create_mode=full growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -127,7 +127,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 16384/16384 bytes at offset 2048000
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=off growth_mode=off ---
|
--- cluster_size=512 growth_size=48 create_mode=off growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -135,7 +135,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=off growth_mode=metadata ---
|
--- cluster_size=512 growth_size=48 create_mode=off growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -143,7 +143,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=off growth_mode=falloc ---
|
--- cluster_size=512 growth_size=48 create_mode=off growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -151,7 +151,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=off growth_mode=full ---
|
--- cluster_size=512 growth_size=48 create_mode=off growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -159,7 +159,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=metadata growth_mode=off ---
|
--- cluster_size=512 growth_size=48 create_mode=metadata growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -167,7 +167,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=metadata growth_mode=metadata ---
|
--- cluster_size=512 growth_size=48 create_mode=metadata growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -175,7 +175,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=metadata growth_mode=falloc ---
|
--- cluster_size=512 growth_size=48 create_mode=metadata growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -183,7 +183,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=metadata growth_mode=full ---
|
--- cluster_size=512 growth_size=48 create_mode=metadata growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -191,7 +191,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=falloc growth_mode=off ---
|
--- cluster_size=512 growth_size=48 create_mode=falloc growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -199,7 +199,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=falloc growth_mode=metadata ---
|
--- cluster_size=512 growth_size=48 create_mode=falloc growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -207,7 +207,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=falloc growth_mode=falloc ---
|
--- cluster_size=512 growth_size=48 create_mode=falloc growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -215,7 +215,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=falloc growth_mode=full ---
|
--- cluster_size=512 growth_size=48 create_mode=falloc growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -223,7 +223,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=full growth_mode=off ---
|
--- cluster_size=512 growth_size=48 create_mode=full growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -231,7 +231,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=full growth_mode=metadata ---
|
--- cluster_size=512 growth_size=48 create_mode=full growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -239,7 +239,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=full growth_mode=falloc ---
|
--- cluster_size=512 growth_size=48 create_mode=full growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -247,7 +247,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=48 create_mode=full growth_mode=full ---
|
--- cluster_size=512 growth_size=48 create_mode=full growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -255,7 +255,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 49152/49152 bytes at offset 2048000
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=off growth_mode=off ---
|
--- cluster_size=512 growth_size=80 create_mode=off growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -263,7 +263,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=off growth_mode=metadata ---
|
--- cluster_size=512 growth_size=80 create_mode=off growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -271,7 +271,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=off growth_mode=falloc ---
|
--- cluster_size=512 growth_size=80 create_mode=off growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -279,7 +279,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=off growth_mode=full ---
|
--- cluster_size=512 growth_size=80 create_mode=off growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -287,7 +287,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=metadata growth_mode=off ---
|
--- cluster_size=512 growth_size=80 create_mode=metadata growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -295,7 +295,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=metadata growth_mode=metadata ---
|
--- cluster_size=512 growth_size=80 create_mode=metadata growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -303,7 +303,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=metadata growth_mode=falloc ---
|
--- cluster_size=512 growth_size=80 create_mode=metadata growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -311,7 +311,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=metadata growth_mode=full ---
|
--- cluster_size=512 growth_size=80 create_mode=metadata growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -319,7 +319,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=falloc growth_mode=off ---
|
--- cluster_size=512 growth_size=80 create_mode=falloc growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -327,7 +327,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=falloc growth_mode=metadata ---
|
--- cluster_size=512 growth_size=80 create_mode=falloc growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -335,7 +335,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=falloc growth_mode=falloc ---
|
--- cluster_size=512 growth_size=80 create_mode=falloc growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -343,7 +343,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=falloc growth_mode=full ---
|
--- cluster_size=512 growth_size=80 create_mode=falloc growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -351,7 +351,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=full growth_mode=off ---
|
--- cluster_size=512 growth_size=80 create_mode=full growth_mode=off ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -359,7 +359,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=full growth_mode=metadata ---
|
--- cluster_size=512 growth_size=80 create_mode=full growth_mode=metadata ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -367,7 +367,7 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=full growth_mode=falloc ---
|
--- cluster_size=512 growth_size=80 create_mode=full growth_mode=falloc ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
@ -375,7 +375,391 @@ wrote 2048000/2048000 bytes at offset 0
|
||||||
wrote 81920/81920 bytes at offset 2048000
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
--- growth_size=80 create_mode=full growth_mode=full ---
|
--- cluster_size=512 growth_size=80 create_mode=full growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=off growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=off growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=off growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=off growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=metadata growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=metadata growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=metadata growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=metadata growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=falloc growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=falloc growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=falloc growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=falloc growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=full growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=full growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=full growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=16 create_mode=full growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 16384/16384 bytes at offset 2048000
|
||||||
|
16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=off growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=off growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=off growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=off growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=metadata growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=metadata growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=metadata growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=metadata growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=falloc growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=falloc growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=falloc growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=falloc growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=full growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=full growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=full growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=48 create_mode=full growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 49152/49152 bytes at offset 2048000
|
||||||
|
48 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=off growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=off growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=off growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=off growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=off
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=metadata growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=metadata growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=metadata growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=metadata growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=metadata
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=falloc growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=falloc growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=falloc growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=falloc growth_mode=full ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=falloc
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=full growth_mode=off ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=full growth_mode=metadata ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=full growth_mode=falloc ---
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
|
Image resized.
|
||||||
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
1.953 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
wrote 81920/81920 bytes at offset 2048000
|
||||||
|
80 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
--- cluster_size=64k growth_size=80 create_mode=full growth_mode=full ---
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2048000 preallocation=full
|
||||||
Image resized.
|
Image resized.
|
||||||
wrote 2048000/2048000 bytes at offset 0
|
wrote 2048000/2048000 bytes at offset 0
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Test case for mirroring with dataplane
|
||||||
|
#
|
||||||
|
# Copyright (C) 2017 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# creator
|
||||||
|
owner=mreitz@redhat.com
|
||||||
|
|
||||||
|
seq=$(basename $0)
|
||||||
|
echo "QA output created by $seq"
|
||||||
|
|
||||||
|
here=$PWD
|
||||||
|
status=1 # failure is the default!
|
||||||
|
|
||||||
|
_cleanup()
|
||||||
|
{
|
||||||
|
_cleanup_qemu
|
||||||
|
_cleanup_test_img
|
||||||
|
_rm_test_img "$TEST_IMG.overlay0"
|
||||||
|
_rm_test_img "$TEST_IMG.overlay1"
|
||||||
|
}
|
||||||
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||||
|
|
||||||
|
# get standard environment, filters and qemu instance handling
|
||||||
|
. ./common.rc
|
||||||
|
. ./common.filter
|
||||||
|
. ./common.qemu
|
||||||
|
|
||||||
|
_supported_fmt qcow2
|
||||||
|
_supported_proto file
|
||||||
|
_supported_os Linux
|
||||||
|
|
||||||
|
IMG_SIZE=64K
|
||||||
|
|
||||||
|
_make_test_img $IMG_SIZE
|
||||||
|
TEST_IMG="$TEST_IMG.overlay0" _make_test_img -b "$TEST_IMG" $IMG_SIZE
|
||||||
|
TEST_IMG="$TEST_IMG.overlay1" _make_test_img -b "$TEST_IMG" $IMG_SIZE
|
||||||
|
|
||||||
|
# So that we actually have something to mirror and the job does not return
|
||||||
|
# immediately (which may be bad because then we cannot know whether the
|
||||||
|
# 'return' or the 'BLOCK_JOB_READY' comes first).
|
||||||
|
$QEMU_IO -c 'write 0 42' "$TEST_IMG.overlay0" | _filter_qemu_io
|
||||||
|
|
||||||
|
# We cannot use virtio-blk here because that does not actually set the attached
|
||||||
|
# BB's AioContext in qtest mode
|
||||||
|
_launch_qemu \
|
||||||
|
-object iothread,id=iothr \
|
||||||
|
-blockdev node-name=source,driver=$IMGFMT,file.driver=file,file.filename="$TEST_IMG.overlay0" \
|
||||||
|
-device virtio-scsi,id=scsi-bus,iothread=iothr \
|
||||||
|
-device scsi-hd,bus=scsi-bus.0,drive=source
|
||||||
|
|
||||||
|
_send_qemu_cmd $QEMU_HANDLE \
|
||||||
|
"{ 'execute': 'qmp_capabilities' }" \
|
||||||
|
'return'
|
||||||
|
|
||||||
|
_send_qemu_cmd $QEMU_HANDLE \
|
||||||
|
"{ 'execute': 'drive-mirror',
|
||||||
|
'arguments': {
|
||||||
|
'job-id': 'mirror',
|
||||||
|
'device': 'source',
|
||||||
|
'target': '$TEST_IMG.overlay1',
|
||||||
|
'mode': 'existing',
|
||||||
|
'sync': 'top'
|
||||||
|
} }" \
|
||||||
|
'BLOCK_JOB_READY'
|
||||||
|
|
||||||
|
# The backing BDS should be assigned the overlay's AioContext
|
||||||
|
_send_qemu_cmd $QEMU_HANDLE \
|
||||||
|
"{ 'execute': 'block-job-complete',
|
||||||
|
'arguments': { 'device': 'mirror' } }" \
|
||||||
|
'BLOCK_JOB_COMPLETED'
|
||||||
|
|
||||||
|
_send_qemu_cmd $QEMU_HANDLE \
|
||||||
|
"{ 'execute': 'quit' }" \
|
||||||
|
'return'
|
||||||
|
|
||||||
|
wait=yes _cleanup_qemu
|
||||||
|
|
||||||
|
# success, all done
|
||||||
|
echo '*** done'
|
||||||
|
rm -f $seq.full
|
||||||
|
status=0
|
|
@ -0,0 +1,14 @@
|
||||||
|
QA output created by 127
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT.overlay0', fmt=IMGFMT size=65536 backing_file=TEST_DIR/t.IMGFMT
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT.overlay1', fmt=IMGFMT size=65536 backing_file=TEST_DIR/t.IMGFMT
|
||||||
|
wrote 42/42 bytes at offset 0
|
||||||
|
42 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
{"return": {}}
|
||||||
|
{"return": {}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "mirror", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
|
||||||
|
{"return": {}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "mirror", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
|
||||||
|
{"return": {}}
|
||||||
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
||||||
|
*** done
|
|
@ -51,7 +51,7 @@ echo "== setting up files =="
|
||||||
TEST_IMG="$TEST_IMG.base" _make_test_img $size
|
TEST_IMG="$TEST_IMG.base" _make_test_img $size
|
||||||
$QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG.base" | _filter_qemu_io
|
$QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG.base" | _filter_qemu_io
|
||||||
_make_test_img -b "$TEST_IMG.base"
|
_make_test_img -b "$TEST_IMG.base"
|
||||||
$QEMU_IO -c "write -P 22 0 $size" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -P 22 0 110M" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
||||||
# Limited to 64k max-transfer
|
# Limited to 64k max-transfer
|
||||||
echo
|
echo
|
||||||
|
@ -81,6 +81,13 @@ limits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-disca
|
||||||
$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \
|
$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \
|
||||||
-c "discard 80000001 30M" | _filter_qemu_io
|
-c "discard 80000001 30M" | _filter_qemu_io
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "== block status smaller than alignment =="
|
||||||
|
limits=align=4k
|
||||||
|
$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \
|
||||||
|
-c "alloc 1 1" -c "alloc 0x6dffff0 1000" -c "alloc 127m 5P" \
|
||||||
|
-c map | _filter_qemu_io
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "== verify image content =="
|
echo "== verify image content =="
|
||||||
|
|
||||||
|
@ -103,7 +110,8 @@ function verify_io()
|
||||||
echo read -P 0 32M 32M
|
echo read -P 0 32M 32M
|
||||||
echo read -P 22 64M 13M
|
echo read -P 22 64M 13M
|
||||||
echo read -P $discarded 77M 29M
|
echo read -P $discarded 77M 29M
|
||||||
echo read -P 22 106M 22M
|
echo read -P 22 106M 4M
|
||||||
|
echo read -P 11 110M 18M
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_io | $QEMU_IO -r "$TEST_IMG" | _filter_qemu_io
|
verify_io | $QEMU_IO -r "$TEST_IMG" | _filter_qemu_io
|
||||||
|
|
|
@ -5,8 +5,8 @@ Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
||||||
wrote 134217728/134217728 bytes at offset 0
|
wrote 134217728/134217728 bytes at offset 0
|
||||||
128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base
|
||||||
wrote 134217728/134217728 bytes at offset 0
|
wrote 115343360/115343360 bytes at offset 0
|
||||||
128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
110 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
== constrained alignment and max-transfer ==
|
== constrained alignment and max-transfer ==
|
||||||
wrote 131072/131072 bytes at offset 1000
|
wrote 131072/131072 bytes at offset 1000
|
||||||
|
@ -26,6 +26,13 @@ wrote 33554432/33554432 bytes at offset 33554432
|
||||||
discard 31457280/31457280 bytes at offset 80000001
|
discard 31457280/31457280 bytes at offset 80000001
|
||||||
30 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
30 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
|
||||||
|
== block status smaller than alignment ==
|
||||||
|
1/1 bytes allocated at offset 1 bytes
|
||||||
|
16/1000 bytes allocated at offset 110 MiB
|
||||||
|
0/1048576 bytes allocated at offset 127 MiB
|
||||||
|
110 MiB (0x6e00000) bytes allocated at offset 0 bytes (0x0)
|
||||||
|
18 MiB (0x1200000) bytes not allocated at offset 110 MiB (0x6e00000)
|
||||||
|
|
||||||
== verify image content ==
|
== verify image content ==
|
||||||
read 1000/1000 bytes at offset 0
|
read 1000/1000 bytes at offset 0
|
||||||
1000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
1000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
@ -43,12 +50,14 @@ read 13631488/13631488 bytes at offset 67108864
|
||||||
13 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
13 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
read 30408704/30408704 bytes at offset 80740352
|
read 30408704/30408704 bytes at offset 80740352
|
||||||
29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
read 23068672/23068672 bytes at offset 111149056
|
read 4194304/4194304 bytes at offset 111149056
|
||||||
22 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
|
read 18874368/18874368 bytes at offset 115343360
|
||||||
|
18 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
Offset Length File
|
Offset Length File
|
||||||
0 0x800000 TEST_DIR/t.IMGFMT
|
0 0x800000 TEST_DIR/t.IMGFMT
|
||||||
0x900000 0x2400000 TEST_DIR/t.IMGFMT
|
0x900000 0x2400000 TEST_DIR/t.IMGFMT
|
||||||
0x3c00000 0x1100000 TEST_DIR/t.IMGFMT
|
0x3c00000 0x1100000 TEST_DIR/t.IMGFMT
|
||||||
0x6a00000 0x1600000 TEST_DIR/t.IMGFMT
|
0x6a00000 0x400000 TEST_DIR/t.IMGFMT
|
||||||
No errors were found on the image.
|
No errors were found on the image.
|
||||||
*** done
|
*** done
|
||||||
|
|
|
@ -51,7 +51,8 @@ function do_run_qemu()
|
||||||
function run_qemu()
|
function run_qemu()
|
||||||
{
|
{
|
||||||
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\
|
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\
|
||||||
| _filter_qemu_io | _filter_generated_node_ids
|
| _filter_qemu_io | _filter_generated_node_ids \
|
||||||
|
| _filter_actual_image_size
|
||||||
}
|
}
|
||||||
|
|
||||||
_make_test_img 64M
|
_make_test_img 64M
|
||||||
|
|
|
@ -32,7 +32,7 @@ Testing:
|
||||||
"filename": "json:{\"throttle-group\": \"group0\", \"driver\": \"throttle\", \"file\": {\"driver\": \"qcow2\", \"file\": {\"driver\": \"file\", \"filename\": \"TEST_DIR/t.qcow2\"}}}",
|
"filename": "json:{\"throttle-group\": \"group0\", \"driver\": \"throttle\", \"file\": {\"driver\": \"qcow2\", \"file\": {\"driver\": \"file\", \"filename\": \"TEST_DIR/t.qcow2\"}}}",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "throttle",
|
"format": "throttle",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -62,7 +62,7 @@ Testing:
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -100,7 +100,7 @@ Testing:
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
|
|
@ -56,7 +56,8 @@ echo === Preparing and starting VM ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
TEST_IMG="${TEST_IMG}.base" _make_test_img $size
|
TEST_IMG="${TEST_IMG}.base" _make_test_img $size
|
||||||
TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
|
IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
|
||||||
|
TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
|
||||||
_make_test_img -b "${TEST_IMG}.mid"
|
_make_test_img -b "${TEST_IMG}.mid"
|
||||||
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
|
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
|
||||||
|
|
||||||
|
@ -91,7 +92,7 @@ echo === Check that both top and top2 point to base now ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
|
_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
|
||||||
_filter_generated_node_ids
|
_filter_generated_node_ids | _filter_actual_image_size
|
||||||
|
|
||||||
_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
|
_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
|
||||||
wait=1 _cleanup_qemu
|
wait=1 _cleanup_qemu
|
||||||
|
@ -139,7 +140,7 @@ echo === Check that both top and top2 point to base now ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
|
_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
|
||||||
_filter_generated_node_ids
|
_filter_generated_node_ids | _filter_actual_image_size
|
||||||
|
|
||||||
_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
|
_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
|
||||||
wait=1 _cleanup_qemu
|
wait=1 _cleanup_qemu
|
||||||
|
|
|
@ -3,7 +3,7 @@ QA output created by 191
|
||||||
=== Preparing and starting VM ===
|
=== Preparing and starting VM ===
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
|
||||||
Formatting 'TEST_DIR/t.IMGFMT.mid', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.base
|
Formatting 'TEST_DIR/t.IMGFMT.mid', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.mid
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.mid
|
||||||
Formatting 'TEST_DIR/t.IMGFMT.ovl2', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.mid
|
Formatting 'TEST_DIR/t.IMGFMT.ovl2', fmt=IMGFMT size=67108864 backing_file=TEST_DIR/t.IMGFMT.mid
|
||||||
wrote 65536/65536 bytes at offset 1048576
|
wrote 65536/65536 bytes at offset 1048576
|
||||||
|
@ -47,7 +47,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -64,7 +64,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl2",
|
"filename": "TEST_DIR/t.qcow2.ovl2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -105,7 +105,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl2",
|
"filename": "TEST_DIR/t.qcow2.ovl2",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -136,7 +136,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -153,7 +153,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -194,7 +194,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -225,7 +225,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -242,7 +242,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.mid",
|
"filename": "TEST_DIR/t.qcow2.mid",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -283,7 +283,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 393216,
|
"virtual-size": 393216,
|
||||||
"filename": "TEST_DIR/t.qcow2.mid",
|
"filename": "TEST_DIR/t.qcow2.mid",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -313,7 +313,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -351,7 +351,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 393216,
|
"virtual-size": 393216,
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -450,7 +450,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -467,7 +467,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl2",
|
"filename": "TEST_DIR/t.qcow2.ovl2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -508,7 +508,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl2",
|
"filename": "TEST_DIR/t.qcow2.ovl2",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -540,7 +540,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -557,7 +557,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl2",
|
"filename": "TEST_DIR/t.qcow2.ovl2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -576,7 +576,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl3",
|
"filename": "TEST_DIR/t.qcow2.ovl3",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -617,7 +617,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2.ovl3",
|
"filename": "TEST_DIR/t.qcow2.ovl3",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -647,7 +647,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -685,7 +685,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 393216,
|
"virtual-size": 393216,
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
@ -716,7 +716,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2.base",
|
"filename": "TEST_DIR/t.qcow2.base",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 397312,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -733,7 +733,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"cluster-size": 65536,
|
"cluster-size": 65536,
|
||||||
"format": "qcow2",
|
"format": "qcow2",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -774,7 +774,7 @@ wrote 65536/65536 bytes at offset 1048576
|
||||||
"virtual-size": 197120,
|
"virtual-size": 197120,
|
||||||
"filename": "TEST_DIR/t.qcow2",
|
"filename": "TEST_DIR/t.qcow2",
|
||||||
"format": "file",
|
"format": "file",
|
||||||
"actual-size": 200704,
|
"actual-size": SIZE,
|
||||||
"dirty-flag": false
|
"dirty-flag": false
|
||||||
},
|
},
|
||||||
"iops_wr": 0,
|
"iops_wr": 0,
|
||||||
|
|
|
@ -105,6 +105,12 @@ _filter_block_job_len()
|
||||||
sed -e 's/, "len": [0-9]\+,/, "len": LEN,/g'
|
sed -e 's/, "len": [0-9]\+,/, "len": LEN,/g'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# replace actual image size (depends on the host filesystem)
|
||||||
|
_filter_actual_image_size()
|
||||||
|
{
|
||||||
|
sed -s 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g'
|
||||||
|
}
|
||||||
|
|
||||||
# replace driver-specific options in the "Formatting..." line
|
# replace driver-specific options in the "Formatting..." line
|
||||||
_filter_img_create()
|
_filter_img_create()
|
||||||
{
|
{
|
||||||
|
|
|
@ -133,6 +133,7 @@
|
||||||
124 rw auto backing
|
124 rw auto backing
|
||||||
125 rw auto
|
125 rw auto
|
||||||
126 rw auto backing
|
126 rw auto backing
|
||||||
|
127 rw auto backing quick
|
||||||
128 rw auto quick
|
128 rw auto quick
|
||||||
129 rw auto quick
|
129 rw auto quick
|
||||||
130 rw auto quick
|
130 rw auto quick
|
||||||
|
|
Loading…
Reference in New Issue