Commit 962ba263 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'md/3.13-fixes' of git://neil.brown.name/md

Pull md fixes from Neil Brown:
 "Three bug fixes for md in 3.13-rc

  All recent regressions, one in 3.12 so marked for -stable"

* tag 'md/3.13-fixes' of git://neil.brown.name/md:
  md/raid5: fix newly-broken locking in get_active_stripe.
  md: test mddev->flags more safely in md_check_recovery.
  md/raid5: fix new memory-reference bug in alloc_thread_groups.
parents 3bad8bb5 6d183de4
...@@ -7777,7 +7777,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7777,7 +7777,7 @@ void md_check_recovery(struct mddev *mddev)
if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
return; return;
if ( ! ( if ( ! (
(mddev->flags & ~ (1<<MD_CHANGE_PENDING)) || (mddev->flags & MD_UPDATE_SB_FLAGS & ~ (1<<MD_CHANGE_PENDING)) ||
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
test_bit(MD_RECOVERY_DONE, &mddev->recovery) || test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
(mddev->external == 0 && mddev->safemode == 1) || (mddev->external == 0 && mddev->safemode == 1) ||
......
...@@ -678,26 +678,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector, ...@@ -678,26 +678,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector,
} else } else
init_stripe(sh, sector, previous); init_stripe(sh, sector, previous);
} else { } else {
spin_lock(&conf->device_lock);
if (atomic_read(&sh->count)) { if (atomic_read(&sh->count)) {
BUG_ON(!list_empty(&sh->lru) BUG_ON(!list_empty(&sh->lru)
&& !test_bit(STRIPE_EXPANDING, &sh->state) && !test_bit(STRIPE_EXPANDING, &sh->state)
&& !test_bit(STRIPE_ON_UNPLUG_LIST, &sh->state) && !test_bit(STRIPE_ON_UNPLUG_LIST, &sh->state)
&& !test_bit(STRIPE_ON_RELEASE_LIST, &sh->state)); );
} else { } else {
spin_lock(&conf->device_lock);
if (!test_bit(STRIPE_HANDLE, &sh->state)) if (!test_bit(STRIPE_HANDLE, &sh->state))
atomic_inc(&conf->active_stripes); atomic_inc(&conf->active_stripes);
if (list_empty(&sh->lru) && BUG_ON(list_empty(&sh->lru));
!test_bit(STRIPE_ON_RELEASE_LIST, &sh->state) &&
!test_bit(STRIPE_EXPANDING, &sh->state))
BUG();
list_del_init(&sh->lru); list_del_init(&sh->lru);
if (sh->group) { if (sh->group) {
sh->group->stripes_cnt--; sh->group->stripes_cnt--;
sh->group = NULL; sh->group = NULL;
} }
spin_unlock(&conf->device_lock);
} }
spin_unlock(&conf->device_lock);
} }
} while (sh == NULL); } while (sh == NULL);
...@@ -5471,7 +5468,7 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt, ...@@ -5471,7 +5468,7 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt,
for (i = 0; i < *group_cnt; i++) { for (i = 0; i < *group_cnt; i++) {
struct r5worker_group *group; struct r5worker_group *group;
group = worker_groups[i]; group = &(*worker_groups)[i];
INIT_LIST_HEAD(&group->handle_list); INIT_LIST_HEAD(&group->handle_list);
group->conf = conf; group->conf = conf;
group->workers = workers + i * cnt; group->workers = workers + i * cnt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment