mirror of
https://github.com/qemu/qemu.git
synced 2025-08-08 08:05:17 +00:00
Block patches
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) iQIcBAABAgAGBQJSq0gXAAoJEH8JsnLIjy/WRosQAL+l9phOdbeyOkybR6fvt+i1 ZuR8FQTS01xtnVvqeVEueVFrWvFiovBtS4N5ubie1O6CQGF/4HIrFTgRSeUzpPaG qYjMY9pmg2QXP4Kg24z+wMlVbn7uzK0Akrlerr47emLtMLrHdsLrs2m0DAlW8KZN 6umGk+HQ5wPwmF8b4w3BGymOQk22oDCiTXmuBCzdZ+GpsTAhSr+XupvNxo8b+aFk kpphwulOPFntoHlOmcypgjVM8CfUUfjlkQZrZOXj5v63FPhwfeZ3DiVZIWGhOeJl qEaWRtoH2nELe67Py/vvGoITLdH2gS0l1JBkk2wLIqAjA0GiAXpZJrskop4NYAqm NvHaBHUPob5m3JVuh35hAMEbyFaIxS5teC6q1Pirjskiks0jvxYYlTiZw+RDkzqX gqBmBacyuSAJB9UlvlH3si3zSJ4MqN4feVTv8XWXoprq4+gC0xpyCtkZIb4ZrM9/ oAmmYcEytf4Z2fqjPkmcD5lvLl48j3hYkd5zDwEy5TxWvyfqQSkkVx21AQMsqQvq PokiKFJUuyPfEGQgugWDsWM4FdXRhOrK9Q6479lAWP7PE9j9UTI24Z4JJVfLQz+z 0m5IBuaQlBqWbN48twi4DSMTo5jFkxp/cKTXNGeV2cVDYyUuveAj1atTqUh8rZby 95kteXfJhVGiaMQTniIl =XYe2 -----END PGP SIGNATURE----- Merge remote-tracking branch 'kwolf/tags/for-anthony' into staging Block patches # gpg: Signature made Fri 13 Dec 2013 09:47:03 AM PST using RSA key ID C88F2FD6 # gpg: Can't check signature: public key not found # By Peter Lieven (2) and others # Via Kevin Wolf * kwolf/tags/for-anthony: blkdebug: Use QLIST_FOREACH_SAFE to resume IO qemu-img: make progress output more accurate during convert block: expect get_block_status errors in bdrv_make_zero block/vvfat: Fix compiler warnings for OpenBSD qapi-schema.json: Change 1.8 reference to 2.0 sheepdog: check if '-o redundancy' is passed from user Message-id: 1386956943-19474-1-git-send-email-kwolf@redhat.com Signed-off-by: Anthony Liguori <aliguori@amazon.com>
This commit is contained in:
commit
80d6f5eae7
5
block.c
5
block.c
@ -2421,6 +2421,11 @@ int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags)
|
|||||||
nb_sectors = INT_MAX;
|
nb_sectors = INT_MAX;
|
||||||
}
|
}
|
||||||
ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n);
|
ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n);
|
||||||
|
if (ret < 0) {
|
||||||
|
error_report("error getting block status at sector %" PRId64 ": %s",
|
||||||
|
sector_num, strerror(-ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
if (ret & BDRV_BLOCK_ZERO) {
|
if (ret & BDRV_BLOCK_ZERO) {
|
||||||
sector_num += n;
|
sector_num += n;
|
||||||
continue;
|
continue;
|
||||||
|
@ -594,9 +594,9 @@ static int blkdebug_debug_breakpoint(BlockDriverState *bs, const char *event,
|
|||||||
static int blkdebug_debug_resume(BlockDriverState *bs, const char *tag)
|
static int blkdebug_debug_resume(BlockDriverState *bs, const char *tag)
|
||||||
{
|
{
|
||||||
BDRVBlkdebugState *s = bs->opaque;
|
BDRVBlkdebugState *s = bs->opaque;
|
||||||
BlkdebugSuspendedReq *r;
|
BlkdebugSuspendedReq *r, *next;
|
||||||
|
|
||||||
QLIST_FOREACH(r, &s->suspended_reqs, next) {
|
QLIST_FOREACH_SAFE(r, &s->suspended_reqs, next, next) {
|
||||||
if (!strcmp(r->tag, tag)) {
|
if (!strcmp(r->tag, tag)) {
|
||||||
qemu_coroutine_enter(r->co, NULL);
|
qemu_coroutine_enter(r->co, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
@ -609,7 +609,7 @@ static int blkdebug_debug_remove_breakpoint(BlockDriverState *bs,
|
|||||||
const char *tag)
|
const char *tag)
|
||||||
{
|
{
|
||||||
BDRVBlkdebugState *s = bs->opaque;
|
BDRVBlkdebugState *s = bs->opaque;
|
||||||
BlkdebugSuspendedReq *r;
|
BlkdebugSuspendedReq *r, *r_next;
|
||||||
BlkdebugRule *rule, *next;
|
BlkdebugRule *rule, *next;
|
||||||
int i, ret = -ENOENT;
|
int i, ret = -ENOENT;
|
||||||
|
|
||||||
@ -622,7 +622,7 @@ static int blkdebug_debug_remove_breakpoint(BlockDriverState *bs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QLIST_FOREACH(r, &s->suspended_reqs, next) {
|
QLIST_FOREACH_SAFE(r, &s->suspended_reqs, next, r_next) {
|
||||||
if (!strcmp(r->tag, tag)) {
|
if (!strcmp(r->tag, tag)) {
|
||||||
qemu_coroutine_enter(r->co, NULL);
|
qemu_coroutine_enter(r->co, NULL);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -1666,9 +1666,11 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} else if (!strcmp(options->name, BLOCK_OPT_REDUNDANCY)) {
|
} else if (!strcmp(options->name, BLOCK_OPT_REDUNDANCY)) {
|
||||||
ret = parse_redundancy(s, options->value.s);
|
if (options->value.s) {
|
||||||
if (ret < 0) {
|
ret = parse_redundancy(s, options->value.s);
|
||||||
goto out;
|
if (ret < 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
options++;
|
options++;
|
||||||
|
@ -266,8 +266,7 @@ typedef struct mbr_t {
|
|||||||
} QEMU_PACKED mbr_t;
|
} QEMU_PACKED mbr_t;
|
||||||
|
|
||||||
typedef struct direntry_t {
|
typedef struct direntry_t {
|
||||||
uint8_t name[8];
|
uint8_t name[8 + 3];
|
||||||
uint8_t extension[3];
|
|
||||||
uint8_t attributes;
|
uint8_t attributes;
|
||||||
uint8_t reserved[2];
|
uint8_t reserved[2];
|
||||||
uint16_t ctime;
|
uint16_t ctime;
|
||||||
@ -518,11 +517,9 @@ static inline uint8_t fat_chksum(const direntry_t* entry)
|
|||||||
uint8_t chksum=0;
|
uint8_t chksum=0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<11;i++) {
|
for (i = 0; i < ARRAY_SIZE(entry->name); i++) {
|
||||||
unsigned char c;
|
chksum = (((chksum & 0xfe) >> 1) |
|
||||||
|
((chksum & 0x01) ? 0x80 : 0)) + entry->name[i];
|
||||||
c = (i < 8) ? entry->name[i] : entry->extension[i-8];
|
|
||||||
chksum=(((chksum&0xfe)>>1)|((chksum&0x01)?0x80:0)) + c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return chksum;
|
return chksum;
|
||||||
@ -617,7 +614,7 @@ static inline direntry_t* create_short_and_long_name(BDRVVVFATState* s,
|
|||||||
|
|
||||||
if(is_dot) {
|
if(is_dot) {
|
||||||
entry=array_get_next(&(s->directory));
|
entry=array_get_next(&(s->directory));
|
||||||
memset(entry->name,0x20,11);
|
memset(entry->name, 0x20, sizeof(entry->name));
|
||||||
memcpy(entry->name,filename,strlen(filename));
|
memcpy(entry->name,filename,strlen(filename));
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@ -632,12 +629,14 @@ static inline direntry_t* create_short_and_long_name(BDRVVVFATState* s,
|
|||||||
i = 8;
|
i = 8;
|
||||||
|
|
||||||
entry=array_get_next(&(s->directory));
|
entry=array_get_next(&(s->directory));
|
||||||
memset(entry->name,0x20,11);
|
memset(entry->name, 0x20, sizeof(entry->name));
|
||||||
memcpy(entry->name, filename, i);
|
memcpy(entry->name, filename, i);
|
||||||
|
|
||||||
if(j > 0)
|
if (j > 0) {
|
||||||
for (i = 0; i < 3 && filename[j+1+i]; i++)
|
for (i = 0; i < 3 && filename[j + 1 + i]; i++) {
|
||||||
entry->extension[i] = filename[j+1+i];
|
entry->name[8 + i] = filename[j + 1 + i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* upcase & remove unwanted characters */
|
/* upcase & remove unwanted characters */
|
||||||
for(i=10;i>=0;i--) {
|
for(i=10;i>=0;i--) {
|
||||||
@ -861,8 +860,7 @@ static int init_directories(BDRVVVFATState* s,
|
|||||||
{
|
{
|
||||||
direntry_t* entry=array_get_next(&(s->directory));
|
direntry_t* entry=array_get_next(&(s->directory));
|
||||||
entry->attributes=0x28; /* archive | volume label */
|
entry->attributes=0x28; /* archive | volume label */
|
||||||
memcpy(entry->name,"QEMU VVF",8);
|
memcpy(entry->name, "QEMU VVFAT ", sizeof(entry->name));
|
||||||
memcpy(entry->extension,"AT ",3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now build FAT, and write back information into directory */
|
/* Now build FAT, and write back information into directory */
|
||||||
@ -1591,17 +1589,20 @@ static int parse_short_name(BDRVVVFATState* s,
|
|||||||
lfn->name[i] = direntry->name[i];
|
lfn->name[i] = direntry->name[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 2; j >= 0 && direntry->extension[j] == ' '; j--);
|
for (j = 2; j >= 0 && direntry->name[8 + j] == ' '; j--) {
|
||||||
|
}
|
||||||
if (j >= 0) {
|
if (j >= 0) {
|
||||||
lfn->name[i++] = '.';
|
lfn->name[i++] = '.';
|
||||||
lfn->name[i + j + 1] = '\0';
|
lfn->name[i + j + 1] = '\0';
|
||||||
for (;j >= 0; j--) {
|
for (;j >= 0; j--) {
|
||||||
if (direntry->extension[j] <= ' ' || direntry->extension[j] > 0x7f)
|
uint8_t c = direntry->name[8 + j];
|
||||||
return -2;
|
if (c <= ' ' || c > 0x7f) {
|
||||||
else if (s->downcase_short_names)
|
return -2;
|
||||||
lfn->name[i + j] = qemu_tolower(direntry->extension[j]);
|
} else if (s->downcase_short_names) {
|
||||||
else
|
lfn->name[i + j] = qemu_tolower(c);
|
||||||
lfn->name[i + j] = direntry->extension[j];
|
} else {
|
||||||
|
lfn->name[i + j] = c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
lfn->name[i + j + 1] = '\0';
|
lfn->name[i + j + 1] = '\0';
|
||||||
|
@ -949,7 +949,7 @@
|
|||||||
# (only present if removable is true)
|
# (only present if removable is true)
|
||||||
#
|
#
|
||||||
# @dirty-bitmaps: #optional dirty bitmaps information (only present if the
|
# @dirty-bitmaps: #optional dirty bitmaps information (only present if the
|
||||||
# driver has one or more dirty bitmaps) (Since 1.8)
|
# driver has one or more dirty bitmaps) (Since 2.0)
|
||||||
#
|
#
|
||||||
# @io-status: #optional @BlockDeviceIoStatus. Only present if the device
|
# @io-status: #optional @BlockDeviceIoStatus. Only present if the device
|
||||||
# supports it and the VM is configured to stop on errors
|
# supports it and the VM is configured to stop on errors
|
||||||
|
26
qemu-img.c
26
qemu-img.c
@ -1135,8 +1135,7 @@ static int img_convert(int argc, char **argv)
|
|||||||
const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
|
const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
|
||||||
BlockDriver *drv, *proto_drv;
|
BlockDriver *drv, *proto_drv;
|
||||||
BlockDriverState **bs = NULL, *out_bs = NULL;
|
BlockDriverState **bs = NULL, *out_bs = NULL;
|
||||||
int64_t total_sectors, nb_sectors, sector_num, bs_offset,
|
int64_t total_sectors, nb_sectors, sector_num, bs_offset;
|
||||||
sector_num_next_status = 0;
|
|
||||||
uint64_t bs_sectors;
|
uint64_t bs_sectors;
|
||||||
uint8_t * buf = NULL;
|
uint8_t * buf = NULL;
|
||||||
size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
|
size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
|
||||||
@ -1505,6 +1504,8 @@ static int img_convert(int argc, char **argv)
|
|||||||
/* signal EOF to align */
|
/* signal EOF to align */
|
||||||
bdrv_write_compressed(out_bs, 0, NULL, 0);
|
bdrv_write_compressed(out_bs, 0, NULL, 0);
|
||||||
} else {
|
} else {
|
||||||
|
int64_t sectors_to_read, sectors_read, sector_num_next_status;
|
||||||
|
bool count_allocated_sectors;
|
||||||
int has_zero_init = min_sparse ? bdrv_has_zero_init(out_bs) : 0;
|
int has_zero_init = min_sparse ? bdrv_has_zero_init(out_bs) : 0;
|
||||||
|
|
||||||
if (!has_zero_init && bdrv_can_write_zeroes_with_unmap(out_bs)) {
|
if (!has_zero_init && bdrv_can_write_zeroes_with_unmap(out_bs)) {
|
||||||
@ -1515,12 +1516,21 @@ static int img_convert(int argc, char **argv)
|
|||||||
has_zero_init = 1;
|
has_zero_init = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sectors_to_read = total_sectors;
|
||||||
|
count_allocated_sectors = progress && (out_baseimg || has_zero_init);
|
||||||
|
restart:
|
||||||
sector_num = 0; // total number of sectors converted so far
|
sector_num = 0; // total number of sectors converted so far
|
||||||
nb_sectors = total_sectors - sector_num;
|
sectors_read = 0;
|
||||||
|
sector_num_next_status = 0;
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
nb_sectors = total_sectors - sector_num;
|
nb_sectors = total_sectors - sector_num;
|
||||||
if (nb_sectors <= 0) {
|
if (nb_sectors <= 0) {
|
||||||
|
if (count_allocated_sectors) {
|
||||||
|
sectors_to_read = sectors_read;
|
||||||
|
count_allocated_sectors = false;
|
||||||
|
goto restart;
|
||||||
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1586,8 +1596,14 @@ static int img_convert(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
n = MIN(n, bs_sectors - (sector_num - bs_offset));
|
n = MIN(n, bs_sectors - (sector_num - bs_offset));
|
||||||
n1 = n;
|
|
||||||
|
|
||||||
|
sectors_read += n;
|
||||||
|
if (count_allocated_sectors) {
|
||||||
|
sector_num += n;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
n1 = n;
|
||||||
ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
|
ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("error while reading sector %" PRId64 ": %s",
|
error_report("error while reading sector %" PRId64 ": %s",
|
||||||
@ -1612,7 +1628,7 @@ static int img_convert(int argc, char **argv)
|
|||||||
n -= n1;
|
n -= n1;
|
||||||
buf1 += n1 * 512;
|
buf1 += n1 * 512;
|
||||||
}
|
}
|
||||||
qemu_progress_print(100.0 * sector_num / total_sectors, 0);
|
qemu_progress_print(100.0 * sectors_read / sectors_to_read, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user