Block layer patches for 2.6.0-rc3

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABAgAGBQJXERCPAAoJEH8JsnLIjy/W1DQP/0PkX4RGpwZZFkr+SmftWYjA
 RgCWeOmLv1HduuRZ1gwh4XiUDF5YOF9FnzaYoRoUgHLYZZOP+npNZpeIjYuEvGMJ
 PHI53x6UHI/rIPuFJI+yujjPZKguIFB/F2j2dEI40s9d6Q7Y2EiJNRBj6zeFMCF0
 YFtLnrKquAoJ3JeFS51NYjTgCLuly91/jnjAbre2timyY7t3/1HhobjzmrpzGAHT
 DhcgWg4aQF1ObHMuOGyP3t9AGW7WT4xxEHnHkr4SD2SpD8j7QfGdnEb0TsQkeHu3
 FjyPEd6MHT1n6QmvSoMA9wj45SVPCdga4bAbIKsBVigF9W6cBEJ0D0ki/CbVi4c+
 Dqiy76FJv73ylkWZgbL0XbvX+P9/GVKw3s9dq2IfXE13rqlRNhQ3Um+Emi6yBIhs
 g2XgYmqt11ftljidNL8S0/4Hpf0LXkEIzWkgmvWg3qMjtr8PrGQD8qzUi7qdrGpZ
 GXlZH7FUtJQpQ68Bi4W9RlwLwGVco/sq/Q/mOtV2wUW8CgVVdiyNEqK7WsXi9fwi
 ta/VWwAmsl5LIlCX8jeEr9Xgn3hAHacVBByI49wxODvCoO9Cgjthkg1xxLTDN7B1
 wwbNzzQLWTCRlXONTmGzgNho6dAIIEbYN30JNaAgemlKblNsqz/Sq84FzfSlpt/j
 cvhF3zLa/RpMWhm6Awyv
 =qnSC
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging

Block layer patches for 2.6.0-rc3

# gpg: Signature made Fri 15 Apr 2016 17:02:23 BST using RSA key ID C88F2FD6
# gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>"

* remotes/kevin/tags/for-upstream:
  nbd: Don't kill server on client that doesn't request TLS
  nbd: fix assert() on qemu-nbd stop
  nbd: Don't fail handshake on NBD_OPT_LIST descriptions
  qemu-iotests: 041: More robust assertion on quorum node
  qemu-iotests: place valgrind log file in scratch dir
  qemu-iotests: tests: do not set unused tmp variable
  qemu-iotests: common.rc: drop unused _do()
  qemu-iotests: drop unused _within_tolerance() filter
  Fix pflash migration
  block: Don't ignore flags in blk_{,co,aio}_write_zeroes()
  block/vpc: update comments to be compliant w/coding guidelines
  block/vpc: set errp in vpc_open
  block/vpc: make checks on max table size a bit more lax
  block/vpc: Use the correct max sector count for VHD images
  block/vpc: use current_size field for XenConverter VHD images
  vpc: use current_size field for XenServer VHD images
  block/vpc: set errp in vpc_create
  block: Fix blk_aio_write_zeroes()
  qemu-io: Support 'aio_write -z'

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2016-04-15 18:26:49 +01:00
commit 072035eba1
130 changed files with 281 additions and 353 deletions

View File

@ -820,7 +820,7 @@ int blk_write_zeroes(BlockBackend *blk, int64_t sector_num,
int nb_sectors, BdrvRequestFlags flags) int nb_sectors, BdrvRequestFlags flags)
{ {
return blk_rw(blk, sector_num, NULL, nb_sectors, blk_write_entry, return blk_rw(blk, sector_num, NULL, nb_sectors, blk_write_entry,
BDRV_REQ_ZERO_WRITE); flags | BDRV_REQ_ZERO_WRITE);
} }
static void error_callback_bh(void *opaque) static void error_callback_bh(void *opaque)
@ -852,6 +852,7 @@ BlockAIOCB *blk_abort_aio_request(BlockBackend *blk,
typedef struct BlkAioEmAIOCB { typedef struct BlkAioEmAIOCB {
BlockAIOCB common; BlockAIOCB common;
BlkRwCo rwco; BlkRwCo rwco;
int bytes;
bool has_returned; bool has_returned;
QEMUBH* bh; QEMUBH* bh;
} BlkAioEmAIOCB; } BlkAioEmAIOCB;
@ -877,7 +878,7 @@ static void blk_aio_complete_bh(void *opaque)
blk_aio_complete(opaque); blk_aio_complete(opaque);
} }
static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset, static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset, int bytes,
QEMUIOVector *qiov, CoroutineEntry co_entry, QEMUIOVector *qiov, CoroutineEntry co_entry,
BdrvRequestFlags flags, BdrvRequestFlags flags,
BlockCompletionFunc *cb, void *opaque) BlockCompletionFunc *cb, void *opaque)
@ -893,6 +894,7 @@ static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset,
.flags = flags, .flags = flags,
.ret = NOT_DONE, .ret = NOT_DONE,
}; };
acb->bytes = bytes;
acb->bh = NULL; acb->bh = NULL;
acb->has_returned = false; acb->has_returned = false;
@ -913,7 +915,8 @@ static void blk_aio_read_entry(void *opaque)
BlkAioEmAIOCB *acb = opaque; BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco; BlkRwCo *rwco = &acb->rwco;
rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, rwco->qiov->size, assert(rwco->qiov->size == acb->bytes);
rwco->ret = blk_co_preadv(rwco->blk, rwco->offset, acb->bytes,
rwco->qiov, rwco->flags); rwco->qiov, rwco->flags);
blk_aio_complete(acb); blk_aio_complete(acb);
} }
@ -923,8 +926,8 @@ static void blk_aio_write_entry(void *opaque)
BlkAioEmAIOCB *acb = opaque; BlkAioEmAIOCB *acb = opaque;
BlkRwCo *rwco = &acb->rwco; BlkRwCo *rwco = &acb->rwco;
rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, assert(!rwco->qiov || rwco->qiov->size == acb->bytes);
rwco->qiov ? rwco->qiov->size : 0, rwco->ret = blk_co_pwritev(rwco->blk, rwco->offset, acb->bytes,
rwco->qiov, rwco->flags); rwco->qiov, rwco->flags);
blk_aio_complete(acb); blk_aio_complete(acb);
} }
@ -937,8 +940,10 @@ BlockAIOCB *blk_aio_write_zeroes(BlockBackend *blk, int64_t sector_num,
return blk_abort_aio_request(blk, cb, opaque, -EINVAL); return blk_abort_aio_request(blk, cb, opaque, -EINVAL);
} }
return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS, NULL, return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS,
blk_aio_write_entry, BDRV_REQ_ZERO_WRITE, cb, opaque); nb_sectors << BDRV_SECTOR_BITS, NULL,
blk_aio_write_entry, flags | BDRV_REQ_ZERO_WRITE,
cb, opaque);
} }
int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count) int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count)
@ -994,7 +999,8 @@ BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
return blk_abort_aio_request(blk, cb, opaque, -EINVAL); return blk_abort_aio_request(blk, cb, opaque, -EINVAL);
} }
return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS, iov, assert(nb_sectors << BDRV_SECTOR_BITS == iov->size);
return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS, iov->size, iov,
blk_aio_read_entry, 0, cb, opaque); blk_aio_read_entry, 0, cb, opaque);
} }
@ -1006,7 +1012,8 @@ BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
return blk_abort_aio_request(blk, cb, opaque, -EINVAL); return blk_abort_aio_request(blk, cb, opaque, -EINVAL);
} }
return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS, iov, assert(nb_sectors << BDRV_SECTOR_BITS == iov->size);
return blk_aio_prwv(blk, sector_num << BDRV_SECTOR_BITS, iov->size, iov,
blk_aio_write_entry, 0, cb, opaque); blk_aio_write_entry, 0, cb, opaque);
} }
@ -1446,7 +1453,7 @@ int coroutine_fn blk_co_write_zeroes(BlockBackend *blk, int64_t sector_num,
return blk_co_pwritev(blk, sector_num << BDRV_SECTOR_BITS, return blk_co_pwritev(blk, sector_num << BDRV_SECTOR_BITS,
nb_sectors << BDRV_SECTOR_BITS, NULL, nb_sectors << BDRV_SECTOR_BITS, NULL,
BDRV_REQ_ZERO_WRITE); flags | BDRV_REQ_ZERO_WRITE);
} }
int blk_write_compressed(BlockBackend *blk, int64_t sector_num, int blk_write_compressed(BlockBackend *blk, int64_t sector_num,

View File

@ -45,34 +45,34 @@ enum vhd_type {
VHD_DIFFERENCING = 4, VHD_DIFFERENCING = 4,
}; };
// Seconds since Jan 1, 2000 0:00:00 (UTC) /* Seconds since Jan 1, 2000 0:00:00 (UTC) */
#define VHD_TIMESTAMP_BASE 946684800 #define VHD_TIMESTAMP_BASE 946684800
#define VHD_CHS_MAX_C 65535LL #define VHD_CHS_MAX_C 65535LL
#define VHD_CHS_MAX_H 16 #define VHD_CHS_MAX_H 16
#define VHD_CHS_MAX_S 255 #define VHD_CHS_MAX_S 255
#define VHD_MAX_SECTORS (65535LL * 255 * 255) #define VHD_MAX_SECTORS 0xff000000 /* 2040 GiB max image size */
#define VHD_MAX_GEOMETRY (VHD_CHS_MAX_C * VHD_CHS_MAX_H * VHD_CHS_MAX_S) #define VHD_MAX_GEOMETRY (VHD_CHS_MAX_C * VHD_CHS_MAX_H * VHD_CHS_MAX_S)
#define VPC_OPT_FORCE_SIZE "force_size" #define VPC_OPT_FORCE_SIZE "force_size"
// always big-endian /* always big-endian */
typedef struct vhd_footer { typedef struct vhd_footer {
char creator[8]; // "conectix" char creator[8]; /* "conectix" */
uint32_t features; uint32_t features;
uint32_t version; uint32_t version;
// Offset of next header structure, 0xFFFFFFFF if none /* Offset of next header structure, 0xFFFFFFFF if none */
uint64_t data_offset; uint64_t data_offset;
// Seconds since Jan 1, 2000 0:00:00 (UTC) /* Seconds since Jan 1, 2000 0:00:00 (UTC) */
uint32_t timestamp; uint32_t timestamp;
char creator_app[4]; // "vpc " char creator_app[4]; /* e.g., "vpc " */
uint16_t major; uint16_t major;
uint16_t minor; uint16_t minor;
char creator_os[4]; // "Wi2k" char creator_os[4]; /* "Wi2k" */
uint64_t orig_size; uint64_t orig_size;
uint64_t current_size; uint64_t current_size;
@ -83,29 +83,29 @@ typedef struct vhd_footer {
uint32_t type; uint32_t type;
// Checksum of the Hard Disk Footer ("one's complement of the sum of all /* Checksum of the Hard Disk Footer ("one's complement of the sum of all
// the bytes in the footer without the checksum field") the bytes in the footer without the checksum field") */
uint32_t checksum; uint32_t checksum;
// UUID used to identify a parent hard disk (backing file) /* UUID used to identify a parent hard disk (backing file) */
uint8_t uuid[16]; uint8_t uuid[16];
uint8_t in_saved_state; uint8_t in_saved_state;
} QEMU_PACKED VHDFooter; } QEMU_PACKED VHDFooter;
typedef struct vhd_dyndisk_header { typedef struct vhd_dyndisk_header {
char magic[8]; // "cxsparse" char magic[8]; /* "cxsparse" */
// Offset of next header structure, 0xFFFFFFFF if none /* Offset of next header structure, 0xFFFFFFFF if none */
uint64_t data_offset; uint64_t data_offset;
// Offset of the Block Allocation Table (BAT) /* Offset of the Block Allocation Table (BAT) */
uint64_t table_offset; uint64_t table_offset;
uint32_t version; uint32_t version;
uint32_t max_table_entries; // 32bit/entry uint32_t max_table_entries; /* 32bit/entry */
// 2 MB by default, must be a power of two /* 2 MB by default, must be a power of two */
uint32_t block_size; uint32_t block_size;
uint32_t checksum; uint32_t checksum;
@ -113,7 +113,7 @@ typedef struct vhd_dyndisk_header {
uint32_t parent_timestamp; uint32_t parent_timestamp;
uint32_t reserved; uint32_t reserved;
// Backing file name (in UTF-16) /* Backing file name (in UTF-16) */
uint8_t parent_name[512]; uint8_t parent_name[512];
struct { struct {
@ -238,6 +238,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
ret = bdrv_pread(bs->file->bs, 0, s->footer_buf, HEADER_SIZE); ret = bdrv_pread(bs->file->bs, 0, s->footer_buf, HEADER_SIZE);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Unable to read VHD header");
goto fail; goto fail;
} }
@ -246,9 +247,11 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
int64_t offset = bdrv_getlength(bs->file->bs); int64_t offset = bdrv_getlength(bs->file->bs);
if (offset < 0) { if (offset < 0) {
ret = offset; ret = offset;
error_setg(errp, "Invalid file size");
goto fail; goto fail;
} else if (offset < HEADER_SIZE) { } else if (offset < HEADER_SIZE) {
ret = -EINVAL; ret = -EINVAL;
error_setg(errp, "File too small for a VHD header");
goto fail; goto fail;
} }
@ -275,9 +278,9 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
/* Write 'checksum' back to footer, or else will leave it with zero. */ /* Write 'checksum' back to footer, or else will leave it with zero. */
footer->checksum = cpu_to_be32(checksum); footer->checksum = cpu_to_be32(checksum);
// The visible size of a image in Virtual PC depends on the geometry /* The visible size of a image in Virtual PC depends on the geometry
// rather than on the size stored in the footer (the size in the footer rather than on the size stored in the footer (the size in the footer
// is too large usually) is too large usually) */
bs->total_sectors = (int64_t) bs->total_sectors = (int64_t)
be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl; be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
@ -299,6 +302,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
* 'qem2' : current_size QEMU (uses current_size) * 'qem2' : current_size QEMU (uses current_size)
* 'win ' : current_size Hyper-V * 'win ' : current_size Hyper-V
* 'd2v ' : current_size Disk2vhd * 'd2v ' : current_size Disk2vhd
* 'tap\0' : current_size XenServer
* 'CTXS' : current_size XenConverter
* *
* The user can override the table values via drive options, however * The user can override the table values via drive options, however
* even with an override we will still use current_size for images * even with an override we will still use current_size for images
@ -306,15 +311,17 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
*/ */
use_chs = (!!strncmp(footer->creator_app, "win ", 4) && use_chs = (!!strncmp(footer->creator_app, "win ", 4) &&
!!strncmp(footer->creator_app, "qem2", 4) && !!strncmp(footer->creator_app, "qem2", 4) &&
!!strncmp(footer->creator_app, "d2v ", 4)) || s->force_use_chs; !!strncmp(footer->creator_app, "d2v ", 4) &&
!!strncmp(footer->creator_app, "CTXS", 4) &&
!!memcmp(footer->creator_app, "tap", 4)) || s->force_use_chs;
if (!use_chs || bs->total_sectors == VHD_MAX_GEOMETRY || s->force_use_sz) { if (!use_chs || bs->total_sectors == VHD_MAX_GEOMETRY || s->force_use_sz) {
bs->total_sectors = be64_to_cpu(footer->current_size) / bs->total_sectors = be64_to_cpu(footer->current_size) /
BDRV_SECTOR_SIZE; BDRV_SECTOR_SIZE;
} }
/* Allow a maximum disk size of approximately 2 TB */ /* Allow a maximum disk size of 2040 GiB */
if (bs->total_sectors >= VHD_MAX_SECTORS) { if (bs->total_sectors > VHD_MAX_SECTORS) {
ret = -EFBIG; ret = -EFBIG;
goto fail; goto fail;
} }
@ -323,12 +330,14 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
ret = bdrv_pread(bs->file->bs, be64_to_cpu(footer->data_offset), buf, ret = bdrv_pread(bs->file->bs, be64_to_cpu(footer->data_offset), buf,
HEADER_SIZE); HEADER_SIZE);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Error reading dynamic VHD header");
goto fail; goto fail;
} }
dyndisk_header = (VHDDynDiskHeader *) buf; dyndisk_header = (VHDDynDiskHeader *) buf;
if (strncmp(dyndisk_header->magic, "cxsparse", 8)) { if (strncmp(dyndisk_header->magic, "cxsparse", 8)) {
error_setg(errp, "Invalid header magic");
ret = -EINVAL; ret = -EINVAL;
goto fail; goto fail;
} }
@ -344,16 +353,14 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries); s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries);
if ((bs->total_sectors * 512) / s->block_size > 0xffffffffU) { if ((bs->total_sectors * 512) / s->block_size > 0xffffffffU) {
ret = -EINVAL; error_setg(errp, "Too many blocks");
goto fail;
}
if (s->max_table_entries > (VHD_MAX_SECTORS * 512) / s->block_size) {
ret = -EINVAL; ret = -EINVAL;
goto fail; goto fail;
} }
computed_size = (uint64_t) s->max_table_entries * s->block_size; computed_size = (uint64_t) s->max_table_entries * s->block_size;
if (computed_size < bs->total_sectors * 512) { if (computed_size < bs->total_sectors * 512) {
error_setg(errp, "Page table too small");
ret = -EINVAL; ret = -EINVAL;
goto fail; goto fail;
} }
@ -370,6 +377,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
s->pagetable = qemu_try_blockalign(bs->file->bs, pagetable_size); s->pagetable = qemu_try_blockalign(bs->file->bs, pagetable_size);
if (s->pagetable == NULL) { if (s->pagetable == NULL) {
error_setg(errp, "Unable to allocate memory for page table");
ret = -ENOMEM; ret = -ENOMEM;
goto fail; goto fail;
} }
@ -379,6 +387,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
ret = bdrv_pread(bs->file->bs, s->bat_offset, s->pagetable, ret = bdrv_pread(bs->file->bs, s->bat_offset, s->pagetable,
pagetable_size); pagetable_size);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Error reading pagetable");
goto fail; goto fail;
} }
@ -457,16 +466,16 @@ static inline int64_t get_sector_offset(BlockDriverState *bs,
pageentry_index = (offset % s->block_size) / 512; pageentry_index = (offset % s->block_size) / 512;
if (pagetable_index >= s->max_table_entries || s->pagetable[pagetable_index] == 0xffffffff) if (pagetable_index >= s->max_table_entries || s->pagetable[pagetable_index] == 0xffffffff)
return -1; // not allocated return -1; /* not allocated */
bitmap_offset = 512 * (uint64_t) s->pagetable[pagetable_index]; bitmap_offset = 512 * (uint64_t) s->pagetable[pagetable_index];
block_offset = bitmap_offset + s->bitmap_size + (512 * pageentry_index); block_offset = bitmap_offset + s->bitmap_size + (512 * pageentry_index);
// We must ensure that we don't write to any sectors which are marked as /* We must ensure that we don't write to any sectors which are marked as
// unused in the bitmap. We get away with setting all bits in the block unused in the bitmap. We get away with setting all bits in the block
// bitmap each time we write to a new block. This might cause Virtual PC to bitmap each time we write to a new block. This might cause Virtual PC to
// miss sparse read optimization, but it's not a problem in terms of miss sparse read optimization, but it's not a problem in terms of
// correctness. correctness. */
if (write && (s->last_bitmap_offset != bitmap_offset)) { if (write && (s->last_bitmap_offset != bitmap_offset)) {
uint8_t bitmap[s->bitmap_size]; uint8_t bitmap[s->bitmap_size];
@ -512,18 +521,18 @@ static int64_t alloc_block(BlockDriverState* bs, int64_t sector_num)
int ret; int ret;
uint8_t bitmap[s->bitmap_size]; uint8_t bitmap[s->bitmap_size];
// Check if sector_num is valid /* Check if sector_num is valid */
if ((sector_num < 0) || (sector_num > bs->total_sectors)) if ((sector_num < 0) || (sector_num > bs->total_sectors))
return -1; return -1;
// Write entry into in-memory BAT /* Write entry into in-memory BAT */
index = (sector_num * 512) / s->block_size; index = (sector_num * 512) / s->block_size;
if (s->pagetable[index] != 0xFFFFFFFF) if (s->pagetable[index] != 0xFFFFFFFF)
return -1; return -1;
s->pagetable[index] = s->free_data_block_offset / 512; s->pagetable[index] = s->free_data_block_offset / 512;
// Initialize the block's bitmap /* Initialize the block's bitmap */
memset(bitmap, 0xff, s->bitmap_size); memset(bitmap, 0xff, s->bitmap_size);
ret = bdrv_pwrite_sync(bs->file->bs, s->free_data_block_offset, bitmap, ret = bdrv_pwrite_sync(bs->file->bs, s->free_data_block_offset, bitmap,
s->bitmap_size); s->bitmap_size);
@ -531,13 +540,13 @@ static int64_t alloc_block(BlockDriverState* bs, int64_t sector_num)
return ret; return ret;
} }
// Write new footer (the old one will be overwritten) /* Write new footer (the old one will be overwritten) */
s->free_data_block_offset += s->block_size + s->bitmap_size; s->free_data_block_offset += s->block_size + s->bitmap_size;
ret = rewrite_footer(bs); ret = rewrite_footer(bs);
if (ret < 0) if (ret < 0)
goto fail; goto fail;
// Write BAT entry to disk /* Write BAT entry to disk */
bat_offset = s->bat_offset + (4 * index); bat_offset = s->bat_offset + (4 * index);
bat_value = cpu_to_be32(s->pagetable[index]); bat_value = cpu_to_be32(s->pagetable[index]);
ret = bdrv_pwrite_sync(bs->file->bs, bat_offset, &bat_value, 4); ret = bdrv_pwrite_sync(bs->file->bs, bat_offset, &bat_value, 4);
@ -718,7 +727,7 @@ static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs,
* Note that the geometry doesn't always exactly match total_sectors but * Note that the geometry doesn't always exactly match total_sectors but
* may round it down. * may round it down.
* *
* Returns 0 on success, -EFBIG if the size is larger than ~2 TB. Override * Returns 0 on success, -EFBIG if the size is larger than 2040 GiB. Override
* the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB) * the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB)
* and instead allow up to 255 heads. * and instead allow up to 255 heads.
*/ */
@ -770,7 +779,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
int ret; int ret;
int64_t offset = 0; int64_t offset = 0;
// Write the footer (twice: at the beginning and at the end) /* Write the footer (twice: at the beginning and at the end) */
block_size = 0x200000; block_size = 0x200000;
num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512); num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512);
@ -785,7 +794,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
goto fail; goto fail;
} }
// Write the initial BAT /* Write the initial BAT */
offset = 3 * 512; offset = 3 * 512;
memset(buf, 0xFF, 512); memset(buf, 0xFF, 512);
@ -797,7 +806,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
offset += 512; offset += 512;
} }
// Prepare the Dynamic Disk Header /* Prepare the Dynamic Disk Header */
memset(buf, 0, 1024); memset(buf, 0, 1024);
memcpy(dyndisk_header->magic, "cxsparse", 8); memcpy(dyndisk_header->magic, "cxsparse", 8);
@ -814,7 +823,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
dyndisk_header->checksum = cpu_to_be32(vpc_checksum(buf, 1024)); dyndisk_header->checksum = cpu_to_be32(vpc_checksum(buf, 1024));
// Write the header /* Write the header */
offset = 512; offset = 512;
ret = blk_pwrite(blk, offset, buf, 1024); ret = blk_pwrite(blk, offset, buf, 1024);
@ -874,6 +883,7 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
} else if (!strcmp(disk_type_param, "fixed")) { } else if (!strcmp(disk_type_param, "fixed")) {
disk_type = VHD_FIXED; disk_type = VHD_FIXED;
} else { } else {
error_setg(errp, "Invalid disk type, %s", disk_type_param);
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@ -922,8 +932,9 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
if ((int64_t)cyls * heads * secs_per_cyl == VHD_MAX_GEOMETRY) { if ((int64_t)cyls * heads * secs_per_cyl == VHD_MAX_GEOMETRY) {
total_sectors = total_size / BDRV_SECTOR_SIZE; total_sectors = total_size / BDRV_SECTOR_SIZE;
/* Allow a maximum disk size of approximately 2 TB */ /* Allow a maximum disk size of 2040 GiB */
if (total_sectors > VHD_MAX_SECTORS) { if (total_sectors > VHD_MAX_SECTORS) {
error_setg(errp, "Disk size is too large, max size is 2040 GiB");
ret = -EFBIG; ret = -EFBIG;
goto out; goto out;
} }
@ -974,6 +985,9 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
} else { } else {
ret = create_fixed_disk(blk, buf, total_size); ret = create_fixed_disk(blk, buf, total_size);
} }
if (ret < 0) {
error_setg(errp, "Unable to create or write VHD header");
}
out: out:
blk_unref(blk); blk_unref(blk);

View File

@ -46,6 +46,7 @@
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "sysemu/sysemu.h"
#define PFLASH_BUG(fmt, ...) \ #define PFLASH_BUG(fmt, ...) \
do { \ do { \
@ -97,6 +98,7 @@ struct pflash_t {
MemoryRegion mem; MemoryRegion mem;
char *name; char *name;
void *storage; void *storage;
VMChangeStateEntry *vmstate;
}; };
static int pflash_post_load(void *opaque, int version_id); static int pflash_post_load(void *opaque, int version_id);
@ -944,13 +946,25 @@ MemoryRegion *pflash_cfi01_get_memory(pflash_t *fl)
return &fl->mem; return &fl->mem;
} }
static void postload_update_cb(void *opaque, int running, RunState state)
{
pflash_t *pfl = opaque;
/* This is called after bdrv_invalidate_cache_all. */
qemu_del_vm_change_state_handler(pfl->vmstate);
pfl->vmstate = NULL;
DPRINTF("%s: updating bdrv for %s\n", __func__, pfl->name);
pflash_update(pfl, 0, pfl->sector_len * pfl->nb_blocs);
}
static int pflash_post_load(void *opaque, int version_id) static int pflash_post_load(void *opaque, int version_id)
{ {
pflash_t *pfl = opaque; pflash_t *pfl = opaque;
if (!pfl->ro) { if (!pfl->ro) {
DPRINTF("%s: updating bdrv for %s\n", __func__, pfl->name); pfl->vmstate = qemu_add_vm_change_state_handler(postload_update_cb,
pflash_update(pfl, 0, pfl->sector_len * pfl->nb_blocs); pfl);
} }
return 0; return 0;
} }

View File

@ -192,13 +192,18 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, Error **errp)
return -1; return -1;
} }
} else if (type == NBD_REP_SERVER) { } else if (type == NBD_REP_SERVER) {
if (len < sizeof(namelen) || len > NBD_MAX_BUFFER_SIZE) {
error_setg(errp, "incorrect option length");
return -1;
}
if (read_sync(ioc, &namelen, sizeof(namelen)) != sizeof(namelen)) { if (read_sync(ioc, &namelen, sizeof(namelen)) != sizeof(namelen)) {
error_setg(errp, "failed to read option name length"); error_setg(errp, "failed to read option name length");
return -1; return -1;
} }
namelen = be32_to_cpu(namelen); namelen = be32_to_cpu(namelen);
if (len != (namelen + sizeof(namelen))) { len -= sizeof(namelen);
error_setg(errp, "incorrect option mame length"); if (len < namelen) {
error_setg(errp, "incorrect option name length");
return -1; return -1;
} }
if (namelen > 255) { if (namelen > 255) {
@ -214,6 +219,20 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, Error **errp)
return -1; return -1;
} }
(*name)[namelen] = '\0'; (*name)[namelen] = '\0';
len -= namelen;
if (len) {
char *buf = g_malloc(len + 1);
if (read_sync(ioc, buf, len) != len) {
error_setg(errp, "failed to read export description");
g_free(*name);
g_free(buf);
*name = NULL;
return -1;
}
buf[len] = '\0';
TRACE("Ignoring export description: %s", buf);
g_free(buf);
}
} else { } else {
error_setg(errp, "Unexpected reply type %x expected %x", error_setg(errp, "Unexpected reply type %x expected %x",
type, NBD_REP_SERVER); type, NBD_REP_SERVER);

View File

@ -449,11 +449,19 @@ static int nbd_negotiate_options(NBDClient *client)
client->ioc = QIO_CHANNEL(tioc); client->ioc = QIO_CHANNEL(tioc);
break; break;
case NBD_OPT_EXPORT_NAME:
/* No way to return an error to client, so drop connection */
TRACE("Option 0x%x not permitted before TLS", clientflags);
return -EINVAL;
default: default:
TRACE("Option 0x%x not permitted before TLS", clientflags); TRACE("Option 0x%x not permitted before TLS", clientflags);
if (nbd_negotiate_drop_sync(client->ioc, length) != length) {
return -EIO;
}
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_TLS_REQD, nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_TLS_REQD,
clientflags); clientflags);
return -EINVAL; break;
} }
} else if (fixedNewstyle) { } else if (fixedNewstyle) {
switch (clientflags) { switch (clientflags) {
@ -471,6 +479,9 @@ static int nbd_negotiate_options(NBDClient *client)
return nbd_negotiate_handle_export_name(client, length); return nbd_negotiate_handle_export_name(client, length);
case NBD_OPT_STARTTLS: case NBD_OPT_STARTTLS:
if (nbd_negotiate_drop_sync(client->ioc, length) != length) {
return -EIO;
}
if (client->tlscreds) { if (client->tlscreds) {
TRACE("TLS already enabled"); TRACE("TLS already enabled");
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_INVALID, nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_INVALID,
@ -480,7 +491,7 @@ static int nbd_negotiate_options(NBDClient *client)
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_POLICY, nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_POLICY,
clientflags); clientflags);
} }
return -EINVAL; break;
default: default:
TRACE("Unsupported option 0x%x", clientflags); TRACE("Unsupported option 0x%x", clientflags);
if (nbd_negotiate_drop_sync(client->ioc, length) != length) { if (nbd_negotiate_drop_sync(client->ioc, length) != length) {

View File

@ -1416,6 +1416,7 @@ struct aio_ctx {
int vflag; int vflag;
int Cflag; int Cflag;
int Pflag; int Pflag;
int zflag;
BlockAcctCookie acct; BlockAcctCookie acct;
int pattern; int pattern;
struct timeval t1; struct timeval t1;
@ -1446,8 +1447,10 @@ static void aio_write_done(void *opaque, int ret)
print_report("wrote", &t2, ctx->offset, ctx->qiov.size, print_report("wrote", &t2, ctx->offset, ctx->qiov.size,
ctx->qiov.size, 1, ctx->Cflag); ctx->qiov.size, 1, ctx->Cflag);
out: out:
qemu_io_free(ctx->buf); if (!ctx->zflag) {
qemu_iovec_destroy(&ctx->qiov); qemu_io_free(ctx->buf);
qemu_iovec_destroy(&ctx->qiov);
}
g_free(ctx); g_free(ctx);
} }
@ -1612,6 +1615,7 @@ static void aio_write_help(void)
" -P, -- use different pattern to fill file\n" " -P, -- use different pattern to fill file\n"
" -C, -- report statistics in a machine parsable format\n" " -C, -- report statistics in a machine parsable format\n"
" -q, -- quiet mode, do not show I/O statistics\n" " -q, -- quiet mode, do not show I/O statistics\n"
" -z, -- write zeroes using blk_aio_write_zeroes\n"
"\n"); "\n");
} }
@ -1622,7 +1626,7 @@ static const cmdinfo_t aio_write_cmd = {
.cfunc = aio_write_f, .cfunc = aio_write_f,
.argmin = 2, .argmin = 2,
.argmax = -1, .argmax = -1,
.args = "[-Cq] [-P pattern ] off len [len..]", .args = "[-Cqz] [-P pattern ] off len [len..]",
.oneline = "asynchronously writes a number of bytes", .oneline = "asynchronously writes a number of bytes",
.help = aio_write_help, .help = aio_write_help,
}; };
@ -1634,7 +1638,7 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv)
struct aio_ctx *ctx = g_new0(struct aio_ctx, 1); struct aio_ctx *ctx = g_new0(struct aio_ctx, 1);
ctx->blk = blk; ctx->blk = blk;
while ((c = getopt(argc, argv, "CqP:")) != -1) { while ((c = getopt(argc, argv, "CqP:z")) != -1) {
switch (c) { switch (c) {
case 'C': case 'C':
ctx->Cflag = 1; ctx->Cflag = 1;
@ -1649,6 +1653,9 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv)
return 0; return 0;
} }
break; break;
case 'z':
ctx->zflag = 1;
break;
default: default:
g_free(ctx); g_free(ctx);
return qemuio_command_usage(&aio_write_cmd); return qemuio_command_usage(&aio_write_cmd);
@ -1660,6 +1667,18 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv)
return qemuio_command_usage(&aio_write_cmd); return qemuio_command_usage(&aio_write_cmd);
} }
if (ctx->zflag && optind != argc - 2) {
printf("-z supports only a single length parameter\n");
g_free(ctx);
return 0;
}
if (ctx->zflag && ctx->Pflag) {
printf("-z and -P cannot be specified at the same time\n");
g_free(ctx);
return 0;
}
ctx->offset = cvtnum(argv[optind]); ctx->offset = cvtnum(argv[optind]);
if (ctx->offset < 0) { if (ctx->offset < 0) {
print_cvtnum_err(ctx->offset, argv[optind]); print_cvtnum_err(ctx->offset, argv[optind]);
@ -1676,19 +1695,33 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv)
return 0; return 0;
} }
nr_iov = argc - optind; if (ctx->zflag) {
ctx->buf = create_iovec(blk, &ctx->qiov, &argv[optind], nr_iov, pattern); int64_t count = cvtnum(argv[optind]);
if (ctx->buf == NULL) { if (count < 0) {
block_acct_invalid(blk_get_stats(blk), BLOCK_ACCT_WRITE); print_cvtnum_err(count, argv[optind]);
g_free(ctx); return 0;
return 0; }
}
gettimeofday(&ctx->t1, NULL); ctx->qiov.size = count;
block_acct_start(blk_get_stats(blk), &ctx->acct, ctx->qiov.size, blk_aio_write_zeroes(blk, ctx->offset >> 9, count >> 9, 0,
BLOCK_ACCT_WRITE); aio_write_done, ctx);
blk_aio_writev(blk, ctx->offset >> 9, &ctx->qiov, } else {
ctx->qiov.size >> 9, aio_write_done, ctx); nr_iov = argc - optind;
ctx->buf = create_iovec(blk, &ctx->qiov, &argv[optind], nr_iov,
pattern);
if (ctx->buf == NULL) {
block_acct_invalid(blk_get_stats(blk), BLOCK_ACCT_WRITE);
g_free(ctx);
return 0;
}
gettimeofday(&ctx->t1, NULL);
block_acct_start(blk_get_stats(blk), &ctx->acct, ctx->qiov.size,
BLOCK_ACCT_WRITE);
blk_aio_writev(blk, ctx->offset >> 9, &ctx->qiov,
ctx->qiov.size >> 9, aio_write_done, ctx);
}
return 0; return 0;
} }

View File

@ -215,7 +215,7 @@ static int find_partition(BlockBackend *blk, int partition,
static void termsig_handler(int signum) static void termsig_handler(int signum)
{ {
state = TERMINATE; atomic_cmpxchg(&state, RUNNING, TERMINATE);
qemu_notify_event(); qemu_notify_event();
} }

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -28,7 +28,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -28,7 +28,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()
@ -57,12 +56,13 @@ do_test()
} | $QEMU_IO } | $QEMU_IO
} }
for write_zero_cmd in "write -z" "aio_write -z"; do
for align in 512 4k; do for align in 512 4k; do
echo echo
echo "== preparing image ==" echo "== preparing image =="
do_test $align "write -P 0xa 0x200 0x400" "$TEST_IMG" | _filter_qemu_io do_test $align "write -P 0xa 0x200 0x400" "$TEST_IMG" | _filter_qemu_io
do_test $align "write -P 0xa 0x20000 0x600" "$TEST_IMG" | _filter_qemu_io do_test $align "write -P 0xa 0x20000 0x600" "$TEST_IMG" | _filter_qemu_io
do_test $align "write -z 0x400 0x20000" "$TEST_IMG" | _filter_qemu_io do_test $align "$write_zero_cmd 0x400 0x20000" "$TEST_IMG" | _filter_qemu_io
echo echo
echo "== verifying patterns (1) ==" echo "== verifying patterns (1) =="
@ -73,7 +73,7 @@ for align in 512 4k; do
echo echo
echo "== rewriting zeroes ==" echo "== rewriting zeroes =="
do_test $align "write -P 0xb 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io do_test $align "write -P 0xb 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io
do_test $align "write -z 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io do_test $align "$write_zero_cmd 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io
echo echo
echo "== verifying patterns (2) ==" echo "== verifying patterns (2) =="
@ -82,7 +82,7 @@ for align in 512 4k; do
echo echo
echo "== rewriting unaligned zeroes ==" echo "== rewriting unaligned zeroes =="
do_test $align "write -P 0xb 0x0 0x1000" "$TEST_IMG" | _filter_qemu_io do_test $align "write -P 0xb 0x0 0x1000" "$TEST_IMG" | _filter_qemu_io
do_test $align "write -z 0x200 0x200" "$TEST_IMG" | _filter_qemu_io do_test $align "$write_zero_cmd 0x200 0x200" "$TEST_IMG" | _filter_qemu_io
echo echo
echo "== verifying patterns (3) ==" echo "== verifying patterns (3) =="
@ -92,6 +92,7 @@ for align in 512 4k; do
echo echo
done done
done
# success, all done # success, all done
echo "*** done" echo "*** done"

View File

@ -42,6 +42,88 @@ read 3072/3072 bytes at offset 1024
3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== preparing image ==
wrote 1024/1024 bytes at offset 512
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 1536/1536 bytes at offset 131072
1.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (1) ==
read 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 512/512 bytes at offset 132096
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== rewriting zeroes ==
wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (2) ==
read 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== rewriting unaligned zeroes ==
wrote 4096/4096 bytes at offset 0
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (3) ==
read 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 3072/3072 bytes at offset 1024
3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== preparing image ==
wrote 1024/1024 bytes at offset 512
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 1536/1536 bytes at offset 131072
1.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (1) ==
read 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 512/512 bytes at offset 132096
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== rewriting zeroes ==
wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (2) ==
read 131072/131072 bytes at offset 1024
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== rewriting unaligned zeroes ==
wrote 4096/4096 bytes at offset 0
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== verifying patterns (3) ==
read 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 512/512 bytes at offset 512
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 3072/3072 bytes at offset 1024
3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== preparing image == == preparing image ==
wrote 1024/1024 bytes at offset 512 wrote 1024/1024 bytes at offset 512
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -28,7 +28,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -28,7 +28,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -810,8 +810,7 @@ class TestRepairQuorum(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.complete_and_wait(drive="quorum0") self.complete_and_wait(drive="quorum0")
result = self.vm.qmp('query-named-block-nodes') self.assert_has_block_node("repair0", quorum_repair_img)
self.assert_qmp(result, 'return[0]/file', quorum_repair_img)
# TODO: a better test requiring some QEMU infrastructure will be added # TODO: a better test requiring some QEMU infrastructure will be added
# to check that this file is really driven by quorum # to check that this file is really driven by quorum
self.vm.shutdown() self.vm.shutdown()
@ -833,8 +832,7 @@ class TestRepairQuorum(iotests.QMPTestCase):
self.cancel_and_wait(drive="quorum0", force=True) self.cancel_and_wait(drive="quorum0", force=True)
# here we check that the last registered quorum file has not been # here we check that the last registered quorum file has not been
# swapped out and unref # swapped out and unref
result = self.vm.qmp('query-named-block-nodes') self.assert_has_block_node(None, quorum_img3)
self.assert_qmp(result, 'return[1]/file', quorum_img3)
self.vm.shutdown() self.vm.shutdown()
def test_cancel_after_ready(self): def test_cancel_after_ready(self):
@ -850,10 +848,9 @@ class TestRepairQuorum(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.wait_ready_and_cancel(drive="quorum0") self.wait_ready_and_cancel(drive="quorum0")
result = self.vm.qmp('query-named-block-nodes')
# here we check that the last registered quorum file has not been # here we check that the last registered quorum file has not been
# swapped out and unref # swapped out and unref
self.assert_qmp(result, 'return[1]/file', quorum_img3) self.assert_has_block_node(None, quorum_img3)
self.vm.shutdown() self.vm.shutdown()
self.assertTrue(iotests.compare_images(quorum_img2, quorum_repair_img), self.assertTrue(iotests.compare_images(quorum_img2, quorum_repair_img),
'target image does not match source after mirroring') 'target image does not match source after mirroring')
@ -974,8 +971,7 @@ class TestRepairQuorum(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {}) self.assert_qmp(result, 'return', {})
self.complete_and_wait(drive="quorum0") self.complete_and_wait(drive="quorum0")
result = self.vm.qmp('query-named-block-nodes') self.assert_has_block_node("repair0", quorum_repair_img)
self.assert_qmp(result, 'return[0]/file', quorum_repair_img)
# TODO: a better test requiring some QEMU infrastructure will be added # TODO: a better test requiring some QEMU infrastructure will be added
# to check that this file is really driven by quorum # to check that this file is really driven by quorum
self.vm.shutdown() self.vm.shutdown()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -27,7 +27,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
nbd_unix_socket=$TEST_DIR/test_qemu_nbd_socket nbd_unix_socket=$TEST_DIR/test_qemu_nbd_socket

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
# get standard environment, filters and checks # get standard environment, filters and checks

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
# get standard environment, filters and checks # get standard environment, filters and checks

View File

@ -26,7 +26,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
# get standard environment, filters and checks # get standard environment, filters and checks

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
trap "exit \$status" 0 1 2 3 15 trap "exit \$status" 0 1 2 3 15

View File

@ -26,7 +26,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=$(basename $0)
echo "QA output created by $seq" echo "QA output created by $seq"
here=$PWD here=$PWD
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=$(basename $0)
echo "QA output created by $seq" echo "QA output created by $seq"
here=$PWD here=$PWD
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
trap "exit \$status" 0 1 2 3 15 trap "exit \$status" 0 1 2 3 15

View File

@ -25,7 +25,6 @@ seq=`basename $0`
echo "QA output created by $seq" echo "QA output created by $seq"
here=`pwd` here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -26,7 +26,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

View File

@ -25,7 +25,6 @@ seq="$(basename $0)"
echo "QA output created by $seq" echo "QA output created by $seq"
here="$PWD" here="$PWD"
tmp=/tmp/$$
status=1 # failure is the default! status=1 # failure is the default!
_cleanup() _cleanup()

Some files were not shown because too many files have changed in this diff Show More