From a862209dc38f716db00365d5b5d3f24d3d0e6626 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 16 Jun 2008 15:36:41 -0700 Subject: [PATCH] imsm: set map state depending on sync state Signed-off-by: Dan Williams --- super-intel.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/super-intel.c b/super-intel.c index 3a85e2c..0efc49c 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1649,22 +1649,6 @@ static int imsm_open_new(struct supertype *c, struct active_array *a, return 0; } -static void imsm_set_array_state(struct active_array *a, int consistent) -{ - int inst = a->info.container_member; - struct intel_super *super = a->container->sb; - struct imsm_dev *dev = get_imsm_dev(super->mpb, inst); - int dirty = !consistent || (a->resync_start != ~0ULL); - - if (dev->vol.dirty != dirty) { - fprintf(stderr, "imsm: mark '%s' (%llu)\n", - dirty?"dirty":"clean", a->resync_start); - - dev->vol.dirty = dirty; - super->updates_pending++; - } -} - static __u8 imsm_check_degraded(struct imsm_super *mpb, int n, int failed) { struct imsm_dev *dev = get_imsm_dev(mpb, n); @@ -1742,6 +1726,38 @@ static int imsm_count_failed(struct imsm_super *mpb, struct imsm_map *map) return failed; } +static void imsm_set_array_state(struct active_array *a, int consistent) +{ + int inst = a->info.container_member; + struct intel_super *super = a->container->sb; + struct imsm_dev *dev = get_imsm_dev(super->mpb, inst); + struct imsm_map *map = &dev->vol.map[0]; + int dirty = !consistent; + int failed; + __u8 map_state; + + if (a->resync_start == ~0ULL) { + failed = imsm_count_failed(super->mpb, map); + map_state = imsm_check_degraded(super->mpb, inst, failed); + if (!failed) + map_state = IMSM_T_STATE_NORMAL; + if (map->map_state != map_state) { + fprintf(stderr, "imsm: map_state %d: %d\n", + inst, map_state); + map->map_state = map_state; + super->updates_pending++; + } + } + + if (dev->vol.dirty != dirty) { + fprintf(stderr, "imsm: mark '%s' (%llu)\n", + dirty?"dirty":"clean", a->resync_start); + + dev->vol.dirty = dirty; + super->updates_pending++; + } +} + static void imsm_set_disk(struct active_array *a, int n, int state) { int inst = a->info.container_member;