mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
md: break remaining operations on badblocks set failure in narrow_write_error
Mark device faulty and exit at once when setting badblocks fails in narrow_write_error(). No need to continue processing remaining sections. With this change, narrow_write_error() no longer needs to return a value, so adjust its return type to void. Link: https://lore.kernel.org/linux-raid/20260105110300.1442509-5-linan666@huaweicloud.com Signed-off-by: Li Nan <linan122@huawei.com> Signed-off-by: Yu Kuai <yukuai@fnnas.com>
This commit is contained in:
@@ -2486,7 +2486,7 @@ static void fix_read_error(struct r1conf *conf, struct r1bio *r1_bio)
|
||||
}
|
||||
}
|
||||
|
||||
static bool narrow_write_error(struct r1bio *r1_bio, int i)
|
||||
static void narrow_write_error(struct r1bio *r1_bio, int i)
|
||||
{
|
||||
struct mddev *mddev = r1_bio->mddev;
|
||||
struct r1conf *conf = mddev->private;
|
||||
@@ -2507,7 +2507,6 @@ static bool narrow_write_error(struct r1bio *r1_bio, int i)
|
||||
sector_t sector;
|
||||
int sectors;
|
||||
int sect_to_write = r1_bio->sectors;
|
||||
bool ok = true;
|
||||
|
||||
if (rdev->badblocks.shift < 0)
|
||||
block_sectors = lbs;
|
||||
@@ -2541,18 +2540,22 @@ static bool narrow_write_error(struct r1bio *r1_bio, int i)
|
||||
bio_trim(wbio, sector - r1_bio->sector, sectors);
|
||||
wbio->bi_iter.bi_sector += rdev->data_offset;
|
||||
|
||||
if (submit_bio_wait(wbio) < 0)
|
||||
/* failure! */
|
||||
ok = rdev_set_badblocks(rdev, sector,
|
||||
sectors, 0)
|
||||
&& ok;
|
||||
if (submit_bio_wait(wbio) &&
|
||||
!rdev_set_badblocks(rdev, sector, sectors, 0)) {
|
||||
/*
|
||||
* Badblocks set failed, disk marked Faulty.
|
||||
* No further operations needed.
|
||||
*/
|
||||
md_error(mddev, rdev);
|
||||
bio_put(wbio);
|
||||
break;
|
||||
}
|
||||
|
||||
bio_put(wbio);
|
||||
sect_to_write -= sectors;
|
||||
sector += sectors;
|
||||
sectors = block_sectors;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
|
||||
@@ -2596,10 +2599,7 @@ static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
|
||||
* errors.
|
||||
*/
|
||||
fail = true;
|
||||
if (!narrow_write_error(r1_bio, m))
|
||||
md_error(conf->mddev,
|
||||
conf->mirrors[m].rdev);
|
||||
/* an I/O failed, we can't clear the bitmap */
|
||||
narrow_write_error(r1_bio, m);
|
||||
rdev_dec_pending(conf->mirrors[m].rdev,
|
||||
conf->mddev);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user