Re: [PATCH v2 13/44] qemu-option: Use returned bool to check for failure

2020-07-03 Thread Vladimir Sementsov-Ogievskiy

02.07.2020 18:49, Markus Armbruster wrote:

The previous commit enables conversion of

 foo(..., &err);
 if (err) {
 ...
 }

to

 if (!foo(..., &err)) {
 ...
 }

for QemuOpts functions that now return true / false on success /
error.  Coccinelle script:

 @@
 identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, 
parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, 
qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, 
qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, 
qemu_opts_validate};
 expression list args, args2;
 typedef Error;
 Error *err;
 @@
 -fun(args, &err, args2);
 -if (err)
 +if (!fun(args, &err, args2))
  {
  ...
  }

A few line breaks tidied up manually.

Signed-off-by: Markus Armbruster


Improve reviewer script to cover indentation/spacing/wrapping changes:

#!/usr/bin/env python3

import sys
import re


re_remove_add = re.compile(r'(?P(^-.*\n)+)(?P(^\+.*\n)+)',
   flags=re.MULTILINE)
re_remove = re.compile(r'(?P(?P\w+)\(.*,&(?P\w+)\));'
   r'if\((?P=err)(!=NULL)?\)\{')
re_add = re.compile(r'if\(!(?P.*)\)\{')
all_functions = set()


def check_subchunk(subchunk):
"""check subchunk

Check that subchunk matches
- func(args..., &err);
- if (err) {
+ if (!func(args..., &err)) {
ignoring indentation and spaces

Also, while being here, register each found func in all_functions.
"""
m = re_remove_add.fullmatch(subchunk)
if not m:
return False

remove = re.sub(r'^-', '', m.group('remove'), flags=re.MULTILINE)
remove = re.sub(r'\s', '', remove)

add = re.sub(r'^\+', '', m.group('add'), flags=re.MULTILINE)
add = re.sub(r'\s', '', add)

m = re_remove.fullmatch(remove)
if not m:
return False

all_functions.add(m.group('func'))
func_call = m.group('func_call')

m = re_add.fullmatch(add)

if not m:
return False

return func_call == m.group('func_call')


with open(sys.argv[1]) as f:
patch = f.read()

# Drop patch header
patch = re.sub('^.*?^---$.*?^diff', 'diff', patch,
   flags=(re.MULTILINE | re.DOTALL))

# Drop patch footer
patch = re.sub(r'^-- *\n(\d+\.)+\d+\s*\Z', '', patch, flags=re.MULTILINE)

files = re.split(r'(^diff .*\n'
 r'^index .*\n'
 r'^--- .*\n'
 r'^\+\+\+ .*)\n', patch, flags=re.MULTILINE)

assert files[0] == ''
del files[0]

subchunk_re = re.compile(r'(^[+-].*\n)+', flags=re.MULTILINE)

all_ok = True
for i in range(0, len(files), 2):
file = files[i]
patch = files[i + 1]
print_caption = True

for chunk in re.split('^@', patch, flags=re.MULTILINE):
if not all(check_subchunk(m.group(0))
   for m in subchunk_re.finditer(chunk)):
if print_caption:
print(file)
print_caption = False
print(chunk)
all_ok = False

if all_ok:
print('ALL OK.\nfound functions:\n')
print('\n'.join(list(all_functions)))




run it:
# ./check2.py /work/nfs_share/patches/markus/errors/v2/\[PATCH\ v2\ 13_44\]\ 
qemu-option\:\ Use\ returned\ bool\ to\ check\ for\ failure\ -\ Markus\ Armbruster\ 
\\ -\ 2020-07-02\ 1849.eml
ALL OK.
found functions:

qemu_opt_set_bool
qemu_opts_do_parse
qemu_opt_set
qemu_opts_absorb_qdict
qemu_opt_parse
qemu_opt_rename
qemu_opts_validate
parse_option_size
qemu_opts_from_qdict_entry
opts_do_parse

functions seems to have corresponding semantics, all chunks are valid:

Reviewed-by: Vladimir Sementsov-Ogievskiy 

--
Best regards,
Vladimir



Re: [PATCH v2 13/44] qemu-option: Use returned bool to check for failure

2020-07-02 Thread Eric Blake

On 7/2/20 10:49 AM, Markus Armbruster wrote:

The previous commit enables conversion of

 foo(..., &err);
 if (err) {
 ...
 }

to

 if (!foo(..., &err)) {
 ...
 }

for QemuOpts functions that now return true / false on success /
error.  Coccinelle script:

 @@
 identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, 
parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, 
qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, 
qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, 
qemu_opts_validate};
 expression list args, args2;
 typedef Error;
 Error *err;
 @@
 -fun(args, &err, args2);
 -if (err)
 +if (!fun(args, &err, args2))
  {
  ...
  }

A few line breaks tidied up manually.

Signed-off-by: Markus Armbruster 
---


Similar results to the script in 3/44.

Reviewed-by: Eric Blake 

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




[PATCH v2 13/44] qemu-option: Use returned bool to check for failure

2020-07-02 Thread Markus Armbruster
The previous commit enables conversion of

foo(..., &err);
if (err) {
...
}

to

if (!foo(..., &err)) {
...
}

for QemuOpts functions that now return true / false on success /
error.  Coccinelle script:

@@
identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, 
parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, 
qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, 
qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, 
qemu_opts_validate};
expression list args, args2;
typedef Error;
Error *err;
@@
-fun(args, &err, args2);
-if (err)
+if (!fun(args, &err, args2))
 {
 ...
 }

A few line breaks tidied up manually.

Signed-off-by: Markus Armbruster 
---
 block.c   | 16 ++--
 block/blkdebug.c  |  3 +--
 block/blklogwrites.c  |  3 +--
 block/blkverify.c |  3 +--
 block/crypto.c|  3 +--
 block/curl.c  |  3 +--
 block/file-posix.c|  6 ++
 block/file-win32.c|  6 ++
 block/gluster.c   | 15 +--
 block/iscsi.c |  3 +--
 block/nbd.c   |  3 +--
 block/parallels.c |  3 +--
 block/qcow2.c |  3 +--
 block/quorum.c|  3 +--
 block/raw-format.c|  3 +--
 block/replication.c   |  3 +--
 block/sheepdog.c  |  3 +--
 block/ssh.c   |  3 +--
 block/throttle.c  |  3 +--
 block/vpc.c   |  3 +--
 block/vvfat.c |  3 +--
 block/vxhs.c  |  6 ++
 blockdev.c| 11 ---
 chardev/char.c|  6 ++
 contrib/ivshmem-server/main.c |  4 ++--
 hw/net/virtio-net.c   |  5 ++---
 hw/smbios/smbios.c| 24 
 qapi/string-input-visitor.c   |  3 +--
 qemu-img.c| 19 +++
 tpm.c |  3 +--
 util/qemu-config.c| 12 
 util/qemu-option.c| 16 ++--
 32 files changed, 71 insertions(+), 132 deletions(-)

diff --git a/block.c b/block.c
index 6dbcb7e083..8d478bdc51 100644
--- a/block.c
+++ b/block.c
@@ -1629,8 +1629,7 @@ static int bdrv_open_common(BlockDriverState *bs, 
BlockBackend *file,
 assert(options != NULL && bs->options != options);
 
 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
-qemu_opts_absorb_qdict(opts, options, &local_err);
-if (local_err) {
+if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
 error_propagate(errp, local_err);
 ret = -EINVAL;
 goto fail_opts;
@@ -4091,8 +4090,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, 
BlockReopenQueue *queue,
 
 /* Process generic block layer options */
 opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
-qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
-if (local_err) {
+if (!qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err)) {
 error_propagate(errp, local_err);
 ret = -EINVAL;
 goto error;
@@ -6078,8 +6076,7 @@ void bdrv_img_create(const char *filename, const char 
*fmt,
 
 /* Parse -o options */
 if (options) {
-qemu_opts_do_parse(opts, options, NULL, &local_err);
-if (local_err) {
+if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
 goto out;
 }
 }
@@ -6092,8 +6089,8 @@ void bdrv_img_create(const char *filename, const char 
*fmt,
 }
 
 if (base_filename) {
-qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
-if (local_err) {
+if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
+  &local_err)) {
 error_setg(errp, "Backing file not supported for file format '%s'",
fmt);
 goto out;
@@ -6101,8 +6098,7 @@ void bdrv_img_create(const char *filename, const char 
*fmt,
 }
 
 if (base_fmt) {
-qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
-if (local_err) {
+if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err)) {
 error_setg(errp, "Backing file format not supported for file "
  "format '%s'", fmt);
 goto out;
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 7194bc7f06..d473dcf8c7 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -472,8 +472,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict 
*options, int flags,
 uint64_t align;
 
 opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-qemu_opts_absorb_qdict(opts, options, &local_err);
-if (local_err) {
+if (!qemu_opts_absorb_qdict(opts, options, &local_err