From: "Tkaczyk, Mariusz" <mariusz.tkaczyk@linux.intel.com>
To: Xiao Ni <xni@redhat.com>, jes@trained-monkey.org
Cc: ncroxon@redhat.com, ffan@redhat.com, linux-raid@vger.kernel.org
Subject: Re: [PATCH 1/1] mdadm/Detail: Can't show container name correctly when unpluging disks
Date: Mon, 18 Oct 2021 08:55:52 +0200 [thread overview]
Message-ID: <92351bf8-b0e3-89da-48c0-993b0dc29db2@linux.intel.com> (raw)
In-Reply-To: <1634289920-5037-1-git-send-email-xni@redhat.com>
Hi Xiao,
Thanks for taking care of this.
On 15.10.2021 11:25, Xiao Ni wrote:
> The test case is:
> 1. create one imsm container
> 2. create a raid5 device from the container
> 3. unplug two disks
> 4. mdadm --detail /dev/md126
> [root@rhel85 ~]# mdadm -D /dev/md126
> /dev/md126:
> Container : ��, member 0
>
> The Detail function first gets container name by function
> map_dev_preferred. Then it tries to find which disks are
> available. In patch db5377883fef(It should be FAILED..)
> uses map_dev_preferred to find which disks are under /dev.
>
> But now, the major/minor information comes from kernel space.
> map_dev_preferred malloc memory and init a device list when
> first be called by Detail. It can't find the device in the
> list by the major/minor. It free the memory and reinit the
> list.
> > The container name now points to an area tha has been freed.
> So the containt is a mess.
>
Container name is collected with 'create' flag set, so it's
name is additionally copied to static memory to prevent
overwrites. Could you verify?
So summarizing: the previously returned value might be lost
in next call.
I looked into code, map_dev_preffered() mainly is used for
determining short-life buffers, which are used only to the next
call (next call overwrites previous result, expect case you fixed).
IMO map_dev_preffered() cannot be trusted now. I see some options:
1 - allocate additional memory and save return value there (caller
needs to free it later).
2 - describe limitations in description of the function to avoid
incorrect usages in the future.
> This patch replaces map_dev_preferred with devid2kname. If
> the name is NULL, it means the disk is unplug.
>
Your patch fixes only one place. Please go forward and analyze all
map_dev_preffered() calls (which looks safe to me). Maybe this
function can be replaced at all and we can drop this code in
flavor of devid2kname() or other.
> Fixes: db5377883fef (It should be FAILED when raid has)
> Signed-off-by: Xiao Ni <xni@redhat.com>
> Reported-by: Fine Fan <ffan@redhat.com>
> ---
> Detail.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/Detail.c b/Detail.c
> index d3af0ab..2164de3 100644
> --- a/Detail.c
> +++ b/Detail.c
> @@ -351,11 +351,13 @@ int Detail(char *dev, struct context *c)
> avail = xcalloc(array.raid_disks, 1);
>
> for (d = 0; d < array.raid_disks; d++) {
> - char *dv, *dv_rep;
> - dv = map_dev_preferred(disks[d*2].major,
> - disks[d*2].minor, 0, c->prefer);
> - dv_rep = map_dev_preferred(disks[d*2+1].major,
> - disks[d*2+1].minor, 0, c->prefer);
> + char *dv, *dv_rep = NULL;
> +
> + if (!disks[d*2].major && !disks[d*2].minor)
> + continue; > +
> + dv = devid2kname(makedev(disks[d*2].major, disks[d*2].minor));
> + dv_rep = devid2kname(makedev(disks[d*2+1].major, disks[d*2+1].minor));
>
> if ((dv && (disks[d*2].state & (1<<MD_DISK_SYNC))) ||
> (dv_rep && (disks[d*2+1].state & (1<<MD_DISK_SYNC)))) {
>
Yeah, I know that it is used in Detail this way, but please determine
way to replace this ugly [d*2] and [d*2+1].
This whole block should be moved from Detail() code to separate
function, which determines if device or replacement is in sync.
Thanks,
Mariusz
next prev parent reply other threads:[~2021-10-18 6:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-15 9:25 [PATCH 1/1] mdadm/Detail: Can't show container name correctly when unpluging disks Xiao Ni
2021-10-18 6:55 ` Tkaczyk, Mariusz [this message]
2021-10-18 7:15 ` Tkaczyk, Mariusz
2021-10-18 12:33 ` Xiao Ni
2021-10-18 9:58 ` Xiao Ni
2021-10-18 11:52 ` Tkaczyk, Mariusz
2021-10-18 13:05 ` Xiao Ni
2021-10-19 7:01 ` Jes Sorensen
-- strict thread matches above, loose matches on Subject: below --
2021-10-20 14:38 Xiao Ni
2021-10-21 9:13 ` Tkaczyk, Mariusz
2021-10-22 0:09 ` Xiao Ni
2021-10-22 0:38 ` Xiao Ni
2021-11-02 16:00 ` 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=92351bf8-b0e3-89da-48c0-993b0dc29db2@linux.intel.com \
--to=mariusz.tkaczyk@linux.intel.com \
--cc=ffan@redhat.com \
--cc=jes@trained-monkey.org \
--cc=linux-raid@vger.kernel.org \
--cc=ncroxon@redhat.com \
--cc=xni@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).