]> git.ipfire.org Git - thirdparty/mdadm.git/log
thirdparty/mdadm.git
10 days agoCreate.c: fix uclibc build main master
Fabrice Fontaine [Fri, 12 Apr 2024 16:45:13 +0000 (18:45 +0200)] 
Create.c: fix uclibc build

Define FALLOC_FL_ZERO_RANGE if needed as FALLOC_FL_ZERO_RANGE is only
defined for aarch64 on uclibc-ng resulting in the following or1k build
failure since commit 577fd10486d8d1472a6b559066f344ac30a3a391:

Create.c: In function 'write_zeroes_fork':
Create.c:155:35: error: 'FALLOC_FL_ZERO_RANGE' undeclared (first use in this function)
  155 |                 if (fallocate(fd, FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE,
      |                                   ^~~~~~~~~~~~~~~~~~~~

Fixes:
 - http://autobuild.buildroot.org/results/0e04bcdb591ca5642053e1f7e31384f06581e989

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 weeks agomdadm: Add README.md
Mariusz Tkaczyk [Tue, 26 Mar 2024 12:21:12 +0000 (13:21 +0100)] 
mdadm: Add README.md

Describe supported metadata types, add step-by-step patch sending
instruction, mention minimally supported kernel version and licensing.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 weeks agomdadm: Add MAINTAINERS.md
Mariusz Tkaczyk [Tue, 26 Mar 2024 12:21:11 +0000 (13:21 +0100)] 
mdadm: Add MAINTAINERS.md

Describe rules maintainer should follow.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 weeks agomdadm: add CHANGELOG.md
Mariusz Tkaczyk [Tue, 26 Mar 2024 12:21:10 +0000 (13:21 +0100)] 
mdadm: add CHANGELOG.md

Bring changelog back to life. Remove ANNOUCEs. It will use markdown
format, to have one style. All releases are migrated to new
changelog. It was a exercise I have taken, to familiarize with the
mdadm history.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agoimsm: drive encryption policy implementation
Blazej Kucman [Fri, 22 Mar 2024 11:51:20 +0000 (12:51 +0100)] 
imsm: drive encryption policy implementation

IMSM cares about drive encryption state. It is not allowed to mix disks
with different encryption state within one md device. This policy will
verify that attempt to use disks with different encryption states will
fail. Verification is performed for devices NVMe/SATA Opal and SATA.

There is one exception, Opal SATA drives encryption is not checked when
ENCRYPTION_NO_VERIFY key with "sata_opal" value is set in conf, for this
reason such drives are treated as without encryption support.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agoimsm: print disk encryption information
Blazej Kucman [Fri, 22 Mar 2024 11:51:19 +0000 (12:51 +0100)] 
imsm: print disk encryption information

Print SATA/NVMe disk encryption information in --detail-platform.
Encryption Ability and Status will be printed for each disk.

There is one exception, Opal SATA drives encryption is not checked when
ENCRYPTION_NO_VERIFY key with "sata_opal" value is set in conf, for this
reason such drives are treated as without encryption support.

To test this feature, drives SATA/NVMe with Opal support or SATA drives
with encryption support have to be used.

Example outputs of --detail-platform:

Non Opal, encryption enabled, SATA drive:
Port0 : /dev/sdc (CVPR050600G3120LGN)
        Encryption(Ability|Status): Other|Unlocked

NVMe drive without Opal support:
NVMe under VMD : /dev/nvme2n1 (PHLF737302GB1P0GGN)
        Encryption(Ability|Status): None|Unencrypted

Unencrypted SATA drive with OPAL support:

- default allow_tpm, we will get an error from mdadm:
          Port6 : /dev/sdi (CVTS4246015V180IGN)
mdadm: Detected SATA drive /dev/sdi with Trusted Computing support.
mdadm: Cannot verify encryption state. Requires libata.tpm_enabled=1.
mdadm: Failed to get drive encrytpion information.

-  default "allow_tpm" and config entry "ENCRYPTION_NO_VERIFY sata_opal":
Port6 : /dev/sdi (CVTS4246015V180IGN)
        Encryption(Ability|Status): None|Unencrypted

- added "libata.allow_tpm=1" to boot parameters(requires reboot),
the status will be read correctly:
Port6 : /dev/sdi (CVTS4246015V180IGN)
        Encryption(Ability|Status): SED|Unencrypted

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agoAdd key ENCRYPTION_NO_VERIFY to conf
Blazej Kucman [Fri, 22 Mar 2024 11:51:18 +0000 (12:51 +0100)] 
Add key ENCRYPTION_NO_VERIFY to conf

Add ENCRYPTION_NO_VERIFY config key and allow to disable checking
encryption status for given type of drives.

The key is introduced because of SATA Opal disks for which TPM commands
must be enabled in libata kernel module, (libata.allow_tpm=1), otherwise
it is impossible to verify encryption status. TPM commands are disabled by
default.

Currently the key only supports the "sata_opal" value, if necessary,
the functionality is ready to support more types of disks. This
functionality will be used in the next patches.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agoAdd reading SATA encryption information
Blazej Kucman [Fri, 22 Mar 2024 11:51:17 +0000 (12:51 +0100)] 
Add reading SATA encryption information

Functionality reads information about SATA disk encryption. Technical
documentation used is given in the implementation.

The implementation is able to recognized two encryption standards for SATA
drives, OPAL and ATA security.

If the SATA drive supports OPAL, encryption status and ability are
determined based on Opal Level 0 discovery response, for ATA security,
based on ATA identify response. If SATA supports OPAL, ability is set to
"SED", for ATA security to "Other".

SED(Self-Encrypting Drive) is commonly used to describe drive which using
OPAL or Enterprise standards developed by Trusted Computing Group. Ability
"Other" is used for ATA security because we rely only on information from
ATA identify which describe the overall state of encryption.

It is allowed to mix disks with different encryption ability such as "SED"
and "Other" and it is not security gap.

Motivation for adding this functionality is to block mixing of disks in
IMSM arrays with encryption enabled and disabled. The main goal is to not
allow stealing data by rebuilding array to not encrypted drive which can be
read elsewhere.

For SATA Opal drives, libata allow_tmp parameter enabled is required, which
is necessary for Opal Security commands to work, therefore, if the
parameter is not enabled, SATA Opal disk cannot be used in case the
encryption will be checked by metadata.

Implemented functions will be used in one of the next patches. In one of
the next patches, a flag will be added to enable disabling SATA Opal
encryption checking due to allow_tpm kernel setting dependency.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agoAdd reading Opal NVMe encryption information
Blazej Kucman [Fri, 22 Mar 2024 11:51:16 +0000 (12:51 +0100)] 
Add reading Opal NVMe encryption information

For NVMe devices with Opal support, encryption information, status and
ability are determined based on Opal Level 0 discovery response. Technical
documentation used is given in the implementation.

Ability in general describes what type of encryption is supported, Status
describes in what state the disk with encryption support is. The current
patch includes only the implementation of reading encryption information,
functions will be used in one of the next patches.

Motivation for adding this functionality is to block mixing of disks in
IMSM arrays with encryption enabled and disabled. The main goal is to not
allow stealing data by rebuilding array to not encrypted drive which can be
read elsewhere.

Value ENA_OTHER from enum encryption_ability will be used in the next
patch.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 weeks agomdadm: Move pr_vrb define to mdadm.h
Blazej Kucman [Fri, 22 Mar 2024 11:51:15 +0000 (12:51 +0100)] 
mdadm: Move pr_vrb define to mdadm.h

Move pr_vrb define from super-intel.c to mdadm.h to make it widely
available. This change will be used in the next patches.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 weeks agoRemove all "if zeros" pt.2
Mateusz Kusiak [Tue, 19 Mar 2024 10:15:29 +0000 (11:15 +0100)] 
Remove all "if zeros" pt.2

Commit e15e8b00cbce ("Remove all "if zeros"") did not remove all "if 0"
code blocks.

This commit is cleanup for that commit.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 weeks agomdadm: fix grow segfault for IMSM
Mariusz Tkaczyk [Mon, 18 Mar 2024 16:28:42 +0000 (17:28 +0100)] 
mdadm: fix grow segfault for IMSM

If sc is not initialized, there is possibility that sc.pols is not zeroed
and it causes segfault.

Add missing initialization.
Add missing dev_policy_free() in two places.

Fixes: f656201188d7 ("mdadm: drop get_required_spare_criteria()")
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 weeks agosysfs: remove vers parameter from sysfs_set_array
Mateusz Kusiak [Mon, 18 Mar 2024 15:53:31 +0000 (16:53 +0100)] 
sysfs: remove vers parameter from sysfs_set_array

9003 was passed directly to sysfs_set_array() since md_get_version()
always returned this value. md_get_version() was removed long ago.

Remove dead version check from sysfs_set_array().
Remove "vers" argument and fix function calls.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 weeks agomdadm: Fix native --detail --export
Mariusz Tkaczyk [Mon, 18 Mar 2024 15:19:30 +0000 (16:19 +0100)] 
mdadm: Fix native --detail --export

Mentioned commit (see Fixes) causes that UUID is not swapped as expected
for native superblock. Fix this problem.

For detail, we should avoid superblock calls, we can have information
about supertype from map, use that.

Simplify fname_from_uuid() by removing dependencies to metadata
handler, it is not needed. Decision is taken at compile time, expect
super1 but this function is not used by super1. Add warning about that.
Remove separator, it is always ':'.

Fixes: 60c19530dd7c ("Detail: remove duplicated code")
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 weeks agomdadm: set swapuuid in all handlers
Mariusz Tkaczyk [Mon, 18 Mar 2024 15:19:29 +0000 (16:19 +0100)] 
mdadm: set swapuuid in all handlers

It is not set, so it should be 0 but it may vary on compilation
settings. Set it always to 0.

metadata should care to set UUID and read in proper endianness so it
doesn't follow super1 concept of swapuuid to depend on endianness.

It is not an attempt to fix endianness issues.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoutil.c: add limits.h include for NAME_MAX definition
Alexander Kanavin [Tue, 12 Mar 2024 10:01:50 +0000 (11:01 +0100)] 
util.c: add limits.h include for NAME_MAX definition

Add limits.h include for NAME_MAX definition.

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoudev.c: Do not require libudev.h if DNO_LIBUDEV
Mariusz Tkaczyk [Wed, 6 Mar 2024 14:50:55 +0000 (15:50 +0100)] 
udev.c: Do not require libudev.h if DNO_LIBUDEV

libudev may not be presented at all, do not require it.

Reported-by: Boian Bonev <bbonev@ipacct.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: remove inventory file
Mariusz Tkaczyk [Wed, 6 Mar 2024 12:45:53 +0000 (13:45 +0100)] 
mdadm: remove inventory file

It is a file with repo content list. It is outdated already.
Remove it.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoRevert "policy.c: Avoid to take spare without defined domain by imsm"
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:17 +0000 (12:52 +0100)] 
Revert "policy.c: Avoid to take spare without defined domain by imsm"

This reverts commit 3bf9495270d7 ("policy.c: Avoid to take spare without
defined domain by imsm").

IMSM does not require to be special now because it doesn't create disk
controller domain.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: drop get_disk_controller_domain()
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:16 +0000 (12:52 +0100)] 
mdadm: drop get_disk_controller_domain()

This function is unused now. Drop it.
Controller for IMSM is a device policy and is separated from user defined
domains.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoimsm: test_and_add_device_policies() implementation
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:15 +0000 (12:52 +0100)] 
imsm: test_and_add_device_policies() implementation

This patch removes get_disk_controller_domain_imsm() in favour of
test_and_add_device_policies_imsm(). It is used by
create, add and mdmonitor.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoMonitor, Incremental: use device policies
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:14 +0000 (12:52 +0100)] 
Monitor, Incremental: use device policies

spare_criteria is expanded to contain policies which will be generated
by handler's get_spare_criteria() function. It provides a way to
test device for metadata specific policies earlier than during
add_do_super(), when device is already removed from previous
array/container for Monitor.

For Incremental, it ensures that all criteria are tested when trying
spare. It is not tested when device contains valid metadata.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoManage: check device policies in manage_add_external()
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:13 +0000 (12:52 +0100)] 
Manage: check device policies in manage_add_external()

Only IMSM is going to use device policies so it is added to
manage_add_external(). Test policies before adding the drive to
container.

The change blocks adding new device to the container which already
contains not matching devices

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoCreate: Use device policies
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:12 +0000 (12:52 +0100)] 
Create: Use device policies

Generate and compare policies, abort if policies do not match.
It is tested for both create modes, with container and disk list
specified directly. It is used if supertype supports it.

For a case when disk list is specified, container may contain more
devices, so additional check on container is done to analyze all disks.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: test_and_add device policies implementation
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:11 +0000 (12:52 +0100)] 
mdadm: test_and_add device policies implementation

Add support for three scenarios:
- obtaining array wide policies via fd,
- obtaining array wide policies via struct mdinfo,
- getting policies for particular drive from the request.

Add proper functions and make them extern. These functions are used
in next patches.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm.h: Introduce custom device policies
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:10 +0000 (12:52 +0100)] 
mdadm.h: Introduce custom device policies

The approach proposed here is to test drive policies outside
validate_geometry() separately per every drive and add determined
policies to list. The implementation reuses dev_policy we have in
mdadm.

This concept addresses following problems:
- test drives if they fit together to criteria required by metadata
  handler,
- test all drives assigned to the container even if some of them are not
  target of the request, mdmon is free to use any drive in the same
  container,
- extensibility, new policies can be added to handler easy,
- fix issues related to imsm controller domain verifying.

Add superswitch function. It is used in next patches.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: introduce sysfs_get_container_devnm()
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:09 +0000 (12:52 +0100)] 
mdadm: introduce sysfs_get_container_devnm()

There at least two places where it is done directly, so replace them
with function. Print message about creating external array, add "/dev/"
prefix to refer directly to devnode.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoManage: implement manage_add_external()
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:08 +0000 (12:52 +0100)] 
Manage: implement manage_add_external()

Move external add code to separate function. It is easier to control
error path now. Error messages are adjusted.

No functional changes.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agoManage: fix check after dereference issue
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:07 +0000 (12:52 +0100)] 
Manage: fix check after dereference issue

The code dereferences dev_st earlier without checking, it gives SAST
problem.

dev_st is needed for attempt_re_add(), but it is executed only if
dv->disposition != 'S', so move disposition check up.

tst is a must to reach this place, dup_super() have to return valid
pointer, all it needs to check is if load_super() returns superblock.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: drop get_required_spare_criteria()
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:06 +0000 (12:52 +0100)] 
mdadm: drop get_required_spare_criteria()

Only IMSM implements get_spare_criteria, so load_super() in
get_required_spare_criteria() is dead code. It is moved inside
metadata handler, because only IMSM implements it.

Give possibility to provide devnode to be opened. With that we can hide
load_container() used only to fill spare criteria inside handler
and simplify implementation in generic code.

Add helper function for testing spare criteria in Incremental and
error messages.

File descriptor in get_spare_criteria_imsm() is always opened on purpose.
New functionality added in next patches will require it. For the same
reason, function is moved to other place.

No functional changes.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
6 weeks agomdadm: Add functions for spare criteria verification
Mariusz Tkaczyk [Thu, 29 Feb 2024 11:52:05 +0000 (12:52 +0100)] 
mdadm: Add functions for spare criteria verification

It is done similar way in few places. As a result, two almost identical
functions (dev_size_from_id() and dev_sector_size_from_id()) are
removed. Now, it uses same file descriptor to send two ioctls.

Two extern functions are added, in next patches
disk_fd_matches_criteria() is used.

Next optimization is inline zeroing struct spare_criteria. With that,
we don't need to reset values in get_spare_criteria_imsm().

Dedicated boolean field for checking if criteria are filled is added.
We don't need to execute the code if it is not set.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
7 weeks agoDetail: remove duplicated code
Kinga Tanska [Tue, 27 Feb 2024 02:36:14 +0000 (03:36 +0100)] 
Detail: remove duplicated code

Remove duplicated code from Detail(), where MD_UUID and MD_DEVNAME
are being set. Superblock is no longer required to print system
properties. Now it tries to obtain map in two ways.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agomdadm: move documentation to folder
Mariusz Tkaczyk [Fri, 23 Feb 2024 14:51:46 +0000 (15:51 +0100)] 
mdadm: move documentation to folder

Move documentation text files to directory.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agomdadm: remove mkinitramfs stuff
Mariusz Tkaczyk [Fri, 23 Feb 2024 14:51:45 +0000 (15:51 +0100)] 
mdadm: remove mkinitramfs stuff

This script uses mdadm.static which is known to not be abandoned
(probably not working) from years. Mdadm is integrated with dracut
and mkinitramfs these days.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agomdadm: remove mdadm.spec
Mariusz Tkaczyk [Fri, 23 Feb 2024 14:51:44 +0000 (15:51 +0100)] 
mdadm: remove mdadm.spec

This file is outdated, distributions have their own specs.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agomdadm: remove makedist
Mariusz Tkaczyk [Fri, 23 Feb 2024 14:51:43 +0000 (15:51 +0100)] 
mdadm: remove makedist

Archives are generated kernel.org automation, no need to submit
them manually, so remove legacy solution.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agomdadm: remove TODO
Mariusz Tkaczyk [Fri, 23 Feb 2024 14:51:42 +0000 (15:51 +0100)] 
mdadm: remove TODO

This file is not updated in 16 years.
No reasons to keep it. Remove it.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agosuper-intel: respect IMSM_DEVNAME_AS_SERIAL flag
Kinga Tanska [Tue, 27 Feb 2024 06:36:39 +0000 (07:36 +0100)] 
super-intel: respect IMSM_DEVNAME_AS_SERIAL flag

IMSM_DEVNAME_AS_SERIAL flag was respected only when searching
serial using nvme or scsi device wasn't successful. This
flag shall be applied first, to have user settings with
the highest priority.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
8 weeks agoMonitor: Allow no PID in check_one_sharer()
Mateusz Kusiak [Wed, 28 Feb 2024 15:37:20 +0000 (16:37 +0100)] 
Monitor: Allow no PID in check_one_sharer()

Commit 5fb5479ad100 ("Monitor: open file before check in
check_one_sharer()") introduced a regression that prohibits monitor
from starting if PID file does not exist.

Add check for no PID file.
Add missing fclose().

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agotest: run tests on system level mdadm
Mateusz Kusiak [Tue, 20 Feb 2024 16:04:44 +0000 (17:04 +0100)] 
test: run tests on system level mdadm

The tests run with MDADM_NO_SYSTEMCTL flag by default, however it has
no effect on udev. In case of external metadata, even if flag is set,
udev will trigger systemd to launch mdmon.

This commit changes test execution level, so the tests are run on system
level mdadm, meaning local build must be installed prior to running
tests.

Add warning that the tests are run on system level mdadm and local
build must be installed first.

Do not call mdadm with "quiet" as it makes it not display critical
messages necessary for debug.

Remove forcing speed_limit and add restoring system speed_limit_max
after test execution.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agomdmon: refactor md device name check in main()
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:12 +0000 (11:56 +0100)] 
mdmon: refactor md device name check in main()

Refactor mdmon main function to verify if fd is valid prior to checking
device name. This is due to static code analysis complaining after
change b938519e7719 ("util: remove obsolete code from get_md_name").

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agosuper1: check fd before passing to get_dev_size() in add_to_super1()
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:11 +0000 (11:56 +0100)] 
super1: check fd before passing to get_dev_size() in add_to_super1()

Check if file descriptor is valid before passing it to get_dev_size() in
add_to_super().

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoGrow: remove dead condition in Grow_reshape()
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:10 +0000 (11:56 +0100)] 
Grow: remove dead condition in Grow_reshape()

Remove dead "if" condition from Grow_reshape(). Sysfs read check is
performed earlier in the code.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoMonitor: open file before check in check_one_sharer()
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:09 +0000 (11:56 +0100)] 
Monitor: open file before check in check_one_sharer()

Open file before performing checks in check_one_sharer() to avoid
file tampering.
Remove redundant access check.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agomdadm: signal_s() init variables
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:08 +0000 (11:56 +0100)] 
mdadm: signal_s() init variables

Init sigaction structs in signal_s().
This approach might throw warnings for GCC 4.x and lower.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoCreate: add_disk_to_super() fix resource leak
Mateusz Kusiak [Tue, 20 Feb 2024 10:56:07 +0000 (11:56 +0100)] 
Create: add_disk_to_super() fix resource leak

Fixes resource leak in add_disk_to_super().

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoAdd understanding output section in man
Mateusz Kusiak [Thu, 18 Jan 2024 10:30:19 +0000 (11:30 +0100)] 
Add understanding output section in man

Add new section in man for explaining mdadm outputs.
Describe checkpoint entry.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoGrow: Move update_tail assign to Grow_reshape()
Mateusz Kusiak [Thu, 18 Jan 2024 10:30:18 +0000 (11:30 +0100)] 
Grow: Move update_tail assign to Grow_reshape()

Due to e919fb0af245 ("FIX: Enable metadata updates for raid0") code
can't enter super-intel.c:3415, resulting in checkpoint not being
saved to metadata for second volume in matrix raid array.
This results in checkpoint being stuck at last value for the
first volume.

Move st->update_tail to Grow_reshape() so it is assigned for each
volume.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoSuper-intel: Fix first checkpoint restart
Mateusz Kusiak [Thu, 18 Jan 2024 10:30:17 +0000 (11:30 +0100)] 
Super-intel: Fix first checkpoint restart

When imsm based array is stopped after reaching first checkpoint and
then assembled, first checkpoint is reported as 0.

This behaviour is valid only for initial checkpoint, if the array was
stopped while performing some action.

Last checkpoint value is not taken from metadata but always starts
with 0 and it's incremented when sync_completed in sysfs changes.

In simplification, read_and_act() is responsible for checkpoint updates
and is executed each time sysfs checkpoint update happens. For first
checkpoint it is executed twice and due to marking checkpoint before
triggering any action on the array, it is impossible to read
sync_completed from sysfs in just two iterations.

The workaround to this is not marking any checkpoint for first
sysfs checkpoint after RAID assembly, to preserve checkpoint value
stored in metadata.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agomonitor: refactor checkpoint update
Mateusz Kusiak [Thu, 18 Jan 2024 10:30:16 +0000 (11:30 +0100)] 
monitor: refactor checkpoint update

"if" statements of checkpoint updates have too many responsibilties.
This results in unclear code flow and duplicated code.

Refactor checkpoint update code and simplify "if" statements.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoRemove hardcoded checkpoint interval checking
Mateusz Kusiak [Thu, 18 Jan 2024 10:30:15 +0000 (11:30 +0100)] 
Remove hardcoded checkpoint interval checking

Mdmon assumes that kernel marks checkpoint every 1/16 of the volume size
and that the checkpoints are equal in size. This is not true, kernel may
mark checkpoints more frequently depending on several factors, including
sync speed. This results in checkpoints reported by mdadm --examine
falling behind the one reported by kernel.

Remove hardcoded checkpoint interval checking.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoRelease mdadm-4.3 mdadm-4.3
Mariusz Tkaczyk [Thu, 15 Feb 2024 16:24:00 +0000 (17:24 +0100)] 
Release mdadm-4.3

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agomdadm: fix update=resync regression
Mariusz Tkaczyk [Fri, 9 Feb 2024 13:02:16 +0000 (14:02 +0100)] 
mdadm: fix update=resync regression

mdadm --assemble --update=resync started failing  with the error
"mdadm: --update=resync not understood for 1.x metadata".

It is a regression. Add omitted branch to fix error.

Resubmitted, original author is not responding.
https://lore.kernel.org/linux-raid/ZZqJlCToUS3Qrl4J@bianca.dpss.psy.unipd.it/

Fixes: 7e8daba8b793 ("super1: refactor the code for enum")
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agoRevert "mdadm: remove container_enough logic"
Mariusz Tkaczyk [Mon, 5 Feb 2024 14:50:29 +0000 (15:50 +0100)] 
Revert "mdadm: remove container_enough logic"

Mentioned patch changes way of IMSM member arrays assembling, they are
updated by every new drive incremental processes. Previously, member
arrays were created and filled once, by last drive incremental process.

We determined regressions with various impact. Unfortunately, initial
testing didn't show them.

Regressions are connected to drive appearance order and may not be
reproducible on every configuration, there are at least two know
issues for now:

- sysfs attributes are filled using old metadata if there is
  outdated drive and it is enumerated first.

- rebuild may be aborted and started from beginning after reboot,
  if drive under rebuild is enumerated as the last one.

This reverts commit 4dde420fc3e24077ab926f79674eaae1b71de10b. It fixes
checkpatch issues and reworks logic to remove empty "if" branch in
Incremental.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
2 months agosuper1: remove support for name= in config
Mariusz Tkaczyk [Thu, 1 Feb 2024 11:32:41 +0000 (12:32 +0100)] 
super1: remove support for name= in config

Only super1 provides "name=" to config. It is recoreded in metadata
so there is no need to duplicate same information.
UUID is our main key.

It is not used by Incremental and Assemble handles empty name well
because other supertypes don't set it in conf.

Expectation that the name in config is same as in metadata is bug prone.
Config should be the place where use can define customized settings.

Remove printing "name=" from mdadm config creation commands. Ignore
the name in config file to keep backward compatibility. Remove
description from man mdadm.conf.

Update 00conftest because "name" is no longer accepted.
As the name is ignored, error for mdadm --detail is not printed.

Reported-by: Stefan Fleischmann <sfle@kth.se>
Fixes: e2eb503bd797 ("mdadm: Follow POSIX Portable Character Set")
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 months agosuper-intel: Remove inaccessible code
Mateusz Kusiak [Thu, 18 Jan 2024 10:28:42 +0000 (11:28 +0100)] 
super-intel: Remove inaccessible code

Remove inaccessible "if" statement from imsm_set_array_state().

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 months agoReplace "none" with macro
Mateusz Kusiak [Thu, 18 Jan 2024 10:28:41 +0000 (11:28 +0100)] 
Replace "none" with macro

String "none" is used many times throughout the code.
Replace "none" strings with predefined macro.

Add str_is_none() for comparing strings with "none".
Replace str(n)cmp calls with function.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 months agoDefine sysfs max buffer size
Mateusz Kusiak [Thu, 18 Jan 2024 10:28:40 +0000 (11:28 +0100)] 
Define sysfs max buffer size

sysfs_get_str() usages have inconsistant buffer size.
This results in wild buffer declarations and redundant memory usage.

Define maximum buffer size for sysfs strings.
Replace wild sysfs string buffer sizes for globaly defined value.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 months agotests: Gate tests for linear flavor with variable LINEAR
Song Liu [Tue, 9 Jan 2024 23:07:16 +0000 (15:07 -0800)] 
tests: Gate tests for linear flavor with variable LINEAR

linear flavor is being removed in the kernel [1], so tests for the linear
flavor will fail. Add detection for linear flavor and --disable-linear
option, with the same logic as multipath.

[1] https://lore.kernel.org/linux-raid/20231214222107.2016042-1-song@kernel.org/
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
3 months agomanage: adjust checking subarray state in update_subarray
Pawel Piatkowski [Wed, 20 Dec 2023 09:32:49 +0000 (10:32 +0100)] 
manage: adjust checking subarray state in update_subarray

Only changing bitmap related consistency_policy requires
subarray to be inactive.
consistency_policy with PPL or NO_PPL value can be changed on
active subarray.
It fixes regression introduced in commit
db10eab68e652f141169 ("Fix --update-subarray on active volume")

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
4 months agoRemove all "if zeros"
Mateusz Kusiak [Mon, 18 Dec 2023 15:03:51 +0000 (16:03 +0100)] 
Remove all "if zeros"

No more random encounters of "if zeros".
Remove all "if 0" code blocks.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
5 months agoudev: Move udev_block() and udev_unblock() into udev.c
Mateusz Grzonka [Tue, 21 Nov 2023 00:58:24 +0000 (01:58 +0100)] 
udev: Move udev_block() and udev_unblock() into udev.c

Add kernel style comments and better error handling.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agoMdmonitor: Improve udev event handling
Mateusz Grzonka [Tue, 21 Nov 2023 00:58:23 +0000 (01:58 +0100)] 
Mdmonitor: Improve udev event handling

Mdmonitor is waiting for udev queue to become empty.
Even if the queue becomes empty, udev might still be processing last event.
However we want to wait and wake up mdmonitor when udev finished
processing events..

Also, the udev queue interface is considered legacy and should not be
used outside of udev.

Use udev monitor instead, and wake up mdmonitor on every event triggered
by udev for md block device.

We need to generate more change events from kernel, because they are
missing in some situations, for example, when rebuild started.
This will be addressed in a separate patch.

Move udev specific code into separate functions, and place them in udev.c file.
Also move use_udev() logic from lib.c into newly created file.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agoFix assembling RAID volume by using incremental
Pawel Piatkowski [Thu, 19 Oct 2023 14:35:25 +0000 (16:35 +0200)] 
Fix assembling RAID volume by using incremental

After change "mdadm: remove container_enough logic"
IMSM volumes are started immediately. If volume is during
reshape, then it will be blocked by block_subarray() during
first mdadm -I <devname>. Assemble_container_content() for
next disk will see the change because metadata version from
sysfs and metadata doesn't match and will execute
sysfs_set_array again. Then it fails to set same
component_size, it is prohibited by kernel.

If array is frozen then first sign from metadata version
is different ("/" vs "-"), so exclude it from comparison.
All we want is to double check that base properties are set
and we don't need to call sysfs_set_array again.

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm: remove container_enough logic
Pawel Piatkowski [Thu, 19 Oct 2023 14:35:24 +0000 (16:35 +0200)] 
mdadm: remove container_enough logic

Arrays without enough disk count will be assembled but not
started.
Now RAIDs will be assembled always (even if they are failed).
RAID devices in all states will be assembled and exposed
to mdstat.
This change affects only IMSM (for ddf it wasn't used,
container_enough was set to true always).
Removed this logic from incremental_container as well with
runstop checking because runstop condition is being verified
in assemble_container_content function.

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm/super1: Add MD_FEATURE_RAID0_LAYOUT if kernel>=5.4
Xiao Ni [Tue, 17 Oct 2023 12:35:46 +0000 (20:35 +0800)] 
mdadm/super1: Add MD_FEATURE_RAID0_LAYOUT if kernel>=5.4

After and include kernel v5.4, it adds one feature bit MD_FEATURE_RAID0_LAYOUT.
It must need to specify a layout for raid0 with more than one zone. But for
raid0 with one zone, in fact it also has a defalut layout.

Now for raid0 with one zone, *unknown* layout can be seen when running mdadm -D
command. It's the reason that mdadm doesn't set MD_FEATURE_RAID0_LAYOUT for
raid0 with one zone. Then in kernel space, super_1_validate sets mddev->layout
to -1 because of no MD_FEATURE_RAID0_LAYOUT. In fact, in raid0 io path, it
uses the default layout. Set raid0_need_layout to true if kernel_version<=v5.4.

Fixes: 329dfc28debb ('Create: add support for RAID0 layouts.')
Signed-off-by: Xiao Ni <xni@redhat.com>
Reviewed-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm/ddf: Abort when raid disk is smaller in getinfo_super_ddf
Xiao Ni [Wed, 11 Oct 2023 13:03:32 +0000 (21:03 +0800)] 
mdadm/ddf: Abort when raid disk is smaller in getinfo_super_ddf

The metadata is corrupted when the raid_disk<0. So abort directly.
This also can avoid a building error:
super-ddf.c:1988:58: error: array subscript -1 is below array bounds of â€˜struct phys_disk_entry[0]’

Suggested-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Ackedy-by: Xiao Ni <xni@redhat.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm/tests: Don't run mknod before losetup
Xiao Ni [Fri, 8 Sep 2023 08:44:35 +0000 (16:44 +0800)] 
mdadm/tests: Don't run mknod before losetup

Sometimes it can fail:
losetup: /var/tmp/mdtest0: failed to set up loop device: No such device or address
/dev/loop0 and /var/tmp/mdtest0 are already created before losetup.

Because losetup can create device node by itself. So remove mknod.

Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agoFix race of "mdadm --add" and "mdadm --incremental"
Li Xiao Keng [Thu, 7 Sep 2023 11:37:44 +0000 (19:37 +0800)] 
Fix race of "mdadm --add" and "mdadm --incremental"

There is a raid1 with sda and sdb. And we add sdc to this raid,
it may return -EBUSY.

The main process of --add:
1. dev_open(sdc) in Manage_add
2. store_super1(st, di->fd) in write_init_super1
3. fsync(fd) in store_super1
4. close(di->fd) in write_init_super1
5. ioctl(ADD_NEW_DISK)

Step 2 and 3 will add sdc to metadata of raid1. There will be
udev(change of sdc) event after step4. Then "/usr/sbin/mdadm
--incremental --export $devnode --offroot $env{DEVLINKS}"
will be run, and the sdc will be added to the raid1. Then
step 5 will return -EBUSY because it checks if device isn't
claimed in md_import_device()->lock_rdev()->blkdev_get_by_dev()
->blkdev_get().

It will be confusing for users because sdc is added first time.
The "incremental" will get map_lock before add sdc to raid1.
So we add map_lock before write_init_super in "mdadm --add"
to fix the race of "add" and "incremental".

Signed-off-by: Li Xiao Keng <lixiaokeng@huawei.com>
Signed-off-by: Guanqin Miao <miaoguanqin@huawei.com>
Reviewed-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm/tests: Fix regular expression failure
Xiao Ni [Thu, 7 Sep 2023 08:57:44 +0000 (16:57 +0800)] 
mdadm/tests: Fix regular expression failure

The test fails because of the regular expression.

Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agoIncremental: remove obsoleted calls to udisks
Coly Li [Sun, 13 Aug 2023 16:46:13 +0000 (00:46 +0800)] 
Incremental: remove obsoleted calls to udisks

Utility udisks is removed from udev upstream, calling this obsoleted
command in run_udisks() doesn't make any sense now.

This patch removes the calls chain of udisks, which includes routines
run_udisk(), force_remove(), and 2 locations where force_remove() are
called. Considering force_remove() is removed with udisks util, it is
fair to remove Manage_stop() inside force_remove() as well.

In the two modifications where calling force_remove() are removed,
the failure from Manage_subdevs() can be safely ignored, because,
1) udisks doesn't exist, no need to check the return value to umount
   the file system by udisks and remove the component disk again.
2) After the 'I' inremental remove, there is another 'r' hot remove
   following up. The first incremental remove is a best-try effort.

Therefore in this patch, where force_remove() is removed, the return
value of calling Manage_subdevs() is not checked too.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Cc: Jes Sorensen <jes@trained-monkey.org>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm: Follow POSIX Portable Character Set
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:50 +0000 (09:27 +0200)] 
mdadm: Follow POSIX Portable Character Set

When the user creates a device with a name that contains whitespace,
mdadm timeouts and throws an error. This issue is caused by udev, which
truncates /dev/md link until the first whitespace.

This patch introduces prohibition of characters other than A-Za-z0-9.-_
in the device name. Also, it prohibits using leading "-" in device name,
so name won't be confused with cli parameter.
Set of allowed characters is taken from POSIX 3.280 Portable Character
Set. Also, device name length now is limited to NAME_MAX.

In some places, there are other requirements for string length (e.g. size
up to MD_NAME_MAX for device name). This routine is made to follow POSIX
and other, more strict limitations should be checked separately.
We are aware of the risk of regression in exceptional cases (as
escape_devname function is removed) that should be fixed by updating
the array name.

The POSIX validation is added for:
- 'name' parameter in every mode.
- first devlist entry, for Build, Create, Assemble, Manage, Grow.
- config entries, both devname and "name=".

Additionally, some manual cleanups are made.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm: define ident_set_devname()
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:49 +0000 (09:27 +0200)] 
mdadm: define ident_set_devname()

Use dedicated set method for ident->devname. Now, devname validation
is done early for modes where device is created (Build, Create and
Assemble). The rules, used for devname validation are derived from
config file.

It could cause regression with execeptional cases where existing device
has name which doesn't match criteria for Manage and Grow modes. It is
low risk and those modes are not omitted from early devname validation.
Use can used main numbered devnode to avoid this problem.
Messages exposed to user are changed so it might cause a regression
in negative scenarios. Error codes are not changed.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm: refactor ident->name handling
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:48 +0000 (09:27 +0200)] 
mdadm: refactor ident->name handling

Create dedicated setter for name in mddev_ident and propagate it.
Following changes are made:
- move duplicated code from  config.c and mdadm.c into new function.
- Add error enum in mdadm.h.
- Use MD_NAME_MAX instead of hardcoded value in mddev_ident.
- Use secure functions.
- Add more detailed verification of the name.
- make error messages reusable for cmdline and config:
    - for cmdline, these are errors so use pr_err().
    - for config, these are just warnings, so use pr_info().

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agomdadm: set ident.devname if applicable
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:47 +0000 (09:27 +0200)] 
mdadm: set ident.devname if applicable

This patch tries to propagate the usage of struct mddev_ident for cmdline
where it is applicable. To avoid regression, this value is derived
from devlist->devname for applicable modes only.
As a result, the whole structure is passed to some functions. It produces
some changes for Build, Create and Assemble.
No functional changes intended.

The goal of the change is to unify devname validation which is done in
next patches.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: create 00confnames
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:46 +0000 (09:27 +0200)] 
tests: create 00confnames

The test is an attempt to document current implementation of devnode
and name handling for config entries. It is focused on incremental-
default way of array assembling on boot.
The expectations are aligned to current implementation for native
metadata because it is the most complicated scenario- both variables
can be set.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: create names_template
Mariusz Tkaczyk [Thu, 1 Jun 2023 07:27:45 +0000 (09:27 +0200)] 
tests: create names_template

Create templates directory and names_template. Move code from
00createnames. This code will be reused for 00confnames in next patch.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test for raid456 deadlock again
Yu Kuai [Mon, 29 May 2023 13:28:26 +0000 (21:28 +0800)] 
tests: add a regression test for raid456 deadlock again

This is a regression test for commit ("md/raid5: fix a deadlock in the
case that reshape is interrupted").

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test that reshape can corrupt data
Yu Kuai [Mon, 29 May 2023 13:28:25 +0000 (21:28 +0800)] 
tests: add a regression test that reshape can corrupt data

This is a regression test for commit 1544e95c6dd8 ("md: fix data
corruption for raid456 when reshape restart while grow up").

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test that raid456 can't assemble again
Yu Kuai [Mon, 29 May 2023 13:28:24 +0000 (21:28 +0800)] 
tests: add a regression test that raid456 can't assemble again

This is a regression test for commit 0aecb06e2249 ("md/raid5: don't allow
replacement while reshape is in progress").

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test that raid456 can't assemble
Yu Kuai [Mon, 29 May 2023 13:28:23 +0000 (21:28 +0800)] 
tests: add a regression test that raid456 can't assemble

If recovery is interrupted and reshape is started, then this array can't
assemble anymore. The problem is supposed to be fixed by [1].

[1] https://lore.kernel.org/linux-raid/20230529031045.1760883-1-yukuai1@huaweicloud.com/

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test for raid456 deadlock
Yu Kuai [Mon, 29 May 2023 13:28:22 +0000 (21:28 +0800)] 
tests: add a regression test for raid456 deadlock

The deadlock is described in [1], as the last patch described, it's
fixed first by [2], however this fix will be reverted and the deadlock
is supposed to be fixed by [3].

[1] https://lore.kernel.org/linux-raid/5ed54ffc-ce82-bf66-4eff-390cb23bc1ac@molgen.mpg.de/T/#t
[2] https://lore.kernel.org/linux-raid/20220621031129.24778-1-guoqing.jiang@linux.dev/
[3] https://lore.kernel.org/linux-raid/20230322064122.2384589-5-yukuai1@huaweicloud.com/

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a regression test for raid10 deadlock
Yu Kuai [Mon, 29 May 2023 13:28:21 +0000 (21:28 +0800)] 
tests: add a regression test for raid10 deadlock

The deadlock is described in [1], it's fixed first by [2], however,
it turns out this commit will trigger other problems[3], hence this
commit will be reverted and the deadlock is supposed to be fixed by [1].

[1] https://lore.kernel.org/linux-raid/20230322064122.2384589-5-yukuai1@huaweicloud.com/
[2] https://lore.kernel.org/linux-raid/20220621031129.24778-1-guoqing.jiang@linux.dev/
[3] https://lore.kernel.org/linux-raid/20230322064122.2384589-2-yukuai1@huaweicloud.com/

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: support to skip checking dmesg
Yu Kuai [Mon, 29 May 2023 13:28:20 +0000 (21:28 +0800)] 
tests: support to skip checking dmesg

Prepare to add a regression test for raid10 that require error injection
to trigger error path, and kernel will complain about io error, checking
dmesg for error log will make it impossible to pass this test.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agotests: add a new test for rdev lifetime
Yu Kuai [Mon, 29 May 2023 13:28:19 +0000 (21:28 +0800)] 
tests: add a new test for rdev lifetime

This test add and remove a underlying disk to raid concurretly, verify
that the following problem is fixed:

run mdadm test 23rdev-lifetime at Fri Apr 28 03:25:30 UTC 2023
md: could not open device unknown-block(1,0).
sysfs: cannot create duplicate filename '/devices/virtual/block/md0/md/dev-ram0'
CPU: 26 PID: 10521 Comm: test Not tainted 6.3.0-rc2-00134-g7b3a8828043c #115
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.1-2.fc37 04/014
Call Trace:
 <TASK>
 dump_stack_lvl+0xe7/0x180
 dump_stack+0x18/0x30
 sysfs_warn_dup+0xa2/0xd0
 sysfs_create_dir_ns+0x119/0x140
 kobject_add_internal+0x143/0x4d0
 kobject_add_varg+0x35/0x70
 kobject_add+0x64/0xd0
 bind_rdev_to_array+0x254/0x840 [md_mod]
 new_dev_store+0x14d/0x350 [md_mod]
 md_attr_store+0xc1/0x1a0 [md_mod]
 sysfs_kf_write+0x51/0x70
 kernfs_fop_write_iter+0x188/0x270
 vfs_write+0x27e/0x460
 ksys_write+0x85/0x180
 __x64_sys_write+0x21/0x30
 do_syscall_64+0x6c/0xe0
 entry_SYSCALL_64_after_hwframe+0x63/0xcd
RIP: 0033:0x7f26bacf5387
Code: 0d 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b7 0f 1f 00 f3 0f 1e fa 64 84
RSP: 002b:00007ffe98d79e68 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
RAX: ffffffffffffffda RBX: 0000000000000004 RCX: 00007f26bacf5387
RDX: 0000000000000004 RSI: 000055bd10282bf0 RDI: 0000000000000001
RBP: 000055bd10282bf0 R08: 000000000000000a R09: 00007f26bad8b4e0
R10: 00007f26bad8b3e0 R11: 0000000000000246 R12: 0000000000000004
R13: 00007f26badc8520 R14: 0000000000000004 R15: 00007f26badc8700
 </TASK>

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
5 months agoAssemble: fix redundant memory free
Kinga Tanska [Tue, 12 Sep 2023 02:27:01 +0000 (04:27 +0200)] 
Assemble: fix redundant memory free

Commit e9fb93af0f76 ("Fix memory leak in file Assemble")
fixes few memory leaks in Assemble, but it introduces
problem with assembling RAID volume. It was caused by
clearing metadata too fast, not only on fail in
select_devices() function.
This commit removes redundant memory free.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoAdd compiler defenses flags
Mateusz Grzonka [Mon, 17 Jul 2023 13:19:10 +0000 (15:19 +0200)] 
Add compiler defenses flags

It is essential to avoid buffer overflows and similar bugs as much as
possible.

According to Intel rules we are obligated to verify certain
compiler flags, so it will be much easier if they are added to the
Makefile.

Add gcc flags for prevention of buffer overflows, format string vulnerabilities,
stack protection to prevent stack overwrites and aslr enablement through -fPIE.
Also make the flags configurable.

The changes were verified on gcc versions 7.5, 8.3, 9.2, 10 and 12.2.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoimsm: Add reading vmd register for finding imsm capability
Mateusz Grzonka [Wed, 5 Jul 2023 14:23:17 +0000 (16:23 +0200)] 
imsm: Add reading vmd register for finding imsm capability

Currently mdadm does not find imsm capability when running inside VM.
This patch adds the possibility to read from vmd register and check for
capability, effectively allowing to use mdadm with imsm inside virtual machines.

Additionally refactor find_imsm_capability() to make assignments in new
lines.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoplatform-intel: limit guid length
Kinga Tanska [Thu, 11 May 2023 02:55:13 +0000 (04:55 +0200)] 
platform-intel: limit guid length

Moving GUID_STR_MAX to header to use it as
a length limitation for snprintf function.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoFix unsafe string functions
Kinga Tanska [Thu, 11 May 2023 02:55:12 +0000 (04:55 +0200)] 
Fix unsafe string functions

Add string length limitations where necessary to
avoid buffer overflows.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoFix memory leak in file mdadm
Guanqin Miao [Mon, 24 Apr 2023 08:06:37 +0000 (16:06 +0800)] 
Fix memory leak in file mdadm

When we test mdadm with asan, we found some memory leaks in mdadm.c
We fix these memory leaks based on code logic.

Signed-off-by: Guanqin Miao <miaoguanqin@huawei.com>
Signed-off-by: Li Xiao Keng <lixiaokeng@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoFix memory leak in file Manage
Guanqin Miao [Mon, 24 Apr 2023 08:06:36 +0000 (16:06 +0800)] 
Fix memory leak in file Manage

When we test mdadm with asan, we found some memory leaks in Manage.c
We fix these memory leaks based on code logic.

v2: Fix free() of uninitialized 'tst' in abort path.

Signed-off-by: Guanqin Miao <miaoguanqin@huawei.com>
Signed-off-by: Li Xiao Keng <lixiaokeng@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoFix memory leak in file Kill
Guanqin Miao [Mon, 24 Apr 2023 08:06:35 +0000 (16:06 +0800)] 
Fix memory leak in file Kill

When we test mdadm with asan, we found some memory leaks in Kill.c
We fix these memory leaks based on code logic.

Signed-off-by: Guanqin Miao <miaoguanqin@huawei.com>
Signed-off-by: Li Xiao Keng <lixiaokeng@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoFix memory leak in file Assemble
Guanqin Miao [Mon, 24 Apr 2023 08:06:34 +0000 (16:06 +0800)] 
Fix memory leak in file Assemble

When we test mdadm with asan, we found some memory leaks in Assemble.c
We fix these memory leaks based on code logic.

v2: Set st = NULL before jumping to loop

Signed-off-by: Guanqin Miao <miaoguanqin@huawei.com>
Signed-off-by: Li Xiao Keng <lixiaokeng@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agomdadm: Stop mdcheck_continue timer when mdcheck_start service can finish check
Xiao Ni [Fri, 25 Aug 2023 12:55:41 +0000 (20:55 +0800)] 
mdadm: Stop mdcheck_continue timer when mdcheck_start service can finish check

mdcheck_continue is triggered by mdcheck_start timer. It's used to
continue check action if the raid is too big and mdcheck_start
service can't finish check action. If mdcheck start can finish check
action, it doesn't need to mdcheck continue service anymore. So stop
it when mdcheck start service can finish check action.

Signed-off-by: Xiao Ni <xni@redhat.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoAdd secure gethostname() wrapper
Blazej Kucman [Fri, 16 Jun 2023 19:45:55 +0000 (21:45 +0200)] 
Add secure gethostname() wrapper

gethostname() func does not ensure null-terminated string
if hostname is longer than buffer length.
For security, a function s_gethostname() has been added
to ensure that "\0" is added to the end of the buffer.
Previously this had to be handled in each place
of the gethostname() call.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoimsm: fix free space calculations
Mariusz Tkaczyk [Mon, 29 May 2023 13:52:38 +0000 (15:52 +0200)] 
imsm: fix free space calculations

Between two volumes or between last volume and metadata at least
IMSM_RESERVED_SECTORS gap must exist. Currently the gap can be doubled
because metadata reservation contains IMSM_RESERVED_SECTORS too.

Divide reserve variable into pre_reservation and post_reservation to be
more flexible and decide separately if each reservation is needed.

Pre_reservation is needed only when a volume is created and it is not a
real first volume in a container (we can check that by extent_idx).
This type of reservation is not needed for expand.

Post_reservation is not needed only if real last volume is created or
expanded because reservation is done with the metadata.

The volume index in metadata cannot be trusted, because the real volume
order can be reversed. It is safer to use extent table, it is sorted by
start position.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoimsm: return free space after volume for expand
Mariusz Tkaczyk [Mon, 29 May 2023 13:52:37 +0000 (15:52 +0200)] 
imsm: return free space after volume for expand

merge_extends() routine searches for the biggest free space. For expand,
it works only in standard cases where the last volume is expanded and
the free space is determined after the last volume.
Add volume index to extent struct and use that do determine size after
super->current_vol during expand.

Limitation to last volume is no longer needed. It unblocks scenarios
where kill-subarray is used to remove first volume and later it is
recreated (now it is the second volume, even if it is placed before
existing one).

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoimsm: move expand verification code into new function
Mariusz Tkaczyk [Mon, 29 May 2023 13:52:36 +0000 (15:52 +0200)] 
imsm: move expand verification code into new function

The code here is too complex. Move it to separate function and
simplify it. Add more error messages.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
7 months agoimsm: introduce round_member_size_to_mb()
Mariusz Tkaczyk [Mon, 29 May 2023 13:52:35 +0000 (15:52 +0200)] 
imsm: introduce round_member_size_to_mb()

Extract rounding logic to separate function.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>