Commit 180b82c1 authored by Yu Kuai's avatar Yu Kuai
Browse files

md/md-bitmap: add a new sysfs api bitmap_type

The api will be used by mdadm to set bitmap_type while creating new array
or assembling array, prepare to add a new bitmap.

Currently available options are:

cat /sys/block/md0/md/bitmap_type
none [bitmap]

Link: https://lore.kernel.org/linux-raid/20250829080426.1441678-6-yukuai1@huaweicloud.com


Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarXiao Ni <xni@redhat.com>
Reviewed-by: default avatarLi Nan <linan122@huawei.com>
parent 300bffa8
Loading
Loading
Loading
Loading
+43 −30
Original line number Diff line number Diff line
@@ -347,6 +347,49 @@ All md devices contain:
     active-idle
         like active, but no writes have been seen for a while (safe_mode_delay).

  consistency_policy
     This indicates how the array maintains consistency in case of unexpected
     shutdown. It can be:

     none
       Array has no redundancy information, e.g. raid0, linear.

     resync
       Full resync is performed and all redundancy is regenerated when the
       array is started after unclean shutdown.

     bitmap
       Resync assisted by a write-intent bitmap.

     journal
       For raid4/5/6, journal device is used to log transactions and replay
       after unclean shutdown.

     ppl
       For raid5 only, Partial Parity Log is used to close the write hole and
       eliminate resync.

     The accepted values when writing to this file are ``ppl`` and ``resync``,
     used to enable and disable PPL.

  uuid
     This indicates the UUID of the array in the following format:
     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

  bitmap_type
     [RW] When read, this file will display the current and available
     bitmap for this array. The currently active bitmap will be enclosed
     in [] brackets. Writing an bitmap name or ID to this file will switch
     control of this array to that new bitmap. Note that writing a new
     bitmap for created array is forbidden.

     none
         No bitmap
     bitmap
         The default internal bitmap

If bitmap_type is bitmap, then the md device will also contain:

  bitmap/location
     This indicates where the write-intent bitmap for the array is
     stored.
@@ -401,36 +444,6 @@ All md devices contain:
     once the array becomes non-degraded, and this fact has been
     recorded in the metadata.

  consistency_policy
     This indicates how the array maintains consistency in case of unexpected
     shutdown. It can be:

     none
       Array has no redundancy information, e.g. raid0, linear.

     resync
       Full resync is performed and all redundancy is regenerated when the
       array is started after unclean shutdown.

     bitmap
       Resync assisted by a write-intent bitmap.

     journal
       For raid4/5/6, journal device is used to log transactions and replay
       after unclean shutdown.

     ppl
       For raid5 only, Partial Parity Log is used to close the write hole and
       eliminate resync.

     The accepted values when writing to this file are ``ppl`` and ``resync``,
     used to enable and disable PPL.

  uuid
     This indicates the UUID of the array in the following format:
     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx


As component devices are added to an md array, they appear in the ``md``
directory as new directories named::

+81 −0
Original line number Diff line number Diff line
@@ -4207,6 +4207,86 @@ new_level_store(struct mddev *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_new_level =
__ATTR(new_level, 0664, new_level_show, new_level_store);

static ssize_t
bitmap_type_show(struct mddev *mddev, char *page)
{
	struct md_submodule_head *head;
	unsigned long i;
	ssize_t len = 0;

	if (mddev->bitmap_id == ID_BITMAP_NONE)
		len += sprintf(page + len, "[none] ");
	else
		len += sprintf(page + len, "none ");

	xa_lock(&md_submodule);
	xa_for_each(&md_submodule, i, head) {
		if (head->type != MD_BITMAP)
			continue;

		if (mddev->bitmap_id == head->id)
			len += sprintf(page + len, "[%s] ", head->name);
		else
			len += sprintf(page + len, "%s ", head->name);
	}
	xa_unlock(&md_submodule);

	len += sprintf(page + len, "\n");
	return len;
}

static ssize_t
bitmap_type_store(struct mddev *mddev, const char *buf, size_t len)
{
	struct md_submodule_head *head;
	enum md_submodule_id id;
	unsigned long i;
	int err = 0;

	xa_lock(&md_submodule);

	if (mddev->bitmap_ops) {
		err = -EBUSY;
		goto out;
	}

	if (cmd_match(buf, "none")) {
		mddev->bitmap_id = ID_BITMAP_NONE;
		goto out;
	}

	xa_for_each(&md_submodule, i, head) {
		if (head->type == MD_BITMAP && cmd_match(buf, head->name)) {
			mddev->bitmap_id = head->id;
			goto out;
		}
	}

	err = kstrtoint(buf, 10, &id);
	if (err)
		goto out;

	if (id == ID_BITMAP_NONE) {
		mddev->bitmap_id = id;
		goto out;
	}

	head = xa_load(&md_submodule, id);
	if (head && head->type == MD_BITMAP) {
		mddev->bitmap_id = id;
		goto out;
	}

	err = -ENOENT;

out:
	xa_unlock(&md_submodule);
	return err ? err : len;
}

static struct md_sysfs_entry md_bitmap_type =
__ATTR(bitmap_type, 0664, bitmap_type_show, bitmap_type_store);

static ssize_t
layout_show(struct mddev *mddev, char *page)
{
@@ -5813,6 +5893,7 @@ __ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize_policy_show,
static struct attribute *md_default_attrs[] = {
	&md_level.attr,
	&md_new_level.attr,
	&md_bitmap_type.attr,
	&md_layout.attr,
	&md_raid_disks.attr,
	&md_uuid.attr,