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:
Anthony Liguori 2013-12-16 09:43:27 -08:00
commit 80d6f5eae7
6 changed files with 58 additions and 34 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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++;

View File

@ -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';

View File

@ -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

View File

@ -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: