From 2e727c3ca1beff05f27b6207a795790f222bf8d8 Mon Sep 17 00:00:00 2001 From: Jonathan E Brassow Date: Mon, 31 Oct 2011 20:21:26 +0000 Subject: dm: raid fix device status indicator when array initializing When devices in a RAID array are not in-sync, they are supposed to be reported as such in the status output as an 'a' character, which means "alive, but not in-sync". But when the entire array is rebuilt 'A' is being used, which is incorrect. This patch corrects this to 'a'. Signed-off-by: Jonathan Brassow Signed-off-by: Alasdair G Kergon --- drivers/md/dm-raid.c | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) (limited to 'drivers/md/dm-raid.c') diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 86df8b2cf92..7503a20d04a 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -1017,30 +1017,56 @@ static int raid_status(struct dm_target *ti, status_type_t type, struct raid_set *rs = ti->private; unsigned raid_param_cnt = 1; /* at least 1 for chunksize */ unsigned sz = 0; - int i; + int i, array_in_sync = 0; sector_t sync; switch (type) { case STATUSTYPE_INFO: DMEMIT("%s %d ", rs->raid_type->name, rs->md.raid_disks); - for (i = 0; i < rs->md.raid_disks; i++) { - if (test_bit(Faulty, &rs->dev[i].rdev.flags)) - DMEMIT("D"); - else if (test_bit(In_sync, &rs->dev[i].rdev.flags)) - DMEMIT("A"); - else - DMEMIT("a"); - } - if (test_bit(MD_RECOVERY_RUNNING, &rs->md.recovery)) sync = rs->md.curr_resync_completed; else sync = rs->md.recovery_cp; - if (sync > rs->md.resync_max_sectors) + if (sync >= rs->md.resync_max_sectors) { + array_in_sync = 1; sync = rs->md.resync_max_sectors; + } else { + /* + * The array may be doing an initial sync, or it may + * be rebuilding individual components. If all the + * devices are In_sync, then it is the array that is + * being initialized. + */ + for (i = 0; i < rs->md.raid_disks; i++) + if (!test_bit(In_sync, &rs->dev[i].rdev.flags)) + array_in_sync = 1; + } + /* + * Status characters: + * 'D' = Dead/Failed device + * 'a' = Alive but not in-sync + * 'A' = Alive and in-sync + */ + for (i = 0; i < rs->md.raid_disks; i++) { + if (test_bit(Faulty, &rs->dev[i].rdev.flags)) + DMEMIT("D"); + else if (!array_in_sync || + !test_bit(In_sync, &rs->dev[i].rdev.flags)) + DMEMIT("a"); + else + DMEMIT("A"); + } + /* + * In-sync ratio: + * The in-sync ratio shows the progress of: + * - Initializing the array + * - Rebuilding a subset of devices of the array + * The user can distinguish between the two by referring + * to the status characters. + */ DMEMIT(" %llu/%llu", (unsigned long long) sync, (unsigned long long) rs->md.resync_max_sectors); -- cgit v1.2.3-70-g09d2 From 056075c76417b112b4924e7b6386fdc6dfc9ac03 Mon Sep 17 00:00:00 2001 From: Paul Gortmaker Date: Sun, 3 Jul 2011 13:58:33 -0400 Subject: md: Add module.h to all files using it implicitly A pending cleanup will mean that module.h won't be implicitly everywhere anymore. Make sure the modular drivers in md dir are actually calling out for explicitly in advance. Signed-off-by: Paul Gortmaker --- drivers/md/dm-exception-store.c | 1 + drivers/md/dm-log-userspace-base.c | 1 + drivers/md/dm-path-selector.c | 1 + drivers/md/dm-raid.c | 1 + drivers/md/dm-round-robin.c | 1 + drivers/md/dm-service-time.c | 1 + drivers/md/faulty.c | 1 + drivers/md/linear.c | 1 + drivers/md/md.c | 1 + drivers/md/multipath.c | 1 + drivers/md/raid0.c | 1 + drivers/md/raid1.c | 1 + drivers/md/raid10.c | 1 + drivers/md/raid5.c | 1 + lib/raid6/algos.c | 1 + 15 files changed, 15 insertions(+) (limited to 'drivers/md/dm-raid.c') diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 0bdb201c2c2..042e7199656 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #define DM_MSG_PREFIX "snapshot exception stores" diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c index 1021c898601..196246ef39c 100644 --- a/drivers/md/dm-log-userspace-base.c +++ b/drivers/md/dm-log-userspace-base.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "dm-log-userspace-transfer.h" diff --git a/drivers/md/dm-path-selector.c b/drivers/md/dm-path-selector.c index 42c04f04a0c..fa0ccc585cb 100644 --- a/drivers/md/dm-path-selector.c +++ b/drivers/md/dm-path-selector.c @@ -10,6 +10,7 @@ */ #include +#include #include "dm-path-selector.h" diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 37a37266a1e..69c966f517c 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -6,6 +6,7 @@ */ #include +#include #include "md.h" #include "raid1.h" diff --git a/drivers/md/dm-round-robin.c b/drivers/md/dm-round-robin.c index 24752f449be..27f1d423b76 100644 --- a/drivers/md/dm-round-robin.c +++ b/drivers/md/dm-round-robin.c @@ -14,6 +14,7 @@ #include "dm-path-selector.h" #include +#include #define DM_MSG_PREFIX "multipath round-robin" diff --git a/drivers/md/dm-service-time.c b/drivers/md/dm-service-time.c index 9c6c2e47ad6..59883bd7821 100644 --- a/drivers/md/dm-service-time.c +++ b/drivers/md/dm-service-time.c @@ -12,6 +12,7 @@ #include "dm-path-selector.h" #include +#include #define DM_MSG_PREFIX "multipath service-time" #define ST_MIN_IO 1 diff --git a/drivers/md/faulty.c b/drivers/md/faulty.c index 60816b132c2..5436b3b4a00 100644 --- a/drivers/md/faulty.c +++ b/drivers/md/faulty.c @@ -63,6 +63,7 @@ #define MaxFault 50 #include +#include #include #include #include "md.h" diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 10c5844460c..d116b85ee50 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "md.h" #include "linear.h" diff --git a/drivers/md/md.c b/drivers/md/md.c index 266e82ebaf1..23435fa4388 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index d32c785e17d..700650d2384 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c @@ -20,6 +20,7 @@ */ #include +#include #include #include #include diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 0eb08a4df75..0cf86cfc87a 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -20,6 +20,7 @@ #include #include +#include #include #include "md.h" #include "raid0.h" diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 4602fc57c96..66afe3cd0b8 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include "md.h" diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 132c18ef866..bdceadf9e91 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include "md.h" diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index f6fe053a5be..029506e55d9 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include diff --git a/lib/raid6/algos.c b/lib/raid6/algos.c index b595f560bee..8b02f60ffc8 100644 --- a/lib/raid6/algos.c +++ b/lib/raid6/algos.c @@ -17,6 +17,7 @@ */ #include +#include #ifndef __KERNEL__ #include #include -- cgit v1.2.3-70-g09d2