Merge remote-tracking branch 'qmp/queue/qmp' into staging

* qmp/queue/qmp:
  hmp: show the backing file depth
  block: Use bdrv_get_backing_file_depth()
  block: create bdrv_get_backing_file_depth()
  qapi: qapi.py: allow the "'" character to be escaped
This commit is contained in:
Anthony Liguori 2012-08-03 14:28:26 -05:00
commit 2ad728bd4b
6 changed files with 48 additions and 13 deletions

16
block.c
View File

@ -2450,6 +2450,9 @@ BlockInfoList *qmp_query_block(Error **errp)
info->value->inserted->backing_file = g_strdup(bs->backing_file); info->value->inserted->backing_file = g_strdup(bs->backing_file);
} }
info->value->inserted->backing_file_depth =
bdrv_get_backing_file_depth(bs);
if (bs->io_limits_enabled) { if (bs->io_limits_enabled) {
info->value->inserted->bps = info->value->inserted->bps =
bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL]; bs->io_limits.bps[BLOCK_IO_LIMIT_TOTAL];
@ -2754,6 +2757,19 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
return NULL; return NULL;
} }
int bdrv_get_backing_file_depth(BlockDriverState *bs)
{
if (!bs->drv) {
return 0;
}
if (!bs->backing_hd) {
return 0;
}
return 1 + bdrv_get_backing_file_depth(bs->backing_hd);
}
#define NB_SUFFIXES 4 #define NB_SUFFIXES 4
char *get_human_readable_size(char *buf, int buf_size, int64_t size) char *get_human_readable_size(char *buf, int buf_size, int64_t size)

View File

@ -174,6 +174,7 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top,
int nb_sectors, int *pnum); int nb_sectors, int *pnum);
BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs, BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
const char *backing_file); const char *backing_file);
int bdrv_get_backing_file_depth(BlockDriverState *bs);
int bdrv_truncate(BlockDriverState *bs, int64_t offset); int bdrv_truncate(BlockDriverState *bs, int64_t offset);
int64_t bdrv_getlength(BlockDriverState *bs); int64_t bdrv_getlength(BlockDriverState *bs);
int64_t bdrv_get_allocated_file_size(BlockDriverState *bs); int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);

2
hmp.c
View File

@ -227,6 +227,8 @@ void hmp_info_block(Monitor *mon)
if (info->value->inserted->has_backing_file) { if (info->value->inserted->has_backing_file) {
monitor_printf(mon, " backing_file="); monitor_printf(mon, " backing_file=");
monitor_print_filename(mon, info->value->inserted->backing_file); monitor_print_filename(mon, info->value->inserted->backing_file);
monitor_printf(mon, " backing_file_depth=%" PRId64,
info->value->inserted->backing_file_depth);
} }
monitor_printf(mon, " ro=%d drv=%s encrypted=%d", monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
info->value->inserted->ro, info->value->inserted->ro,

View File

@ -398,6 +398,8 @@
# #
# @backing_file: #optional the name of the backing file (for copy-on-write) # @backing_file: #optional the name of the backing file (for copy-on-write)
# #
# @backing_file_depth: number of files in the backing file chain (since: 1.2)
#
# @encrypted: true if the backing device is encrypted # @encrypted: true if the backing device is encrypted
# #
# @bps: total throughput limit in bytes per second is specified # @bps: total throughput limit in bytes per second is specified
@ -418,9 +420,10 @@
## ##
{ 'type': 'BlockDeviceInfo', { 'type': 'BlockDeviceInfo',
'data': { 'file': 'str', 'ro': 'bool', 'drv': 'str', 'data': { 'file': 'str', 'ro': 'bool', 'drv': 'str',
'*backing_file': 'str', 'encrypted': 'bool', '*backing_file': 'str', 'backing_file_depth': 'int',
'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int', 'encrypted': 'bool', 'bps': 'int', 'bps_rd': 'int',
'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int'} } 'bps_wr': 'int', 'iops': 'int', 'iops_rd': 'int',
'iops_wr': 'int'} }
## ##
# @BlockDeviceIoStatus: # @BlockDeviceIoStatus:

View File

@ -1317,6 +1317,7 @@ Each json-object contain the following:
"nbd", "parallels", "qcow", "qcow2", "raw", "nbd", "parallels", "qcow", "qcow2", "raw",
"tftp", "vdi", "vmdk", "vpc", "vvfat" "tftp", "vdi", "vmdk", "vpc", "vvfat"
- "backing_file": backing file name (json-string, optional) - "backing_file": backing file name (json-string, optional)
- "backing_file_depth": number of files in the backing file chain (json-int)
- "encrypted": true if encrypted, false otherwise (json-bool) - "encrypted": true if encrypted, false otherwise (json-bool)
- "bps": limit total bytes per second (json-int) - "bps": limit total bytes per second (json-int)
- "bps_rd": limit read bytes per second (json-int) - "bps_rd": limit read bytes per second (json-int)
@ -1345,6 +1346,7 @@ Example:
"drv":"qcow2", "drv":"qcow2",
"encrypted":false, "encrypted":false,
"file":"disks/test.img", "file":"disks/test.img",
"backing_file_depth":0,
"bps":1000000, "bps":1000000,
"bps_rd":0, "bps_rd":0,
"bps_wr":0, "bps_wr":0,

View File

@ -13,18 +13,29 @@ from ordereddict import OrderedDict
def tokenize(data): def tokenize(data):
while len(data): while len(data):
if data[0] in ['{', '}', ':', ',', '[', ']']: ch = data[0]
yield data[0] data = data[1:]
data = data[1:] if ch in ['{', '}', ':', ',', '[', ']']:
elif data[0] in ' \n': yield ch
data = data[1:] elif ch in ' \n':
elif data[0] == "'": None
data = data[1:] elif ch == "'":
string = '' string = ''
while data[0] != "'": esc = False
string += data[0] while True:
if (data == ''):
raise Exception("Mismatched quotes")
ch = data[0]
data = data[1:] data = data[1:]
data = data[1:] if esc:
string += ch
esc = False
elif ch == "\\":
esc = True
elif ch == "'":
break
else:
string += ch
yield string yield string
def parse(tokens): def parse(tokens):