Commit Graph

2420 Commits

Author SHA1 Message Date
Robert Buchholz f2e29ad691 Repair mode for raid6
In repair mode, raid6check will rewrite one single stripe
by regenerating the data (or parity) of two raid devices that
are specified via the command line.
If you need to rewrite just one slot, pick any other slot
at random.

Note that the repair option will change data on the disks
directly, so both the md layer above as well as any layers
above md (such as filesystems) may be accessing the stripe
data from cached buffers. Either instruct the kernels
to drop the caches or reassemble the raid after repair.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:45 +10:00
Robert Buchholz 23b7d3b927 Make test a bash script (as it is)
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:43 +10:00
Robert Buchholz 59679536c5 Extract function to generate zeroes and expose xor function
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:38 +10:00
NeilBrown 1d9976430c Manage: simplify device searches in Manage_subdevs
We currently have rather hard-to-follow loop to iterate
through all the matches for 'missing' or 'faulty' or 'detached'.

Simplify it by creating a list of possible devices for each
of those and splicing the new list into the device list.

This removes the need for 'jnext' and 'next' and various other hacks.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:16 +10:00
NeilBrown 50f01ba5a1 Use new struct context and struct shape for Grow_addbitmap
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:12 +10:00
NeilBrown 32754b7d84 Use new struct context and struct shape in Grow_reshape
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:09 +10:00
NeilBrown 99cc42f4a9 Use new 'struct shape' to pass args to Create
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:22:05 +10:00
NeilBrown a4e8316a75 Use new 'struct shape' to pass args to Build
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:21:57 +10:00
NeilBrown 45c8bd9961 Fix --build on 2.2 kernels :-)
This code has clearly never been used because it isn't right.
But let's fix it anyway.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:21:50 +10:00
NeilBrown e705e81ba6 Create new 'struct shape' to pass around array details.
This collects to together many of the args given to
create/build/grow

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:21:38 +10:00
NeilBrown 3c463be459 Create: Remove unnecessary cast from 'size'.
'size' is already unsigned long long, so no need to cast it.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:21:27 +10:00
NeilBrown a93f8c6540 change array_size to be unsigned and use the new MAX_SIZE
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:21:06 +10:00
NeilBrown d04f65f48c Change the values for "max size" from -1 to 1.
Both are impossible, and '1' allows size to be unsigned,
which is neater.
Also #define MAX_SIZE to be '1' to make it all more explicit.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:32 +10:00
NeilBrown 56dcaa6ba0 Assemble: don't leak memory with fdlist.
We should free fdlist when finished with it.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:25 +10:00
NeilBrown 11b6d91dd0 Change Incremental and related functions to take struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:22 +10:00
NeilBrown 95c5020544 Change Monitor to take a struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:19 +10:00
NeilBrown ef898ce65b Change Detail and misc_scan to take a struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:16 +10:00
NeilBrown 4df01ff599 Change name of 'c' variable in Detail
I want to use 'c' uniformly as a 'struct context', so
in Detail change 'c' to 'str'.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:05 +10:00
NeilBrown eec3f88785 change Examine to take a struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:20:00 +10:00
NeilBrown 265460abab Examine: split 'verbose' out from 'brief'.
The value of 'verbose' is sometimes mixed into 'brief', particularly
for Examine.
This is messy and confusing.  So keep them separate.
'brief' still gets assumed when 'scan' is set, unless we are very
verbose.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:19:48 +10:00
NeilBrown 171dccc813 Change Create to take a struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:19:24 +10:00
NeilBrown 0c9e4afb1f Change Build to take a struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:19:21 +10:00
NeilBrown 86da243fda Change misc_list to take struct context
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:19:17 +10:00
NeilBrown 4977146a84 Convert Assemble() to take a context rather than a list of options.
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:19:07 +10:00
NeilBrown 0937132db1 Discard 'quiet' context variable.
Just use negative verbose, now that we are ready for that.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:18:48 +10:00
NeilBrown ba728be72f Convert 'quiet' to 'not verbose' in various places.
If we change some functions to accept 'verbose', where <0 means to be
quiet, in place of 'quiet', then we will be able to merge
'quiet' and 'verbose' together for simplicity.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:18:09 +10:00
NeilBrown 9e33d55609 Create 'struct context' for ad hoc context option.
Rather than passing a long list of little flags etc to various
functions we will soon pass a small collection of structures.

This first step combines a collection of variables local to
'main' into a single structure.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:17:33 +10:00
NeilBrown 7986889004 Create parse_num() function.
Instead of open-coding this several times, just do it once.

The frees up the name 'c' which I'm about to use.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:17 +10:00
NeilBrown 72d566f68d Create: support --readonly flag.
Allow array to be created read-only

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:17 +10:00
NeilBrown 0ea8f5b167 Assemble: allow arrays to be assembled read-only.
The option was there, but never used.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown 503975b9d5 Remove scattered checks for malloc success.
malloc should never fail, and if it does it is unlikely
that anything else useful can be done.  Best approach is to
abort and let some super-daemon restart.

So define xmalloc, xcalloc, xrealloc, xstrdup which don't
fail but just print a message and exit.  Then use those
removing all the tests for failure.

Also replace all "malloc;memset" sequences with 'xcalloc'.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown c8e1a230b7 Remove re_add flag in favour of new disposition.
Instead of
   disposition == 'a'  re_add == 1
use
   disposition == 'A'

to record that a re-add was requested.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown e7b84f9d50 Introduce pr_err for printing error messages.
'pr_err("' is a lot shorter than 'fprintf(stderr, Name ": '
cont_err() is also available.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown 5187a38587 Help: use an array to choose which help matches which mode.
Looks cleaner than a big switch statement.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown 7d27d1c091 main: extract more functions.
extract misc_scan stop_scan misc_list from main to try to
make main() a little more manageable.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00
NeilBrown 3cbc4d12d0 main: split scan_assemble into a separate function
main is too big.  This makes it a little more manageable.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:10 +10:00
NeilBrown 18361a1aed mdadm.c: various minor clean-ups
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:00:50 +10:00
NeilBrown f7d3febcd6 Use explicit non-char opt for --zero-super
As we don't allow '-K' for '--zero-super' there is no point
using it internally.  Just define a 'KillOpt' like with
other options.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:00:45 +10:00
NeilBrown 5838058442 ReadMe: various updates and corrections.
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:00:24 +10:00
NeilBrown 7a0bfa2d55 mdmon: fix arg parsing.
-t aka --takeover should not be setting container_name.
It sets it to NULL which causes failure when you try
  mdmon --all --takeover

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 16:50:22 +10:00
NeilBrown 721b662b5b Monitor: fix reporting for Fail vs FailSpare etc.
The tests here were specific to 0.90 metadata and didn't
work properly for 1.x metadata, where a device's "number"
doesn't change.

By checking if this is a new array we can avoid some
corner cases.  Then we test mostly based on state and
not based on 'number' at all.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-06-04 12:57:52 +10:00
NeilBrown 0f760384eb Monitor: Report NewArray when an array the disappeared, reappears.
Signed-off-by: NeilBrown <neilb@suse.de>
2012-06-04 12:52:36 +10:00
NeilBrown 9dad51d418 Monitor: fix inconsistencies in values for ->percent
->percent sometimes stores negative values recording states
like 'pending' or 'delayed'.
The value '-2' means both 'delayed' and in Monitor, 'unknown'.
Also, '-1' has a meaning but not #define.

So change the #defines to be prefixed with "RESYNC_", instead
of "PROCESS_", add new "_NONE" and "_UNKNOWN", and use correct
value in each location.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-06-04 12:31:40 +10:00
NeilBrown b0599bda13 Monitor: Allow correct monitoring of more member devices.
Having "MaxDisks == 384" is not good.  Discard it in favour of
MAX_DISKS which is 4096

Signed-off-by: NeilBrown <neilb@suse.de>
2012-06-04 09:30:56 +10:00
NeilBrown 2c096ebe4b Detail: show which 'set' each device in a RAID10 belongs to
A RAID10 can be though of as having 2 sets of devices
(if there are 2 copies and an even number of devices in total).

With this patch "mdadm --detail" shows which 'set' each device
belongs to - set-A or set-B.

If there are more than 3 copies, there can be more than 3 sets.

If the number of copies does not evenly divide the number of devices,
there are not distinct 'sets' so none are reported.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-30 13:08:39 +10:00
Jes Sorensen 5e311406c4 New tests testing removal of internal bitmaps
To match the add-bitmap tests, here is a set of tests checking the
removal of bitmaps.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-30 10:46:25 +10:00
Jes Sorensen 451e30b1e6 New tests testing the addition of bitmaps
This set of tests verifies that it is possible to add an internal
bitmap to an existing array, and that the device can be written to
after the bitmap is added. This should catch cases such as the one
fixed by 4474ca42e2577563a919fd3ed782e2ec55bf11a2

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-30 10:45:27 +10:00
Jes Sorensen fc092254a1 Fix --no-error in test script
b8e91a32cd was applied incorrectly.
It changed the name of the variable set when specifying --no-error,
without changing the places checking it.

Set it back as it was to make --no-error work correctly again.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-30 10:44:10 +10:00
Lukasz Dorau e199302399 imsm: fix: correct checking volume's degradation
We do not check the return value of sysfs_get_ll() now. It is wrong.
If reading of the sysfs "degraded" key does not succeed,
the "new_degraded" variable will not be initiated
and accidentally it can have the value of "degraded" variable.
In that case the change of degradation will not be checked.

It happens if mdadm is compiled with gcc's "-fstack-protector" option
when one tries to stop a volume under reshape (e.g. OLCE).
Reshape seems to be finished then (metadata is in normal/clean state)
but it is not finished, it is broken and data are corrupted.

Now we always check the return value of sysfs_get_ll().
Even if reading of the sysfs "degraded" key does not succeed
(rv == -1) the change of degradation will be checked.

Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-29 09:34:39 +10:00
majianpeng 4687f16027 mdadm: Fix Segmentation fault.
In function write_init_super1():
If "rv = store_super1(st, di->fd)" return error and the di is the last.
Then the di = NULL && rv > 0, so exec:
if (rv)
    fprintf(stderr, Name ": Failed to write metadata to%s\n",
     	 di->devname);
will be segmentation fault.

Signed-off-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-05-29 09:21:51 +10:00