]> git.ipfire.org Git - thirdparty/mdadm.git/log
thirdparty/mdadm.git
16 months agoUpdate mdadm Monitor manual.
Blazej Kucman [Mon, 19 Dec 2022 10:21:58 +0000 (11:21 +0100)] 
Update mdadm Monitor manual.

- describe monitor work modes,
- clarify the turning off condition,
- describe the mdmonitor.service as a prefered management way.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
16 months agoMonitor: block if monitor modes are combined.
Blazej Kucman [Mon, 19 Dec 2022 10:21:57 +0000 (11:21 +0100)] 
Monitor: block if monitor modes are combined.

Block monitoring start if --scan mode and MD devices list are combined.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
16 months agoMdmonitor: Split alert() into separate functions
Mateusz Grzonka [Wed, 7 Sep 2022 12:56:49 +0000 (14:56 +0200)] 
Mdmonitor: Split alert() into separate functions

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
19 months agoMdmonitor: Omit non-md devices
Lukasz Florczak [Thu, 22 Sep 2022 06:29:50 +0000 (08:29 +0200)] 
Mdmonitor: Omit non-md devices

Fix segfault commit [1] introduced check whether given device is
mddevice, but it happend to terminate Mdmonitor if at least one of given
devices didn't fulfill that condition. In result Mdmonitor service was
no longer started on boot (with --scan option) when config contained some
non-existent array entry.

This commit introduces ommiting non-md devices so scan option can still
be used when config is wrong and allow Mdmonitor service to run on boot.

Giving a list of devices to monitor containing non-existing or
non-md devices will result in monitoring only confirmed mddevices.

[1] https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id=e702f392959d1c2ad2089e595b52235ed97b4e18

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
19 months agomdadm: replace container level checking with inline
Kinga Tanska [Fri, 2 Sep 2022 06:49:23 +0000 (08:49 +0200)] 
mdadm: replace container level checking with inline

To unify all containers checks in code, is_container() function is
added and propagated.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
19 months agoReadMe: fix command-line help
Mariusz Tkaczyk [Fri, 9 Sep 2022 13:50:34 +0000 (15:50 +0200)] 
ReadMe: fix command-line help

Make command-line help consistent with manual page.
Copied from Debian.

Cc: Felix Lechner <felix.lechner@lease-up.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
19 months agomdadm: Add Documentation entries to systemd services
Mariusz Tkaczyk [Fri, 9 Sep 2022 13:50:33 +0000 (15:50 +0200)] 
mdadm: Add Documentation entries to systemd services

Add documentation section.
Copied from Debian.

Cc: Felix Lechner <felix.lechner@lease-up.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
19 months agomdadm: added support for Intel Alderlake RST on VMD platform
Oldřich Jedlička [Wed, 31 Aug 2022 17:57:29 +0000 (19:57 +0200)] 
mdadm: added support for Intel Alderlake RST on VMD platform

Alderlake RST on VMD uses RstVmdV UEFI variable name, so detect it.

Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
Reviewed-by: Kinga Tanska <kinga.tanska@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agoMonitor: Fix statelist memory leaks
Pawel Baldysiak [Thu, 1 Sep 2022 09:20:31 +0000 (11:20 +0200)] 
Monitor: Fix statelist memory leaks

Free statelist in error path in Monitor initialization.

Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agoManage: Block unsafe member failing
Mateusz Kusiak [Thu, 18 Aug 2022 09:47:21 +0000 (11:47 +0200)] 
Manage: Block unsafe member failing

Kernel may or may not block mdadm from removing member device if it
will cause arrays failed state. It depends on raid personality
implementation in kernel.
Add verification on requested removal path (#mdadm --set-faulty
command).

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agomdadm: Correct typos, punctuation and grammar in man
Mateusz Grzonka [Fri, 12 Aug 2022 14:52:12 +0000 (16:52 +0200)] 
mdadm: Correct typos, punctuation and grammar in man

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Reviewed-by: Wol <anthony@youngman.org.uk>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agosuper1: report truncated device
NeilBrown [Thu, 25 Aug 2022 22:55:56 +0000 (08:55 +1000)] 
super1: report truncated device

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
....

Also report in --assemble so that the failure which the kernel will
report will be explained.

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>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agoAssemble: check if device is container before scheduling force-clean update
Kinga Tanska [Fri, 19 Aug 2022 00:55:46 +0000 (02:55 +0200)] 
Assemble: check if device is container before scheduling force-clean update

Up to now using assemble with force flag making each array as clean.
Force-clean should not be done for the container. This commit add
check if device is different than container before cleaning.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agoGrow: Split Grow_reshape into helper function
Mateusz Kusiak [Thu, 28 Jul 2022 12:20:53 +0000 (20:20 +0800)] 
Grow: Split Grow_reshape into helper function

Grow_reshape should be split into helper functions given its size.
- Add helper function for preparing reshape on external metadata.
- Close cfd file descriptor.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agomdadm: Don't open md device for CREATE and ASSEMBLE
Logan Gunthorpe [Wed, 27 Jul 2022 21:52:46 +0000 (15:52 -0600)] 
mdadm: Don't open md device for CREATE and ASSEMBLE

The mdadm command tries to open the md device for most modes, first
thing, no matter what. When running to create or assemble an array,
in most cases, the md device will not exist, the open call will fail
and everything will proceed correctly.

However, when running tests, a create or assembly command may be run
shortly after stopping an array and the old md device file may still
be around. Then, if create_on_open is set in the kernel, a new md
device will be created when mdadm does its initial open.

When mdadm gets around to creating the new device with the new_array
parameter it issues this error:

   mdadm: Fail to create md0 when using
   /sys/module/md_mod/parameters/new_array, fallback to creation via node

This is because an mddev was already created by the kernel with the
earlier open() call and thus the new one being created will fail with
EEXIST. The mdadm command will still successfully be created due to
falling back to the node creation method. However, the error message
itself will fail any test that's running it.

This issue is a race condition that is very rare, but a recent change
in the kernel caused this to happen more frequently: about 1 in 50
times.

To fix this, don't bother trying to open the md device for CREATE,
ASSEMBLE and BUILD commands, as the file descriptor will never be used
anyway even if it is successfully openned. The mdfd has not been used
for these commands since:

   7f91af49ad09 ("Delay creation of array devices for assemble/build/create")

The checks that were done on the open device can be changed to being
done with stat.

Side note: it would be nice to disable create_on_open as well to help
solve this, but it seems the work for this was never finished. By default,
mdadm will create using the old node interface when a name is specified
unless the user specifically puts names=yes in a config file, which
doesn't seem to be common or desirable to require this..

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agomdadm: move data_offset to struct shape
Mariusz Tkaczyk [Tue, 19 Jul 2022 12:48:23 +0000 (14:48 +0200)] 
mdadm: move data_offset to struct shape

Data offset is a shape property so move it there to remove additional
parameter from some functions.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agomdadm: remove symlink option
Mariusz Tkaczyk [Tue, 19 Jul 2022 12:48:22 +0000 (14:48 +0200)] 
mdadm: remove symlink option

The option is not used. Remove it from code.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agotests: add test for names
Mariusz Tkaczyk [Tue, 19 Jul 2022 12:48:21 +0000 (14:48 +0200)] 
tests: add test for names

Current behavior is not documented and tested. This test is a base for
future improvements. It is enough to test it only with native metadata,
because it is generic code. Generated properties are passed to metadata
handler.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agotests/00readonly: Run udevadm settle before setting ro
Logan Gunthorpe [Wed, 27 Jul 2022 21:52:45 +0000 (15:52 -0600)] 
tests/00readonly: Run udevadm settle before setting ro

In some recent kernel versions, 00readonly fails with:

  mdadm: failed to set readonly for /dev/md0: Device or resource busy
  ERROR: array is not read-only!

This was traced down to a race condition with udev holding a reference
to the block device at the same time as trying to set it read only.

To fix this, call udevadm settle before setting the array read only.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
20 months agomdadm: Replace obsolete usleep with nanosleep
Mateusz Grzonka [Fri, 12 Aug 2022 14:36:02 +0000 (16:36 +0200)] 
mdadm: Replace obsolete usleep with nanosleep

According to POSIX.1-2001, usleep is considered obsolete.
Replace it with a wrapper that uses nanosleep, as recommended in man.
Add handy macros for conversions between msec, usec and nsec.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
21 months agotests: Add broken files for all broken tests
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:19 +0000 (14:25 -0600)] 
tests: Add broken files for all broken tests

Each broken file contains the rough frequency of brokeness as well
as a brief explanation of what happens when it breaks. Estimates
of failure rates are not statistically significant and can vary
run to run.

This is really just a view from my window. Tests were done on a
small VM with the default loop devices, not real hardware. We've
seen different kernel configurations can cause bugs to appear as well
(ie. different block schedulers). It may also be that different race
conditions will be seen on machines with different performance
characteristics.

These annotations were done with the kernel currently in md/md-next:

 facef3b96c5b ("md: Notify sysfs sync_completed in md_reap_sync_thread()")

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomdadm/test: Mark and ignore broken test failures
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:18 +0000 (14:25 -0600)] 
mdadm/test: Mark and ignore broken test failures

Add functionality to continue if a test marked as broken fails.

To mark a test as broken, a file with the same name but with the suffix
'.broken' should exist. The first line in the file will be printed with
a KNOWN BROKEN message; the rest of the file can describe the how the
test is broken.

Also adds --skip-broken and --skip-always-broken to skip all the tests
that have a .broken file or to skip all tests whose .broken file's first
line contains the keyword always.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomdadm/test: Add a mode to repeat specified tests
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:17 +0000 (14:25 -0600)] 
mdadm/test: Add a mode to repeat specified tests

Many tests fail infrequently or rarely. To help find these, add
an option to run the tests multiple times by specifying --loop=N.

If --loop=0 is specified, the test will be looped forever.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agotests/02lineargrow: clear the superblock at every iteration
Sudhakar Panneerselvam [Wed, 22 Jun 2022 20:25:16 +0000 (14:25 -0600)] 
tests/02lineargrow: clear the superblock at every iteration

This fixes 02lineargrow test as prior metadata causes --add operation
to misbehave.

Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agotests/04update-metadata: avoid passing chunk size to raid1
Sudhakar Panneerselvam [Wed, 22 Jun 2022 20:25:15 +0000 (14:25 -0600)] 
tests/04update-metadata: avoid passing chunk size to raid1

'04update-metadata' test fails with error, "specifying chunk size is
forbidden for this level" added by commit, 5b30a34aa4b5e. Hence,
correcting the test to ignore passing chunk size to raid1.

Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@oracle.com>
[logang@deltatee.com: fix if/then style and dropped unrelated hunk]
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agotests: fix raid0 tests for 0.90 metadata
Sudhakar Panneerselvam [Wed, 22 Jun 2022 20:25:14 +0000 (14:25 -0600)] 
tests: fix raid0 tests for 0.90 metadata

Some of the test cases fail because raid0 creation fails with the error,
"0.90 metadata does not support layouts for RAID0" added by commit,
329dfc28debb. Fix some of the test cases by switching from raid0 to
linear level for 0.9 metadata where possible.

Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agotests/00raid0: add a test that validates raid0 with layout fails for 0.9
Sudhakar Panneerselvam [Wed, 22 Jun 2022 20:25:13 +0000 (14:25 -0600)] 
tests/00raid0: add a test that validates raid0 with layout fails for 0.9

329dfc28debb disallows the creation of raid0 with layouts for 0.9
metadata. This test confirms the new behavior.

Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomdadm: Fix optional --write-behind parameter
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:12 +0000 (14:25 -0600)] 
mdadm: Fix optional --write-behind parameter

The commit noted below changed the behaviour of --write-behind to
require an argument. This broke the 06wrmostly test with the error:

  mdadm: Invalid value for maximum outstanding write-behind writes: (null).
         Must be between 0 and 16383.

To fix this, check if optarg is NULL before parising it, as the origial
code did.

Fixes: 60815698c0ac ("Refactor parse_num and use it to parse optarg.")
Cc: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomdadm: Fix mdadm -r remove option regression
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:11 +0000 (14:25 -0600)] 
mdadm: Fix mdadm -r remove option regression

The commit noted below globally adds a parameter to the -r option but missed
the fact that -r is used for another purpose: --remove.

After that commit, a command such as:

  mdadm /dev/md0 -r /dev/loop0

will do nothing seeing the device parameter will be consumed as a
argument to the -r option; thus, there will only be one device
seen one the command line, devs_found will only be 1 and nothing will
happen.

This caused the 01r5integ and 01raid6integ tests to hang indefinitely
as mdadm did not remove the failed device. With the device not removed,
it would not be readded. Then the loop waiting for the array status to
change would loop forever.

This commit was recently reverted, but the legitimate fix for the
monitor operations was still not fixed. So add specific monitor
short ops to re-fix the --monitor -r option.

Fixes: 546047688e1c ("mdadm: fix coredump of mdadm --monitor -r")
Fixes: 190dc029b141 ("Revert "mdadm: fix coredump of mdadm --monitor -r"")
Cc: Wu Guanghao <wuguanghao3@huawei.com>
Cc: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomonitor: Avoid segfault when calling NULL get_bad_blocks
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:10 +0000 (14:25 -0600)] 
monitor: Avoid segfault when calling NULL get_bad_blocks

Not all struct superswitch implement a get_bad_blocks() function,
yet mdmon seems to call it without checking for NULL and thus
occasionally segfaults in the test 10ddf-geometry.

Fix this by checking for NULL before calling it.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agomdadm/Grow: Fix use after close bug by closing after fork
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:09 +0000 (14:25 -0600)] 
mdadm/Grow: Fix use after close bug by closing after fork

The test 07reshape-grow fails most of the time. But it succeeds around
1 in 5 times. When it does succeed, it causes the tests to die because
mdadm has segfaulted.

The segfault was caused by mdadm attempting to repoen a file
descriptor that was already closed. The backtrace of the segfault
was:

  #0  __strncmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:101
  #1  0x000056146e31d44b in devnm2devid (devnm=0x0) at util.c:956
  #2  0x000056146e31dab4 in open_dev_flags (devnm=0x0, flags=0)
                         at util.c:1072
  #3  0x000056146e31db22 in open_dev (devnm=0x0) at util.c:1079
  #4  0x000056146e3202e8 in reopen_mddev (mdfd=4) at util.c:2244
  #5  0x000056146e329f36 in start_array (mdfd=4,
              mddev=0x7ffc55342450 "/dev/md0", content=0x7ffc55342860,
              st=0x56146fc78660, ident=0x7ffc55342f70, best=0x56146fc6f5d0,
              bestcnt=10, chosen_drive=0, devices=0x56146fc706b0, okcnt=5,
      sparecnt=0,  rebuilding_cnt=0, journalcnt=0, c=0x7ffc55342e90,
      clean=1,  avail=0x56146fc78720 "\001\001\001\001\001",
      start_partial_ok=0, err_ok=0, was_forced=0)
                  at Assemble.c:1206
  #6  0x000056146e32c36e in Assemble (st=0x56146fc78660,
               mddev=0x7ffc55342450 "/dev/md0", ident=0x7ffc55342f70,
       devlist=0x56146fc6e2d0, c=0x7ffc55342e90)
                 at Assemble.c:1914
  #7  0x000056146e312ac9 in main (argc=11, argv=0x7ffc55343238)
                         at mdadm.c:1510

The file descriptor was closed early in Grow_continue(). The noted commit
moved the close() call to close the fd above the fork which caused the
parent process to return with a closed fd.

This meant reshape_array() and Grow_continue() would return in the parent
with the fd forked. The fd would eventually be passed to reopen_mddev()
which returned an unhandled NULL from fd2devnm() which would then be
dereferenced in devnm2devid.

Fix this by moving the close() call below the fork. This appears to
fix the 07revert-grow test. While we're at it, switch to using
close_fd() to invalidate the file descriptor.

Fixes: 77b72fa82813 ("mdadm/Grow: prevent md's fd from being occupied during delayed time")
Cc: Alex Wu <alexwu@synology.com>
Cc: BingJing Chang <bingjingc@synology.com>
Cc: Danny Shih <dannyshih@synology.com>
Cc: ChangSyun Peng <allenpeng@synology.com>
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agoDDF: Fix NULL pointer dereference in validate_geometry_ddf()
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:08 +0000 (14:25 -0600)] 
DDF: Fix NULL pointer dereference in validate_geometry_ddf()

A relatively recent patch added a call to validate_geometry() in
Manage_add() that has level=LEVEL_CONTAINER and chunk=NULL.

This causes some ddf tests to segfault which aborts the test suite.

To fix this, avoid dereferencing chunk when the level is
LEVEL_CONTAINER or LEVEL_NONE.

Fixes: 1f5d54a06df0 ("Manage: Call validate_geometry when adding drive to external container")
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agoDDF: Cleanup validate_geometry_ddf_container()
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:07 +0000 (14:25 -0600)] 
DDF: Cleanup validate_geometry_ddf_container()

Move the function up so that the function declaration is not necessary
and remove the unused arguments to the function.

No functional changes are intended but will help with a bug fix in the
next patch.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agoMakefile: Don't build static build with everything and everything-test
Logan Gunthorpe [Wed, 22 Jun 2022 20:25:06 +0000 (14:25 -0600)] 
Makefile: Don't build static build with everything and everything-test

Running the test suite requires building everything, but it seems to be
difficult to build the static version of mdadm now seeing there
is no readily available static udev library.

The test suite doesn't need the static binary so just don't build it
with the everything or everything-test targets.

Leave the mdadm.static and install-static targets in place in case
someone still has a use case for the static binary.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
21 months agoMonitor: use snprintf to fill device name
Kinga Tanska [Thu, 14 Jul 2022 07:02:11 +0000 (09:02 +0200)] 
Monitor: use snprintf to fill device name

Safe string functions are propagated in Monitor.c.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
21 months agoMonitor: use devname as char array instead of pointer
Kinga Tanska [Thu, 14 Jul 2022 07:02:10 +0000 (09:02 +0200)] 
Monitor: use devname as char array instead of pointer

Device name wasn't filled properly due to incorrect use of strcpy.
Strcpy was used twice. Firstly to fill devname with "/dev/md/"
and then to add chosen name. First strcpy result was overwritten by
second one (as a result <device_name> instead of "/dev/md/<device_name>"
was assigned). This commit changes this implementation to use snprintf
and devname with fixed size.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
21 months agomdadm: Remove dead code in imsm_fix_size_mismatch
Lukasz Florczak [Fri, 22 Jul 2022 06:43:48 +0000 (08:43 +0200)] 
mdadm: Remove dead code in imsm_fix_size_mismatch

imsm_create_metadata_update_for_size_change() that returns u_size value
could return 0 in the past. As its behavior changed, and returned value
is always the size of imsm_update_size_change structure, check for
u_size is no longer needed.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
21 months agomdadm: Fix array size mismatch after grow
Lukasz Florczak [Fri, 22 Jul 2022 06:43:47 +0000 (08:43 +0200)] 
mdadm: Fix array size mismatch after grow

imsm_fix_size_mismatch() is invoked to fix the problem, but it couldn't
proceed due to migration check. This patch allows for intended behavior.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agomdadm: block update=ppl for non raid456 levels
Lukasz Florczak [Wed, 15 Jun 2022 12:28:39 +0000 (14:28 +0200)] 
mdadm: block update=ppl for non raid456 levels

Option ppl should be used only for raid levels 4, 5 and 6. Cancel update
for other levels.

Applied globally for imsm and ddf format.

Additionally introduce is_level456() helper function.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoimsm: block changing slots during creation
Mariusz Tkaczyk [Mon, 20 Jun 2022 16:10:43 +0000 (00:10 +0800)] 
imsm: block changing slots during creation

If user specifies drives for array creation, then slot order across
volumes is not preserved.
Ideally, it should be checked in validate_geometry() but it is not
possible in current implementation (order is determined later).
Add verification in add_to_super_imsm_volume() and throw error if
mismatch is detected.
IMSM allows to use only same members within container.
This is not hardware dependency but metadata limitation.
Therefore, 09-imsm-overlap test is removed. Testing it is pointless.
After this patch, creation in this scenario is blocked. Offset
verification is covered in other tests.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoimsm: use same slot across container
Mariusz Tkaczyk [Mon, 20 Jun 2022 16:10:42 +0000 (00:10 +0800)] 
imsm: use same slot across container

Autolayout relies on drives order on super->disks list, but
it is not quaranted by readdir() in sysfs_read(). As a result
drive could be put in different slot in second volume.

Make it consistent by reffering to first volume, if exists.

Use enum imsm_status to unify error handling.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoimsm: introduce get_disk_slot_in_dev()
Mariusz Tkaczyk [Mon, 20 Jun 2022 16:10:41 +0000 (00:10 +0800)] 
imsm: introduce get_disk_slot_in_dev()

The routine was added to remove unnecessary get_imsm_dev() and
get_imsm_map() calls, used only to determine disk slot.

Additionally, enum for IMSM return statues was added for further usage.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agomdadm/super1: restore commit 45a87c2f31335 to fix clustered slot issue
Heming Zhao [Mon, 20 Jun 2022 16:10:40 +0000 (00:10 +0800)] 
mdadm/super1: restore commit 45a87c2f31335 to fix clustered slot issue

Commit 9d67f6496c71 ("mdadm:check the nodes when operate clustered
array") modified assignment logic for st->nodes in write_bitmap1(),
which introduced bitmap slot issue:

load_super1 didn't set up supertype.nodes, which made spare disk only
have one slot info. Then it triggered kernel md_bitmap_load_sb to get
wrong bitmap slot data.

For fixing this issue, there are two methods:

1> revert the related code of commit 9d67f6496c71. and restore the code
   from former commit 45a87c2f31335 ("super1: add more checks for
   NodeNumUpdate option").
   st->nodes value would be 0 & 1 under current code logic. i.e.
   When adding a spare disk, there is no place to init st->nodes, and
   the value is ZERO.

2> keep 9d67f6496c71, add additional ->nodes handling in load_super1(),
   let load_super1 to set st->nodes when bitmap is BITMAP_MAJOR_CLUSTERED.
   Under current mdadm code logic, load_super1 will be called many
   times, any new code in load_super1 will cost mdadm running more time.
   And more reason is I prefer as much as possible to limit clustered
   code spreading in every corner.

So I used method <1> to fix this issue.

How to trigger:

dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sda
dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sdb
dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sdc
mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda /dev/sdb
mdadm -a /dev/md0 /dev/sdc
mdadm /dev/md0 --fail /dev/sda
mdadm /dev/md0 --remove /dev/sda
mdadm -Ss
mdadm -A /dev/md0 /dev/sdb /dev/sdc

the output of current "mdadm -X /dev/sdc":
(there should be (by default) 4 slot info for correct output)
```
        Filename : /dev/sdc
           Magic : 6d746962
         Version : 5
            UUID : a74642f8:a6b1fba8:58e1f8db:cfe7b082
          Events : 29
  Events Cleared : 0
           State : OK
       Chunksize : 64 MB
          Daemon : 5s flush period
      Write Mode : Normal
       Sync Size : 306176 (299.00 MiB 313.52 MB)
          Bitmap : 5 bits (chunks), 5 dirty (100.0%)
```

And mdadm later operations will trigger kernel output error message:
(triggered by "mdadm -A /dev/md0 /dev/sdb /dev/sdc")
```
kernel: md0: invalid bitmap file superblock: bad magic
kernel: md_bitmap_copy_from_slot can't get bitmap from slot 1
kernel: md-cluster: Could not gather bitmaps from slot 1
kernel: md0: invalid bitmap file superblock: bad magic
kernel: md_bitmap_copy_from_slot can't get bitmap from slot 2
kernel: md-cluster: Could not gather bitmaps from slot 2
kernel: md0: invalid bitmap file superblock: bad magic
kernel: md_bitmap_copy_from_slot can't get bitmap from slot 3
kernel: md-cluster: Could not gather bitmaps from slot 3
kernel: md-cluster: failed to gather all resyn infos
kernel: md0: detected capacity change from 0 to 612352
```

Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoutil: replace ioctl use with function
Kinga Tanska [Mon, 20 Jun 2022 16:10:39 +0000 (00:10 +0800)] 
util: replace ioctl use with function

Replace using of ioctl calling to get md array info with
special function prepared to it.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoRevert "mdadm: fix coredump of mdadm --monitor -r"
Nigel Croxon [Mon, 18 Apr 2022 17:44:23 +0000 (13:44 -0400)] 
Revert "mdadm: fix coredump of mdadm --monitor -r"

This reverts commit 546047688e1c64638f462147c755b58119cabdc8.

The change from commit mdadm: fix coredump of mdadm
--monitor -r broke the printing of the return message when
passing -r to mdadm --manage, the removal of a device from
an array.

If the current code reverts this commit, both issues are
still fixed.

The original problem reported that the fix tried to address
was:  The --monitor -r option requires a parameter,
otherwise a null pointer will be manipulated when
converting to integer data, and a core dump will appear.

The original problem was really fixed with:
60815698c0a Refactor parse_num and use it to parse optarg.
Which added a check for NULL in 'optarg' before moving it
to the 'increments' variable.

New issue: When trying to remove a device using the short
argument -r, instead of the long argument --remove, the
output is empty. The problem started when commit
546047688e1c was added.

Steps to Reproduce:
1. create/assemble /dev/md0 device
2. mdadm --manage /dev/md0 -r /dev/vdxx

Actual results:
Nothing, empty output, nothing happens, the device is still
connected to the array.

The output should have stated "mdadm: hot remove failed
for /dev/vdxx: Device or resource busy", if the device was
still active. Or it should remove the device and print
a message:

mdadm: set /dev/vdd faulty in /dev/md0
mdadm: hot removed /dev/vdd from /dev/md0

The following commit should be reverted as it breaks
mdadm --manage -r.

commit 546047688e1c64638f462147c755b58119cabdc8
Author: Wu Guanghao <wuguanghao3@huawei.com>
Date:   Mon Aug 16 15:24:51 2021 +0800
mdadm: fix coredump of mdadm --monitor -r

-Nigel

Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoimsm: Remove possibility for get_imsm_dev to return NULL
Mateusz Grzonka [Mon, 13 Jun 2022 10:00:09 +0000 (12:00 +0200)] 
imsm: Remove possibility for get_imsm_dev to return NULL

Returning NULL from get_imsm_dev or __get_imsm_dev will cause segfault.
Guarantee that it never happens.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoFix possible NULL ptr dereferences and memory leaks
Mateusz Grzonka [Mon, 13 Jun 2022 09:59:34 +0000 (11:59 +0200)] 
Fix possible NULL ptr dereferences and memory leaks

In Assemble there was a NULL check for sra variable,
which effectively didn't stop the execution in every case.
That might have resulted in a NULL pointer dereference.

Also in super-ddf, mu variable was set to NULL for some condition,
and then immidiately dereferenced.
Additionally some memory wasn't freed as well.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoMdmonitor: Improve logging method
Kinga Tanska [Mon, 6 Jun 2022 10:32:13 +0000 (12:32 +0200)] 
Mdmonitor: Improve logging method

Change logging, and as a result, mdmonitor in verbose
mode will report its configuration.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Oleksandr Shchirskyi <oleksandr.shchirskyi@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoMdmonitor: Fix segfault
Kinga Tanska [Mon, 6 Jun 2022 10:32:12 +0000 (12:32 +0200)] 
Mdmonitor: Fix segfault

Mdadm with "--monitor" parameter requires md device
as an argument to be monitored. If given argument is
not a md device, error shall be returned. Previously
it was not checked and invalid argument caused
segmentation fault. This commit adds checking
that devices passed to mdmonitor are md devices.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
22 months agoIncremental: Fix possible memory and resource leaks
Mateusz Grzonka [Mon, 13 Jun 2022 10:11:25 +0000 (12:11 +0200)] 
Incremental: Fix possible memory and resource leaks

map allocated through map_by_uuid() is not freed if mdfd is invalid.
In addition mdfd is not closed, and mdinfo list is not freed too.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Change-Id: I25e726f0e2502cf7e8ce80c2bd7944b3b1e2b9dc
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
23 months agoGrow: block -n on external volumes.
Mateusz Kusiak [Thu, 19 May 2022 07:16:08 +0000 (09:16 +0200)] 
Grow: block -n on external volumes.

Performing --raid-devices on external metadata volume should be blocked
as it causes unwanted behaviour.

Eg. Performing
mdadm -G /dev/md/volume -l10 -n4
on r0_d2 inside 4 disk container, returns
mdadm: Need 2 spares to avoid degraded array, only have 0.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
23 months agomdmon: Stop parsing duplicate options
Lukasz Florczak [Fri, 13 May 2022 07:19:42 +0000 (09:19 +0200)] 
mdmon: Stop parsing duplicate options

Introduce new function is_duplicate_opt() to check if given option
was already used and prevent setting it again along with an error
message.

Move parsing above in_initrd() check to be able to detect --offroot
option duplicates.

Now help option is executed after parsing to prevent executing commands
like: 'mdmon --help --ndlksnlksajndfjksndafasj'.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm/systemd: remove KillMode=none from service file
Coly Li [Tue, 15 Feb 2022 13:34:15 +0000 (21:34 +0800)] 
mdadm/systemd: remove KillMode=none from service file

For mdadm's systemd configuration, current systemd KillMode is "none" in
following service files,
- mdadm-grow-continue@.service
- mdmon@.service

This "none" mode is strongly againsted by systemd developers (see man 5
systemd.kill for "KillMode=" section), and is considering to remove in
future systemd version.

As systemd developer explained in disuccsion, the systemd kill process
is,
1. send the signal specified by KillSignal= to the list of processes (if
   any), TERM is the default
2. wait until either the target of process(es) exit or a timeout expires
3. if the timeout expires send the signal specified by FinalKillSignal=,
   KILL is the default

For "control-group", all remaining processes will receive the SIGTERM
signal (by default) and if there are still processes after a period f
time, they will get the SIGKILL signal.

For "mixed", only the main process will receive the SIGTERM signal, and
if there are still processes after a period of time, all remaining
processes (including the main one) will receive the SIGKILL signal.

From the above comment, currently KillMode=control-group is a proper
kill mode. Since control-gropu is the default kill mode, the fix can be
simply removing KillMode=none line from the service file, then the
default mode will take effect.

Signed-off-by: Coly Li <colyli@suse.de>
Cc: Benjamin Brunner <bbrunner@suse.com>
Cc: Franck Bui <fbui@suse.de>
Cc: Jes Sorensen <jes@trained-monkey.org>
Cc: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Cc: Neil Brown <neilb@suse.de>
Cc: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: add map_num_s()
Mariusz Tkaczyk [Thu, 20 Jan 2022 12:18:33 +0000 (13:18 +0100)] 
mdadm: add map_num_s()

map_num() returns NULL if key is not defined. This patch adds
alternative, non NULL version for cases where NULL is not expected.

There are many printf() calls where map_num() is called on variable
without NULL verification. It works, even if NULL is passed because
gcc is able to ignore NULL argument quietly but the behavior is
undefined. For safety reasons such usages will use map_num_s() now.
It is a potential point of regression.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoCreate, Build: use default_layout()
Mariusz Tkaczyk [Thu, 20 Jan 2022 12:18:32 +0000 (13:18 +0100)] 
Create, Build: use default_layout()

This code is duplicated for Build mode so make default_layout() extern
and use it. Simplify the function structure.

It introduced change for Build mode, now for raid0 RAID0_ORIG_LAYOUT
will be returned same as for Create.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Update config manual
Lukasz Florczak [Fri, 18 Mar 2022 08:26:07 +0000 (09:26 +0100)] 
mdadm: Update config manual

Add missing HOMECLUSTER keyword description.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Update config man regarding default files and multi-keyword behavior
Lukasz Florczak [Fri, 18 Mar 2022 08:26:06 +0000 (09:26 +0100)] 
mdadm: Update config man regarding default files and multi-keyword behavior

Simplify default and alternative config file and directory location references
from mdadm(8) as references to mdadm.conf(5). Add FILE section in config man
and explain order and conditions in which default and alternative config files
and directories are used.

Update config man behavior regarding parsing order when multiple keywords/config
files are involved.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Update ReadMe
Lukasz Florczak [Fri, 18 Mar 2022 08:26:05 +0000 (09:26 +0100)] 
mdadm: Update ReadMe

Instead of hardcoded config file path give reference to config manual.

Add missing monitordelay and homecluster parameters.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Respect config file location in man
Lukasz Florczak [Fri, 18 Mar 2022 08:26:04 +0000 (09:26 +0100)] 
mdadm: Respect config file location in man

Default config file location could differ depending on OS (e.g. Debian family).
This patch takes default config file into consideration when creating mdadm.man
file as well as mdadm.conf.man.

Rename mdadm.conf.5 to mdadm.conf.5.in. Now mdadm.conf.5 is generated automatically.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoReplace error prone signal() with sigaction()
Lukasz Florczak [Mon, 21 Feb 2022 12:05:20 +0000 (13:05 +0100)] 
Replace error prone signal() with sigaction()

Up to this date signal() was used which implementation could vary [1].
Sigaction() call is preferred. This commit introduces replacement
from signal() to sigaction() by the use of signal_s() wrapper.
Also remove redundant signal.h header includes.

[1] https://man7.org/linux/man-pages/man2/signal.2.html

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoudev: adapt rules to systemd v247
Mariusz Tkaczyk [Fri, 14 Jan 2022 15:44:33 +0000 (16:44 +0100)] 
udev: adapt rules to systemd v247

New events have been added in kernel 4.14 ("bind" and "unbind").
Systemd maintainer suggests to modify "add|change" branches.
This patches implements their suggestions. There is no issue yet because
new event types are not used in md.

Please see systemd announcement for details[1].

[1] https://lists.freedesktop.org/archives/systemd-devel/2020-November/045646.html

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoGrow_reshape: Add r0 grow size error message and update man
Mateusz Kusiak [Wed, 23 Mar 2022 14:05:19 +0000 (15:05 +0100)] 
Grow_reshape: Add r0 grow size error message and update man

Grow size on r0 is not supported for imsm and native metadata.
Add proper error message.
Update man for proper use of --size.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Fix double free
Lukasz Florczak [Fri, 25 Mar 2022 11:48:59 +0000 (12:48 +0100)] 
mdadm: Fix double free

If there was a size mismatch after creation it would get fixed on grow
in imsm_fix_size_mismatch(), but due to double free "double free or corruption (fasttop)"
error occurs and grow cannot proceed.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoUnify error message.
Lukasz Florczak [Tue, 15 Mar 2022 08:30:30 +0000 (09:30 +0100)] 
Unify error message.

Provide the same error message for the same error that can occur in Grow.c and super-intel.c.

Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoRelease mdadm-4.2 mdadm-4.2
Jes Sorensen [Thu, 30 Dec 2021 19:40:16 +0000 (14:40 -0500)] 
Release mdadm-4.2

Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoMonitor: print message before quit for no array to monitor
Coly Li [Thu, 2 Sep 2021 07:32:20 +0000 (15:32 +0800)] 
Monitor: print message before quit for no array to monitor

If there is no array device to monitor, Monitor() will stop monitoring
at line 261 from the following code block,
 257                 if (!new_found) {
 258                         if (oneshot)
 259                                 break;
 260                         else if (!anyredundant) {
 261                                 break;
 262                         }

This change was introduced by commit 007087d0898a ("Monitor: stop
notifing about containers"). Before this commit, Monitor() will continue
and won't quit even there is no array to monitor.

It is fine to quit without any array device to monitor, but users may
wonder whether there is something wrong with mdadm program or their
configuration to make mdadm quit monitoring.

This patch adds a simple error message to indicate Monitor() quits for
array device to monitor, which makes users have hint to understand why
mdadm stops monitoring.

Reported-by: George Gkioulis <ggkioulis@suse.com>
Suggested-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Coly Li <colyli@suse.de>
Cc: Jes Sorensen <jsorensen@fb.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: block creation with long names
Blazej Kucman [Fri, 3 Dec 2021 14:31:15 +0000 (15:31 +0100)] 
mdadm: block creation with long names

This fixes buffer overflows in create_mddev(). It prohibits
creation with not supported names for DDF and native. For IMSM,
mdadm will do silent cut to 16 later.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoCorrect checking if file descriptors are valid
Mateusz Grzonka [Wed, 24 Nov 2021 10:48:33 +0000 (11:48 +0100)] 
Correct checking if file descriptors are valid

In some cases file descriptors equal to 0 are treated as invalid.
Fix it.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoIncremental: Close unclosed mdfd in IncrementalScan()
Mateusz Grzonka [Wed, 24 Nov 2021 10:45:30 +0000 (11:45 +0100)] 
Incremental: Close unclosed mdfd in IncrementalScan()

In addition to closing mdfd, propagate helpers to manage file
descriptors across IncrementalScan().

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: assert if there is migration but prev_map doesn't exist
Pawel Piatkowski [Mon, 8 Nov 2021 11:53:12 +0000 (12:53 +0100)] 
imsm: assert if there is migration but prev_map doesn't exist

Verify that prev_map in not null during volume migration.
Practically this case is not possible, device prev_map is being
added if it is in the middle of migration.
Add verification to silence static code analyze errors.

Change error handling for function is_gen_migration() (as well as
values compared with return value from this function) to use boolean
types provided by stdbool.h.

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: free allocated memory in imsm_fix_size_mismatch
Pawel Piatkowski [Thu, 4 Nov 2021 13:16:22 +0000 (14:16 +0100)] 
imsm: free allocated memory in imsm_fix_size_mismatch

Free allocated memory stored in variable named update

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoRelease mdadm-4.2-rc3 mdadm-4.2-rc3
Jes Sorensen [Thu, 4 Nov 2021 01:49:36 +0000 (21:49 -0400)] 
Release mdadm-4.2-rc3

Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: introduce helpers to manage file descriptors
Mariusz Tkaczyk [Tue, 19 Oct 2021 10:07:43 +0000 (12:07 +0200)] 
imsm: introduce helpers to manage file descriptors

To avoid direct comparisions define dedicated inlines.
This patch propagates them in super-intel.c. They are declared globally
for future usage outside IMSM.

Additionally, it adds fd check in save_backup_imsm() to remove
code vulnerability and simplifies targets array implementation.

It also propagates pr_vrb() macro instead if (verbose) condidtion.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm/Detail: Can't show container name correctly when unpluging disks
Xiao Ni [Wed, 27 Oct 2021 12:23:14 +0000 (20:23 +0800)] 
mdadm/Detail: Can't show container name correctly when unpluging disks

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.

This patch replaces map_dev_preferred with access.

Fixes: db5377883fef (It should be FAILED when raid has)
Signed-off-by: Xiao Ni <xni@redhat.com>
Reported-by: Fine Fan <ffan@redhat.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm/lib: Define a new helper function is_dev_alived
Xiao Ni [Wed, 27 Oct 2021 12:23:13 +0000 (20:23 +0800)] 
mdadm/lib: Define a new helper function is_dev_alived

The function is used to check if one member disk is alive.

Signed-off-by: Xiao Ni <xni@redhat.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoFix 2 dc stream buffer
Nigel Croxon [Thu, 14 Oct 2021 16:02:00 +0000 (12:02 -0400)] 
Fix 2 dc stream buffer

To meet requirements of Common Criteria certification vulnerablility
assessment. Static code analysis has been run and found the following
Error: DC.STREAM_BUFFER (CWE-120): [#def46]
mdadm-4.2: dont_call: "fscanf" assumes an arbitrarily
long string, so callers must use correct precision specifiers or
never use "fscanf".

The change is to define a value for string %s.

V2: Tighten the value in policy.c to match the limit of the metadata.
Add a change to policy_save_path() to use correct precision on the
fscanf call.

Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoAssemble: apply sysfs rules
Kinga Tanska [Tue, 12 Oct 2021 10:16:16 +0000 (12:16 +0200)] 
Assemble: apply sysfs rules

During assemblation container with quiet flag, sysfs rules are not applied.
This commit makes sysfs_rules_apply() independent from verbose condition.

Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoFix potential overlap dest buffer
Nigel Croxon [Tue, 17 Aug 2021 13:14:48 +0000 (09:14 -0400)] 
Fix potential overlap dest buffer

To meet requirements of Common Criteria certification vulnerablility
assessment. Static code analysis has been run and found the following
error.  Overlapping_buffer: The source buffer potentially overlaps
with the destination buffer, which results in undefined
behavior for "memcpy".

The change is to use memmove instead of memcpy.

Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agodisallow create or grow clustered bitmap with writemostly set
Nigel Croxon [Mon, 23 Aug 2021 12:48:35 +0000 (08:48 -0400)] 
disallow create or grow clustered bitmap with writemostly set

Do not support creating an MD array on a clustered system
(--bitmap=clustered) and disks with the write mostly
(--write-mostly) flag set.

Or do not grow an MD array on a non-clustered bitmap to a
clustered bitmap with disks having the write mostly flag set.

The actual results is the MD array is created successfully.
But the expected results should be a failure with an
error message stating:
Can not set --write-mostly with a clustered bitmap.
and disks marked write-mostly are not supported with clustered bitmap.

V2:
Added the device name in the error message during creation:
mdadm -CR /dev/md0 -l1 --raid-devices=2 /dev/sda --write-mostly /dev/sdb --bitmap=clustered
mdadm: Can not set /dev/sdb --write-mostly with a clustered bitmap.

Added the array name in the error message when growing:
mdadm --grow /dev/md0 --bitmap=clustered
mdadm: /dev/md0 disks marked write-mostly are not supported with clustered bitmap

Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoFix buffer size warning for strcpy
Nigel Croxon [Wed, 25 Aug 2021 15:30:14 +0000 (11:30 -0400)] 
Fix buffer size warning for strcpy

To meet requirements of Common Criteria certification vulnerability
assessment. Static code analysis has been run and found the following
error:
buffer_size_warning: Calling "strncpy" with a maximum size
argument of 16 bytes on destination array "ve->name" of
size 16 bytes might leave the destination string unterminated.
https://people.redhat.com/ncroxon/mdadm-4.2-rc2-scan-results.html

The change is to make the destination size to fit the allocated size.

V5:
Simplify the the strnlen call.

V4:
Code cleanup of the interim "if" statement.

V3: Doc change only:
The code change from filling ve->name with spaces to filling it with
null-terminated is to comform to the SNIA - Common RAID Disk Data
Format Specification. The format for VD_Name (ve->name) specifies
the field to be either ASCII or UNICODE. Bit 2 of the VD_Type field
MUST be used to determine the Unicode or ASCII format of this field.
If this field is not used, all bytes MUST be set to zero.

V2: Change from zero-terminated to zero-padded on memset and
change from using strncpy to memcpy, feedback from Neil Brown.

Tested-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoRefactor parse_num and use it to parse optarg.
Mateusz Grzonka [Thu, 2 Sep 2021 09:48:12 +0000 (11:48 +0200)] 
Refactor parse_num and use it to parse optarg.

Use parse_num instead of atoi to parse optarg. Replace atoi by strtol.
Move inst to int conversion into manage_new. Add better error handling.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoFix error message when creating raid 4, 5 and 10
Mateusz Grzonka [Mon, 30 Aug 2021 08:25:17 +0000 (10:25 +0200)] 
Fix error message when creating raid 4, 5 and 10

Change inappropriate error message "at least 2 raid-devices needed for
level 4 or 5" to only mention relevant raid level.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: fix coredump of mdadm --monitor -r
Wu Guanghao [Mon, 16 Aug 2021 07:24:51 +0000 (15:24 +0800)] 
mdadm: fix coredump of mdadm --monitor -r

The --monitor -r option requires a parameter, otherwise a null pointer will be manipulated
when converting to integer data, and a coredump will appear.

Segmentation fault (core dumped)

Signed-off-by: Wu Guanghao <wuguanghao3@huawei.com>
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoUtils: Change sprintf to snprintf
Mateusz Kusiak [Thu, 12 Aug 2021 11:48:48 +0000 (13:48 +0200)] 
Utils: Change sprintf to snprintf

Using sprintf can cause segmentation fault by exceeding the size of buffer array.

Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoRelease mdadm-4.2-rc2 mdadm-4.2-rc2
Jes Sorensen [Mon, 2 Aug 2021 17:07:32 +0000 (13:07 -0400)] 
Release mdadm-4.2-rc2

Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoAssemble: skip devices that don't match uuid instead of aborting the assembly.
Sudhakar Panneerselvam [Thu, 22 Jul 2021 18:28:34 +0000 (18:28 +0000)] 
Assemble: skip devices that don't match uuid instead of aborting the assembly.

This fixes '03r0assem' test as assembly fails when looking for specific
uuid among the device list.

Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoAdd monitor delay parameter to mdadm.conf
oshchirs [Fri, 30 Jul 2021 09:16:00 +0000 (11:16 +0200)] 
Add monitor delay parameter to mdadm.conf

Add possibility to configure delay for mdadm in monitoring mode
using mdadm.conf.
--delay command line argument takes precedence over config file.

Signed-off-by: Oleksandr Shchirskyi <oleksandr.shchirskyi@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agotests: Avoid passing chunk size when creating RAID 1
Mateusz Grzonka [Wed, 28 Jul 2021 14:31:11 +0000 (16:31 +0200)] 
tests: Avoid passing chunk size when creating RAID 1

Tests fail because passing chunk size for RAID 1 is now forbidden.
Failing tests:
- 14imsm-r1_2d-grow-r1_3d
- 14imsm-r1_2d-takeover-r0_2d
- 18imsm-1d-takeover-r1_2d
- 18imsm-r1_2d-takeover-r0_1d

Correct tests to not pass chunk size when RAID level is 1.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoFix memory leak after "mdadm --detail"
Mateusz Grzonka [Tue, 27 Jul 2021 08:25:18 +0000 (10:25 +0200)] 
Fix memory leak after "mdadm --detail"

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoAssemble: start dirty and degraded array.
Mariusz Tkaczyk [Wed, 21 Jul 2021 15:47:54 +0000 (17:47 +0200)] 
Assemble: start dirty and degraded array.

The case when array is already degraded has been omitted
by commit 7b99edab2834 ("Assemble.c: respect force flag.").
Appropriative support has been added now.

Handlers for "run" and "force" have been divided into independent
routines. Especially force has to be as meaningless as possible.
It respects following rules:
    - user agrees to start array as degraded (by --run) or is already
      degraded
    - raid456 module is in use
    - some drives are missing (to limit potential abuses)

It doesn't allow to skip resync on dirty, but not degraded array.

This patch cleans up message generation for external array and makes it
consistent. Following code could be reused also for native.

In current implementation assemble_container_content is called once, in
both Incremental or Assembly mode. Thus makes that partial assembly is
not likely to happen. It is possible, but requires user input.
Partial assembly during reshape fails (sysfs_set_array
error - not yet investigated). For now I put FIXME to mark current
logic as known to be buggy because preexist_cnt contains both exp_cnt
and new_cnt which may produce an incorrect message.

Check for new disks and runstop is unnecessary, so has been removed.
This allows to print assemble status in every case, even if nothing new
happens.

Reported-by: Devon Beets <devon@sigmalabsinc.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: fix num_data_stripes after raid0 takeover
Mariusz Tkaczyk [Wed, 21 Jul 2021 11:42:20 +0000 (13:42 +0200)] 
imsm: fix num_data_stripes after raid0 takeover

After raid1 to raid0 migration num_data_stripes value is
incorrect because was additionally divided by 2.

Create dedicated setters for num_data_stripes and num_domains
and propagate it across the code to unify alghoritms and
eliminate similar mistakes.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoAdd error handling for chunk size in RAID1
Mateusz Grzonka [Thu, 15 Jul 2021 10:25:23 +0000 (12:25 +0200)] 
Add error handling for chunk size in RAID1

Print error if chunk size is set as it is not supported.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: Fix possible memory leaks and refactor freeing struct dl
Mateusz Grzonka [Mon, 28 Jun 2021 12:15:04 +0000 (14:15 +0200)] 
imsm: Fix possible memory leaks and refactor freeing struct dl

Free memory allocated by structs dl and intel_super.
Allow __free_imsm_disk to decide if fd has to be closed and propagate it
across code instead of direct struct dl freeing.

Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm: Fix building errors
Xiao Ni [Tue, 22 Jun 2021 15:15:55 +0000 (23:15 +0800)] 
mdadm: Fix building errors

In util.c, there is a building error:
'/md/metadata_version' directive writing 20 bytes into a
region of size between 0 and 255 [-Werror=format-overflow=]

In mapfile.c
It declares the fouth argument as 'int *' in map_update,
but in mdadm.h it's previously declared as an array 'int[4]'

Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoDon't associate spares with other arrays during RAID Examine
Oleksandr Shchirskyi [Fri, 18 Jun 2021 13:53:32 +0000 (15:53 +0200)] 
Don't associate spares with other arrays during RAID Examine

Spares in imsm belong to containers, not volumes, and must go into
a separate container when assembling the RAID.
Remove association spares with other arrays and make Examine print
separate containers for spares.
Auto assemble without config file already works like this. So make
creating a config file and assembling from it consistent with auto
assemble.
With this change, mdadm -Es will add this line to output if spares
are found:
ARRAY metadata=imsm UUID=00000000:00000000:00000000:00000000

Signed-off-by: Oleksandr Shchirskyi <oleksandr.shchirskyi@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoRemove Spare drives line from details for external metadata
Oleksandr Shchirskyi [Fri, 18 Jun 2021 13:53:31 +0000 (15:53 +0200)] 
Remove Spare drives line from details for external metadata

Arrays with external metadata do not have spare disks directly
assigned to volumes; spare disks belong to containers and are
moved to arrays when the array is degraded/reshaping.
Thus, the display of zero spare disks in volume details is
incorrect and can be confusing.

Signed-off-by: Oleksandr Shchirskyi <oleksandr.shchirskyi@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoimsm: correct offset for 4k disks in --examine output
Oleksandr Shchirskyi [Fri, 18 Jun 2021 13:53:30 +0000 (15:53 +0200)] 
imsm: correct offset for 4k disks in --examine output

"Sector Offset" field in Examine output was always printed in 512
byte sectors. Update it to support 4096 sector size.

Signed-off-by: Oleksandr Shchirskyi <oleksandr.shchirskyi@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoUse dev_open in validate geometry container
Blazej Kucman [Tue, 15 Jun 2021 14:45:39 +0000 (16:45 +0200)] 
Use dev_open in validate geometry container

Fix regression caused by the patch 1f5d54a06
("Manage: Call validate_geometry when adding drive to external container")
- mdmonitor passes to Manage() routine dev name as min:mjr.
The open() used in validate_geometry_container()
in both ddf and imsm requires path, replace open calls by dev_open,
which allows to use dev path and min:mjr.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agomdadm/super1: It needs to specify int32 for bitmap_offset
Xiao Ni [Wed, 2 Jun 2021 01:17:19 +0000 (09:17 +0800)] 
mdadm/super1: It needs to specify int32 for bitmap_offset

For super1.0 bitmap offset is -16. So it needs to use int type for bitmap offset.

Fixes: 1fe2e1007310 (mdadm/bitmap: locate bitmap calcuate bitmap position wrongly)
Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2 years agoManage: Call validate_geometry when adding drive to external container
Mariusz Tkaczyk [Mon, 17 May 2021 14:39:03 +0000 (16:39 +0200)] 
Manage: Call validate_geometry when adding drive to external container

When adding drive to container call validate_geometry to verify whether
drive is supported and can be addded to container.

Remove unused parameters from validate_geometry_imsm_container().
There is no need to pass them.
Don't calculate freesize if it is not mandatory. Make it configurable.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>