The error looks as follows:
/root/vzkernel.vzs/drivers/md/dm-qcow2-target.c:798:4: error: expected
expression
798 | struct Qcow2BitmapHeaderExt bitmaps_ext;
| ^
/root/vzkernel.vzs/drivers/md/dm-qcow2-target.c:800:26: error: use of
undeclared identifier 'bitmaps_ext'
800 | if (ext.len != sizeof(bitmaps_ext)) {
| ^
/root/vzkernel.vzs/drivers/md/dm-qcow2-target.c:805:24: error: use of
undeclared identifier 'bitmaps_ext'
805 | if (offset + sizeof(bitmaps_ext) > end) {
| ^
...
and more bitmaps_ext related errors follow.
Yes, clang does accept declarations in the middle of code. I think it was not
allowed only by some older C standards like C89 but in general it is a valid
thing to do. In contrast, declaring variables inside a case block AFAIK is
strictly incorrect. So not sure why gcc allows it.
Regarding the fix, I checked the kernel code before submitting this change and
found numerous places with curly brackets used to introduce a new scope inside
a case block. So in my eyes it's fine.
Best,
Dmitry
________________________________
From: Alexey Kuznetsov <[email protected]>
Sent: Monday, November 17, 2025 3:05 PM
To: Dmitry Sepp <[email protected]>
Cc: Konstantin Khorenko <[email protected]>; Pavel Tikhomirov
<[email protected]>; [email protected] <[email protected]>
Subject: Re: [Devel] [PATCH] dm-qcow2: fix a clang build error in the bitmap
extension parser
Ack!
I suffer from the same problem with gcc 10. BTW what error clang reports?
But I have a question though. Could you check: does this clang accept
declarations
in the middle of code? gcc 10 looks buggy: it accepts declarations
in the middle of code, but does not accept this one as it insists label must
be followed by non-declaration statement, which sounds utterly stupid when
declations in the middle are accepted :-)
Anyway, was not this a severe violation of coding style? checkpatch
does not complain, so that I guess decalalrtions in the middle of code
are not considered as a bug any longer. Which is sad.
BTW I would consider instead of adding ugly stray {} just to scope,
(which is _entirely_ nice, just looks ugly) to use declaration like this:
switch (ext.magic) {
struct Qcow2BitmapHeaderExt bitmaps_ext;
case QCOW2_EXT_MAGIC_BITMAPS:
It is syntactically correct in within any C, in line with natural desire to
have all the declarations at beginning of scope. Though looks unusual.
On Mon, Nov 17, 2025 at 9:11 PM Dmitry Sepp <[email protected]> wrote:
>
> Clang is less forgiving than gcc and does not allow to declare variables in
> the
> middle of a case block.
>
> Fix the issue by correctly intoducing a new scope.
>
> The issue has been observed on:
> clang version 17.0.6 ( 17.0.6-5.vl9)
> Target: x86_64-redhat-linux-gnu
> Thread model: posix
>
> Fixes: 75034a7628f6 ("dm-qcow2: parse bitmap extension")
>
> Signed-off-by: Dmitry Sepp <[email protected]>
>
> Feature: dm-qcow2: block device over QCOW2 files driver
> Signed-off-by: Dmitry Sepp <[email protected]>
> ---
> drivers/md/dm-qcow2-target.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c
> index 90f315315976..bf0b3728790d 100644
> --- a/drivers/md/dm-qcow2-target.c
> +++ b/drivers/md/dm-qcow2-target.c
> @@ -794,7 +794,7 @@ static int qcow2_parse_extensions(struct dm_target *ti,
> struct qcow2 *qcow2,
> offset += sizeof(ext);
>
> switch (ext.magic) {
> - case QCOW2_EXT_MAGIC_BITMAPS:
> + case QCOW2_EXT_MAGIC_BITMAPS: {
> struct Qcow2BitmapHeaderExt bitmaps_ext;
>
> if (ext.len != sizeof(bitmaps_ext)) {
> @@ -814,6 +814,7 @@ static int qcow2_parse_extensions(struct dm_target *ti,
> struct qcow2 *qcow2,
> return ret;
> }
> break;
> + }
> case QCOW2_EXT_MAGIC_END:
> return 0;
> default:
> --
> 2.51.0
>
> _______________________________________________
> Devel mailing list
> [email protected]
> https://lists.openvz.org/mailman/listinfo/devel
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel