From: Su Yue <l@damenly.org>
To: Yu Kuai <yukuai@fnnas.com>
Cc: Song Liu <song@kernel.org>,
glass.su@suse.com, Li Nan <linan122@huawei.com>,
Xiao Ni <xiao@kernel.org>,
linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v13 2/3] md/md-bitmap: split bitmap sysfs groups
Date: Sat, 25 Apr 2026 16:36:42 +0800 [thread overview]
Message-ID: <eck377xh.fsf@damenly.org> (raw)
In-Reply-To: <20260425024615.1696892-3-yukuai@fnnas.com> (Yu Kuai's message of "Sat, 25 Apr 2026 10:46:14 +0800")
On Sat 25 Apr 2026 at 10:46, Yu Kuai <yukuai@fnnas.com> wrote:
> Split the classic bitmap sysfs files into a common bitmap group
> with
> the location attribute and a separate internal bitmap group for
> the
> remaining files.
>
> At the same time, convert bitmap operations from a single sysfs
> group
> to a sysfs group array so backends can share part of their sysfs
> layout while adding backend-specific attributes separately.
>
> Switch the bitmap sysfs helpers to use sysfs_update_groups() for
> the
> add and update path, and remove groups in reverse order so
> shared named
> groups are unmerged before the last group removes the directory.
>
> Also make bitmap operation lookup depend only on the currently
> selected
> bitmap id matching the installed backend. This prepares the
> lookup path
> for a later registered none backend.
>
> Signed-off-by: Yu Kuai <yukuai@fnnas.com>
> ---
> drivers/md/md-bitmap.c | 23 +++++++++++++++++++----
> drivers/md/md-bitmap.h | 2 +-
> drivers/md/md-llbitmap.c | 7 ++++++-
> drivers/md/md.c | 21 ++++++++++++++-------
> 4 files changed, 40 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
> index 83378c033c72..eba649703a1c 100644
> --- a/drivers/md/md-bitmap.c
> +++ b/drivers/md/md-bitmap.c
> @@ -2955,8 +2955,12 @@ static struct md_sysfs_entry
> max_backlog_used =
> __ATTR(max_backlog_used, S_IRUGO | S_IWUSR,
> behind_writes_used_show, behind_writes_used_reset);
>
> -static struct attribute *md_bitmap_attrs[] = {
> +static struct attribute *md_bitmap_common_attrs[] = {
> &bitmap_location.attr,
> + NULL
> +};
> +
> +static struct attribute *md_bitmap_internal_attrs[] = {
> &bitmap_space.attr,
> &bitmap_timeout.attr,
> &bitmap_backlog.attr,
> @@ -2967,9 +2971,20 @@ static struct attribute
> *md_bitmap_attrs[] = {
> NULL
> };
>
> -static struct attribute_group md_bitmap_group = {
> +static struct attribute_group md_bitmap_common_group = {
> + .name = "bitmap",
> + .attrs = md_bitmap_common_attrs,
> +};
> +
> +static struct attribute_group md_bitmap_internal_group = {
> .name = "bitmap",
> - .attrs = md_bitmap_attrs,
> + .attrs = md_bitmap_internal_attrs,
> +};
> +
> +static const struct attribute_group *bitmap_groups[] = {
> + &md_bitmap_common_group,
> + &md_bitmap_internal_group,
> + NULL,
> };
>
> static struct bitmap_operations bitmap_ops = {
> @@ -3013,7 +3028,7 @@ static struct bitmap_operations bitmap_ops
> = {
> .set_pages = bitmap_set_pages,
> .free = md_bitmap_free,
>
> - .group = &md_bitmap_group,
> + .groups = bitmap_groups,
> };
>
> int md_bitmap_init(void)
> diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h
> index b42a28fa83a0..214f623c7e79 100644
> --- a/drivers/md/md-bitmap.h
> +++ b/drivers/md/md-bitmap.h
> @@ -125,7 +125,7 @@ struct bitmap_operations {
> void (*set_pages)(void *data, unsigned long pages);
> void (*free)(void *data);
>
> - struct attribute_group *group;
> + const struct attribute_group **groups;
> };
>
> /* the bitmap API */
> diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c
> index 9e7e6b1a6f15..1adc5b117821 100644
> --- a/drivers/md/md-llbitmap.c
> +++ b/drivers/md/md-llbitmap.c
> @@ -1738,6 +1738,11 @@ static struct attribute_group
> md_llbitmap_group = {
> .attrs = md_llbitmap_attrs,
> };
>
> +static const struct attribute_group *md_llbitmap_groups[] = {
> + &md_llbitmap_group,
> + NULL,
> +};
> +
> static struct bitmap_operations llbitmap_ops = {
> .head = {
> .type = MD_BITMAP,
> @@ -1774,7 +1779,7 @@ static struct bitmap_operations
> llbitmap_ops = {
> .dirty_bits = llbitmap_dirty_bits,
> .write_all = llbitmap_write_all,
>
> - .group = &md_llbitmap_group,
> + .groups = md_llbitmap_groups,
> };
>
> int md_llbitmap_init(void)
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 99aa1367c991..0ef81d116191 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -681,7 +681,7 @@ static void no_op(struct percpu_ref *r) {}
>
> static void md_bitmap_sysfs_add(struct mddev *mddev)
> {
> - if (sysfs_create_group(&mddev->kobj,
> mddev->bitmap_ops->group))
> + if (sysfs_update_groups(&mddev->kobj,
> mddev->bitmap_ops->groups))
> pr_warn("md: cannot register extra bitmap attributes for
> %s\n",
> mdname(mddev));
> else
> @@ -694,16 +694,23 @@ static void md_bitmap_sysfs_add(struct
> mddev *mddev)
>
> static void md_bitmap_sysfs_del(struct mddev *mddev)
> {
> - sysfs_remove_group(&mddev->kobj, mddev->bitmap_ops->group);
> + int nr_groups = 0;
> +
> + for (nr_groups = 0; mddev->bitmap_ops->groups[nr_groups];
> nr_groups++)
> + ;
> +
> + while (--nr_groups >= 1)
> + sysfs_unmerge_group(&mddev->kobj,
> + mddev->bitmap_ops->groups[nr_groups]);
>
Amazing magic here!
Reviewed-by: Su Yue <glass.su@suse.com>
> + sysfs_remove_group(&mddev->kobj,
> mddev->bitmap_ops->groups[0]);
> }
>
> static bool mddev_set_bitmap_ops_nosysfs(struct mddev *mddev)
> {
> - struct bitmap_operations *old = mddev->bitmap_ops;
> struct md_submodule_head *head;
>
> - if (mddev->bitmap_id == ID_BITMAP_NONE ||
> - (old && old->head.id == mddev->bitmap_id))
> + if (mddev->bitmap_ops &&
> + mddev->bitmap_ops->head.id == mddev->bitmap_id)
> return true;
>
> xa_lock(&md_submodule);
> @@ -6581,7 +6588,7 @@ static int md_bitmap_create(struct mddev
> *mddev)
> if (err)
> return err;
>
> - if (!mddev_is_dm(mddev) && mddev->bitmap_ops->group)
> + if (!mddev_is_dm(mddev) && mddev->bitmap_ops->groups)
> md_bitmap_sysfs_add(mddev);
>
> return 0;
> @@ -6599,7 +6606,7 @@ static void
> md_bitmap_destroy_nosysfs(struct mddev *mddev)
> static void md_bitmap_destroy(struct mddev *mddev)
> {
> if (!mddev_is_dm(mddev) && mddev->bitmap_ops &&
> - mddev->bitmap_ops->group)
> + mddev->bitmap_ops->groups)
> md_bitmap_sysfs_del(mddev);
>
> md_bitmap_destroy_nosysfs(mddev);
next prev parent reply other threads:[~2026-04-25 8:42 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-25 2:46 [PATCH v13 0/3] md/md-bitmap: restore bitmap grow through sysfs Yu Kuai
2026-04-25 2:46 ` [PATCH v13 1/3] md: factor bitmap creation away from sysfs handling Yu Kuai
2026-04-25 8:30 ` Su Yue
2026-04-25 2:46 ` [PATCH v13 2/3] md/md-bitmap: split bitmap sysfs groups Yu Kuai
2026-04-25 8:36 ` Su Yue [this message]
2026-04-25 2:46 ` [PATCH v13 3/3] md/md-bitmap: add a none backend for bitmap grow Yu Kuai
2026-04-25 8:39 ` Su Yue
2026-04-25 2:49 ` [PATCH v13 0/3] md/md-bitmap: restore bitmap grow through sysfs Yu Kuai
2026-04-25 8:41 ` Su Yue
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=eck377xh.fsf@damenly.org \
--to=l@damenly.org \
--cc=glass.su@suse.com \
--cc=linan122@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-raid@vger.kernel.org \
--cc=song@kernel.org \
--cc=xiao@kernel.org \
--cc=yukuai@fnnas.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