From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
To: "NeilBrown" <neilb@suse.de>
Cc: "Paul Menzel" <pmenzel@molgen.mpg.de>,
"Jes Sorensen" <jes@trained-monkey.org>,
linux-raid@vger.kernel.org
Subject: Re: [PATCH mdadm v2] super1: report truncated device
Date: Thu, 21 Jul 2022 10:19:07 +0200 [thread overview]
Message-ID: <20220721101907.00002fee@linux.intel.com> (raw)
In-Reply-To: <165768409124.25184.3270769367375387242@noble.neil.brown.name>
Hi Neil,
On Wed, 13 Jul 2022 13:48:11 +1000
"NeilBrown" <neilb@suse.de> wrote:
> When the metadata is at the start of the device, it is possible that it
> describes a device large than the one it is actually stored on. When
> this happens, report it loudly in --examine.
>
> ....
> Unused Space : before=1968 sectors, after=-2047 sectors DEVICE TOO SMALL
> State : clean TRUNCATED DEVICE
> ....
State : clean TRUNCATED DEVICE is enough. "DEVICE TOO SMALL" seems to be
redundant.
>
> Also report in --assemble so that the failure which the kernel will
> report will be explained.
Understand but you've added it in load_super1() so it affects all load_super()
calls, is it indented? I assume yes but please confirm.
>
> mdadm: Device /dev/sdb is not large enough for data described in superblock
> mdadm: no RAID superblock on /dev/sdb
> mdadm: /dev/sdb has no superblock - assembly aborted
>
> Scenario can be demonstrated as follows:
>
> mdadm: Note: this array has metadata at the start and
> may not be suitable as a boot device. If you plan to
> store '/boot' on this device please ensure that
> your boot-loader understands md/v1.x metadata, or use
> --metadata=0.90
> mdadm: Defaulting to version 1.2 metadata
> mdadm: array /dev/md/test started.
> mdadm: stopped /dev/md/test
> Unused Space : before=1968 sectors, after=-2047 sectors DEVICE TOO SMALL
> State : clean TRUNCATED DEVICE
> Unused Space : before=1968 sectors, after=-2047 sectors DEVICE TOO SMALL
> State : clean TRUNCATED DEVICE
>
> Signed-off-by: NeilBrown <neilb@suse.de>
> ---
> super1.c | 34 +++++++++++++++++++++++++++-------
> 1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/super1.c b/super1.c
> index 71af860c0e3e..4d8dba8a5a44 100644
> --- a/super1.c
> +++ b/super1.c
> @@ -406,12 +406,18 @@ static void examine_super1(struct supertype *st, char
> *homehost)
> st->ss->getinfo_super(st, &info, NULL);
> if (info.space_after != 1 &&
> - !(__le32_to_cpu(sb->feature_map) & MD_FEATURE_NEW_OFFSET))
> - printf(" Unused Space : before=%llu sectors, after=%llu
> sectors\n",
> - info.space_before, info.space_after);
> -
> - printf(" State : %s\n",
> - (__le64_to_cpu(sb->resync_offset)+1)? "active":"clean");
> + !(__le32_to_cpu(sb->feature_map) & MD_FEATURE_NEW_OFFSET)) {
> + printf(" Unused Space : before=%llu sectors, ",
> + info.space_before);
> + if (info.space_after < INT64_MAX)
> + printf("after=%llu sectors\n", info.space_after);
> + else
> + printf("after=-%llu sectors DEVICE TOO SMALL\n",
> + UINT64_MAX - info.space_after);
As above, for me this else here is not necessary.
> + }
> + printf(" State : %s%s\n",
> + (__le64_to_cpu(sb->resync_offset)+1)? "active":"clean",
> + info.space_after > INT64_MAX ? " TRUNCATED DEVICE" : "");
Could you use standard if instruction to make the code more readable? We are
avoiding ternary operators if possible now.
> printf(" Device UUID : ");
> for (i=0; i<16; i++) {
> if ((i&3)==0 && i != 0)
> @@ -2206,6 +2212,7 @@ static int load_super1(struct supertype *st, int fd,
> char *devname) tst.ss = &super1;
> for (tst.minor_version = 0; tst.minor_version <= 2;
> tst.minor_version++) {
> + tst.ignore_hw_compat = st->ignore_hw_compat;
> switch(load_super1(&tst, fd, devname)) {
> case 0: super = tst.sb;
> if (bestvers == -1 ||
> @@ -2312,7 +2319,6 @@ static int load_super1(struct supertype *st, int fd,
> char *devname) free(super);
> return 2;
> }
> - st->sb = super;
>
> bsb = (struct bitmap_super_s *)(((char*)super)+MAX_SB_SIZE);
>
> @@ -2322,6 +2328,20 @@ static int load_super1(struct supertype *st, int fd,
> char *devname) if (st->data_offset == INVALID_SECTORS)
> st->data_offset = __le64_to_cpu(super->data_offset);
>
> + if (st->minor_version >= 1 &&
> + st->ignore_hw_compat == 0 &&
> + (__le64_to_cpu(super->data_offset) +
> + __le64_to_cpu(super->size) > dsize ||
> + __le64_to_cpu(super->data_offset) +
> + __le64_to_cpu(super->data_size) > dsize)) {
> + if (devname)
> + pr_err("Device %s is not large enough for data
> described in superblock\n",
> + devname);
why not just:
if (__le64_to_cpu(super->data_offset) + __le64_to_cpu(super->data_size) > dsize)
from my understanding, only this check matters.
Thanks,
Mariusz
next prev parent reply other threads:[~2022-07-21 8:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-12 1:00 [PATCH mdadm] super1: report truncated device NeilBrown
[not found] ` <cff69e79-d681-c9d6-c719-8b10999a558a@molgen.mpg.de>
2022-07-13 3:48 ` [PATCH mdadm v2] " NeilBrown
2022-07-21 8:19 ` Mariusz Tkaczyk [this message]
2022-07-21 16:21 ` Ternary Operator (was: [PATCH mdadm v2] super1: report truncated device) Paul Menzel
2022-07-22 6:55 ` Mariusz Tkaczyk
2022-07-23 4:37 ` [PATCH mdadm v2] super1: report truncated device NeilBrown
2022-07-25 7:42 ` Mariusz Tkaczyk
2022-08-24 15:58 ` Jes Sorensen
2022-08-25 0:24 ` NeilBrown
2022-08-25 7:59 ` Mariusz Tkaczyk
2022-08-25 13:42 ` Jes Sorensen
2022-08-25 22:55 ` [PATCH v3] " NeilBrown
2022-08-29 15:46 ` Jes Sorensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220721101907.00002fee@linux.intel.com \
--to=mariusz.tkaczyk@linux.intel.com \
--cc=jes@trained-monkey.org \
--cc=linux-raid@vger.kernel.org \
--cc=neilb@suse.de \
--cc=pmenzel@molgen.mpg.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.