|
| From: | Thomas Huth |
| Subject: | ram_save_complete() is fishy (was: Re: [PATCH] migration/ram: Fix compilation with -Wshadow=local) |
| Date: | Mon, 23 Oct 2023 19:30:04 +0200 |
| User-agent: | Mozilla Thunderbird |
On 23/10/2023 19.11, Thomas Huth wrote:
On 23/10/2023 17.57, Peter Xu wrote:On Mon, Oct 23, 2023 at 04:50:44PM +0200, Thomas Huth wrote:No need for a new variable here, especially not for one that shadows a variable from the beginning of the function scope. With this change the code now successfully compiles with -Wshadow=local. Signed-off-by: Thomas Huth <thuth@redhat.com> --- migration/ram.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 92769902bb..9de9e54fa9 100644 --- a/migration/ram.c +++ b/migration/ram.c@@ -3238,8 +3238,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)ram_flush_compressed_data(rs); - int ret = rdma_registration_stop(f, RAM_CONTROL_FINISH); - if (ret < 0) { + if (rdma_registration_stop(f, RAM_CONTROL_FINISH) < 0) {We may need to rename "ret" to something else? qemu_file_set_error(), right below, will reference the error returned.qemu_file_set_error(f, ret); <-----------------Oh, drat, right ... that's exactly one of the reasons why shadowing variables is a bad idea ;-)I'll redo a v2.
Actually, there is more fishy stuff in this function:
static int ram_save_complete(QEMUFile *f, void *opaque)
{
...
int ret = 0;
...
WITH_RCU_READ_LOCK_GUARD() {
...
ret = rdma_registration_start(f, RAM_CONTROL_FINISH);
if (ret < 0) {
qemu_file_set_error(f, ret);
### here we use the outer "ret" variable ###
}
...
while (true) {
int pages;
pages = ram_find_and_save_block(rs);
/* no more blocks to sent */
if (pages == 0) {
### here we break without touching "ret" (preserving the previous error) ###
break;
}
if (pages < 0) {
ret = pages;
### we only replace the outer "ret" in this break-case here
break;
}
}
...
int ret = rdma_registration_stop(f, RAM_CONTROL_FINISH);
### so while ret from rdma_registration_start() might be propageted
### below, the ret from rdma_registration_stop() is only local here?
if (ret < 0) {
qemu_file_set_error(f, ret);
}
}
if (ret < 0) {
### this might trigger by the "ret" from rdma_registration_start() but
### not by the one from rdma_registration_stop()? ... very weird...
return ret;
}
Looks like commit 48408174a7ec7 messed up with the return types pretty badly
... any suggestions what's the right way forward here? Should the return
value of rdma_registration_start() only be used for the
qemu_file_set_error(), too? Or should the return value of
rdma_registration_stop() be allowed to be used for the "return ret" at the
end, too?
Thomas
| [Prev in Thread] | Current Thread | [Next in Thread] |