mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
Merge branch 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into block-6.0
Pull MD fixes from Song: "1. Fix for clustered raid, by Guoqing Jiang. 2. req_op fix, by Bart Van Assche. 3. Fix race condition in raid recreate, by David Sloan." * 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md: md: call __md_stop_writes in md_stop Revert "md-raid: destroy the bitmap after destroying the thread" md: Flush workqueue md_rdev_misc_wq in md_alloc() md/raid10: Fix the data type of an r10_sync_page_io() argument
This commit is contained in:
commit
645b5ed871
2 changed files with 9 additions and 8 deletions
|
@ -5620,6 +5620,7 @@ struct mddev *md_alloc(dev_t dev, char *name)
|
||||||
* removed (mddev_delayed_delete).
|
* removed (mddev_delayed_delete).
|
||||||
*/
|
*/
|
||||||
flush_workqueue(md_misc_wq);
|
flush_workqueue(md_misc_wq);
|
||||||
|
flush_workqueue(md_rdev_misc_wq);
|
||||||
|
|
||||||
mutex_lock(&disks_mutex);
|
mutex_lock(&disks_mutex);
|
||||||
mddev = mddev_alloc(dev);
|
mddev = mddev_alloc(dev);
|
||||||
|
@ -6238,11 +6239,11 @@ static void mddev_detach(struct mddev *mddev)
|
||||||
static void __md_stop(struct mddev *mddev)
|
static void __md_stop(struct mddev *mddev)
|
||||||
{
|
{
|
||||||
struct md_personality *pers = mddev->pers;
|
struct md_personality *pers = mddev->pers;
|
||||||
|
md_bitmap_destroy(mddev);
|
||||||
mddev_detach(mddev);
|
mddev_detach(mddev);
|
||||||
/* Ensure ->event_work is done */
|
/* Ensure ->event_work is done */
|
||||||
if (mddev->event_work.func)
|
if (mddev->event_work.func)
|
||||||
flush_workqueue(md_misc_wq);
|
flush_workqueue(md_misc_wq);
|
||||||
md_bitmap_destroy(mddev);
|
|
||||||
spin_lock(&mddev->lock);
|
spin_lock(&mddev->lock);
|
||||||
mddev->pers = NULL;
|
mddev->pers = NULL;
|
||||||
spin_unlock(&mddev->lock);
|
spin_unlock(&mddev->lock);
|
||||||
|
@ -6260,6 +6261,7 @@ void md_stop(struct mddev *mddev)
|
||||||
/* stop the array and free an attached data structures.
|
/* stop the array and free an attached data structures.
|
||||||
* This is called from dm-raid
|
* This is called from dm-raid
|
||||||
*/
|
*/
|
||||||
|
__md_stop_writes(mddev);
|
||||||
__md_stop(mddev);
|
__md_stop(mddev);
|
||||||
bioset_exit(&mddev->bio_set);
|
bioset_exit(&mddev->bio_set);
|
||||||
bioset_exit(&mddev->sync_set);
|
bioset_exit(&mddev->sync_set);
|
||||||
|
|
|
@ -2639,18 +2639,18 @@ static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
|
static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
|
||||||
int sectors, struct page *page, int rw)
|
int sectors, struct page *page, enum req_op op)
|
||||||
{
|
{
|
||||||
sector_t first_bad;
|
sector_t first_bad;
|
||||||
int bad_sectors;
|
int bad_sectors;
|
||||||
|
|
||||||
if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors)
|
if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors)
|
||||||
&& (rw == READ || test_bit(WriteErrorSeen, &rdev->flags)))
|
&& (op == REQ_OP_READ || test_bit(WriteErrorSeen, &rdev->flags)))
|
||||||
return -1;
|
return -1;
|
||||||
if (sync_page_io(rdev, sector, sectors << 9, page, rw, false))
|
if (sync_page_io(rdev, sector, sectors << 9, page, op, false))
|
||||||
/* success */
|
/* success */
|
||||||
return 1;
|
return 1;
|
||||||
if (rw == WRITE) {
|
if (op == REQ_OP_WRITE) {
|
||||||
set_bit(WriteErrorSeen, &rdev->flags);
|
set_bit(WriteErrorSeen, &rdev->flags);
|
||||||
if (!test_and_set_bit(WantReplacement, &rdev->flags))
|
if (!test_and_set_bit(WantReplacement, &rdev->flags))
|
||||||
set_bit(MD_RECOVERY_NEEDED,
|
set_bit(MD_RECOVERY_NEEDED,
|
||||||
|
@ -2780,7 +2780,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
||||||
if (r10_sync_page_io(rdev,
|
if (r10_sync_page_io(rdev,
|
||||||
r10_bio->devs[sl].addr +
|
r10_bio->devs[sl].addr +
|
||||||
sect,
|
sect,
|
||||||
s, conf->tmppage, WRITE)
|
s, conf->tmppage, REQ_OP_WRITE)
|
||||||
== 0) {
|
== 0) {
|
||||||
/* Well, this device is dead */
|
/* Well, this device is dead */
|
||||||
pr_notice("md/raid10:%s: read correction write failed (%d sectors at %llu on %pg)\n",
|
pr_notice("md/raid10:%s: read correction write failed (%d sectors at %llu on %pg)\n",
|
||||||
|
@ -2814,8 +2814,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
||||||
switch (r10_sync_page_io(rdev,
|
switch (r10_sync_page_io(rdev,
|
||||||
r10_bio->devs[sl].addr +
|
r10_bio->devs[sl].addr +
|
||||||
sect,
|
sect,
|
||||||
s, conf->tmppage,
|
s, conf->tmppage, REQ_OP_READ)) {
|
||||||
READ)) {
|
|
||||||
case 0:
|
case 0:
|
||||||
/* Well, this device is dead */
|
/* Well, this device is dead */
|
||||||
pr_notice("md/raid10:%s: unable to read back corrected sectors (%d sectors at %llu on %pg)\n",
|
pr_notice("md/raid10:%s: unable to read back corrected sectors (%d sectors at %llu on %pg)\n",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue