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;
|
||||
}
|
||||
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) {
|
||||
sector_num += n;
|
||||
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)
|
||||
{
|
||||
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)) {
|
||||
qemu_coroutine_enter(r->co, NULL);
|
||||
return 0;
|
||||
@ -609,7 +609,7 @@ static int blkdebug_debug_remove_breakpoint(BlockDriverState *bs,
|
||||
const char *tag)
|
||||
{
|
||||
BDRVBlkdebugState *s = bs->opaque;
|
||||
BlkdebugSuspendedReq *r;
|
||||
BlkdebugSuspendedReq *r, *r_next;
|
||||
BlkdebugRule *rule, *next;
|
||||
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)) {
|
||||
qemu_coroutine_enter(r->co, NULL);
|
||||
ret = 0;
|
||||
|
@ -1666,9 +1666,11 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
|
||||
goto out;
|
||||
}
|
||||
} else if (!strcmp(options->name, BLOCK_OPT_REDUNDANCY)) {
|
||||
ret = parse_redundancy(s, options->value.s);
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
if (options->value.s) {
|
||||
ret = parse_redundancy(s, options->value.s);
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
options++;
|
||||
|
@ -266,8 +266,7 @@ typedef struct mbr_t {
|
||||
} QEMU_PACKED mbr_t;
|
||||
|
||||
typedef struct direntry_t {
|
||||
uint8_t name[8];
|
||||
uint8_t extension[3];
|
||||
uint8_t name[8 + 3];
|
||||
uint8_t attributes;
|
||||
uint8_t reserved[2];
|
||||
uint16_t ctime;
|
||||
@ -518,11 +517,9 @@ static inline uint8_t fat_chksum(const direntry_t* entry)
|
||||
uint8_t chksum=0;
|
||||
int i;
|
||||
|
||||
for(i=0;i<11;i++) {
|
||||
unsigned char c;
|
||||
|
||||
c = (i < 8) ? entry->name[i] : entry->extension[i-8];
|
||||
chksum=(((chksum&0xfe)>>1)|((chksum&0x01)?0x80:0)) + c;
|
||||
for (i = 0; i < ARRAY_SIZE(entry->name); i++) {
|
||||
chksum = (((chksum & 0xfe) >> 1) |
|
||||
((chksum & 0x01) ? 0x80 : 0)) + entry->name[i];
|
||||
}
|
||||
|
||||
return chksum;
|
||||
@ -617,7 +614,7 @@ static inline direntry_t* create_short_and_long_name(BDRVVVFATState* s,
|
||||
|
||||
if(is_dot) {
|
||||
entry=array_get_next(&(s->directory));
|
||||
memset(entry->name,0x20,11);
|
||||
memset(entry->name, 0x20, sizeof(entry->name));
|
||||
memcpy(entry->name,filename,strlen(filename));
|
||||
return entry;
|
||||
}
|
||||
@ -632,12 +629,14 @@ static inline direntry_t* create_short_and_long_name(BDRVVVFATState* s,
|
||||
i = 8;
|
||||
|
||||
entry=array_get_next(&(s->directory));
|
||||
memset(entry->name,0x20,11);
|
||||
memset(entry->name, 0x20, sizeof(entry->name));
|
||||
memcpy(entry->name, filename, i);
|
||||
|
||||
if(j > 0)
|
||||
for (i = 0; i < 3 && filename[j+1+i]; i++)
|
||||
entry->extension[i] = filename[j+1+i];
|
||||
if (j > 0) {
|
||||
for (i = 0; i < 3 && filename[j + 1 + i]; i++) {
|
||||
entry->name[8 + i] = filename[j + 1 + i];
|
||||
}
|
||||
}
|
||||
|
||||
/* upcase & remove unwanted characters */
|
||||
for(i=10;i>=0;i--) {
|
||||
@ -861,8 +860,7 @@ static int init_directories(BDRVVVFATState* s,
|
||||
{
|
||||
direntry_t* entry=array_get_next(&(s->directory));
|
||||
entry->attributes=0x28; /* archive | volume label */
|
||||
memcpy(entry->name,"QEMU VVF",8);
|
||||
memcpy(entry->extension,"AT ",3);
|
||||
memcpy(entry->name, "QEMU VVFAT ", sizeof(entry->name));
|
||||
}
|
||||
|
||||
/* 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];
|
||||
}
|
||||
|
||||
for (j = 2; j >= 0 && direntry->extension[j] == ' '; j--);
|
||||
for (j = 2; j >= 0 && direntry->name[8 + j] == ' '; j--) {
|
||||
}
|
||||
if (j >= 0) {
|
||||
lfn->name[i++] = '.';
|
||||
lfn->name[i + j + 1] = '\0';
|
||||
for (;j >= 0; j--) {
|
||||
if (direntry->extension[j] <= ' ' || direntry->extension[j] > 0x7f)
|
||||
return -2;
|
||||
else if (s->downcase_short_names)
|
||||
lfn->name[i + j] = qemu_tolower(direntry->extension[j]);
|
||||
else
|
||||
lfn->name[i + j] = direntry->extension[j];
|
||||
uint8_t c = direntry->name[8 + j];
|
||||
if (c <= ' ' || c > 0x7f) {
|
||||
return -2;
|
||||
} else if (s->downcase_short_names) {
|
||||
lfn->name[i + j] = qemu_tolower(c);
|
||||
} else {
|
||||
lfn->name[i + j] = c;
|
||||
}
|
||||
}
|
||||
} else
|
||||
lfn->name[i + j + 1] = '\0';
|
||||
|
@ -949,7 +949,7 @@
|
||||
# (only present if removable is true)
|
||||
#
|
||||
# @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
|
||||
# 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;
|
||||
BlockDriver *drv, *proto_drv;
|
||||
BlockDriverState **bs = NULL, *out_bs = NULL;
|
||||
int64_t total_sectors, nb_sectors, sector_num, bs_offset,
|
||||
sector_num_next_status = 0;
|
||||
int64_t total_sectors, nb_sectors, sector_num, bs_offset;
|
||||
uint64_t bs_sectors;
|
||||
uint8_t * buf = NULL;
|
||||
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 */
|
||||
bdrv_write_compressed(out_bs, 0, NULL, 0);
|
||||
} 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
nb_sectors = total_sectors - sector_num;
|
||||
sectors_read = 0;
|
||||
sector_num_next_status = 0;
|
||||
|
||||
for(;;) {
|
||||
nb_sectors = total_sectors - sector_num;
|
||||
if (nb_sectors <= 0) {
|
||||
if (count_allocated_sectors) {
|
||||
sectors_to_read = sectors_read;
|
||||
count_allocated_sectors = false;
|
||||
goto restart;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
@ -1586,8 +1596,14 @@ static int img_convert(int argc, char **argv)
|
||||
}
|
||||
|
||||
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);
|
||||
if (ret < 0) {
|
||||
error_report("error while reading sector %" PRId64 ": %s",
|
||||
@ -1612,7 +1628,7 @@ static int img_convert(int argc, char **argv)
|
||||
n -= n1;
|
||||
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:
|
||||
|
Loading…
Reference in New Issue
Block a user