3 bug fixes for md in 3.13-rc
All recent regressions, one in 3.12 so marked for -stable. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUAUpaIkjnsnt1WYoG5AQLNwQ//asj11BcgtWb0kwS/5y4VuVR2+nnxxVLJ QO1NXvUT9BJGk+TYjfTQj4gLkXdFlyLxTgbApFxquM36rUAtvfpz+K/j7hWk6wsY NFHuX3U27YD+GWIyOcroT8QhUWYVhonmwqoQFx9Kt6rSa+T1gyloF+Huj5DAUipN 5rtzlPIXsJca/bafbA40E22Wki0nVJL99kTV7F2fKkYOIo+rm+0BuhtUgHinMKRy jSgE4kqTAQIH5Jnsa1h6mRheeQc7W3TzEB6Cx6JN9aj7NTnZmrf1NCPgTTyza2Ub oc+FvgDQCqSH9XzKaMEYMn3NixZsYwoBwXkS6joNpm9CzLrpNMs3gX3zjwLAqBH0 eAaFtm8Z5h/pdp3a7SWAv4hnjzIetqAMIR5CFsd1mkBQeHpWml0kWkE/AFzEFx4C qzyuZHQR7+h4gFrQusEokMoAcIG+dOcTogDFdvLEoxzfU8BooZ9/GyKnkYRq9rLd OvLtZPJkQ5jcdnvgOtvNpnS9riuLs37UPxlmN+Q862UKoxqg1m1frwIWnShm9eaY WYmPiPao0kHhK38y/oSQpZ5NkD+r0KloM2KrJYJeybVCckbg4XQLoA3yPwJhXZyP 1FnUY7o7dEKtPCcEGcgsDziw/53b3OrmbLmlLKrZIV04tl19pFbbq0PdOhSejMvV QHQw4aiJ/HY= =nRsH -----END PGP SIGNATURE----- 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.
This commit is contained in:
commit
962ba26326
|
@ -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,
|
||||||
} 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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue