mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
f2fs: close unused open zones while mounting
Zoned UFS allows only 6 open zones at the same time, so we need to take care of the count of open zones while mounting. Signed-off-by: Daeho Jeong <daehojeong@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
633c8b9409
commit
04abeb699d
@ -4810,40 +4810,49 @@ static int check_zone_write_pointer(struct f2fs_sb_info *sbi,
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If last valid block is beyond the write pointer, report the
|
||||
* inconsistency. This inconsistency does not cause write error
|
||||
* because the zone will not be selected for write operation until
|
||||
* it get discarded. Just report it.
|
||||
*/
|
||||
if (last_valid_block >= wp_block) {
|
||||
f2fs_notice(sbi, "Valid block beyond write pointer: "
|
||||
"valid block[0x%x,0x%x] wp[0x%x,0x%x]",
|
||||
GET_SEGNO(sbi, last_valid_block),
|
||||
GET_BLKOFF_FROM_SEG0(sbi, last_valid_block),
|
||||
wp_segno, wp_blkoff);
|
||||
// The write pointer matches with the valid blocks
|
||||
if (last_valid_block + 1 == wp_block)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (last_valid_block + 1 == zone_block) {
|
||||
/*
|
||||
* If there is no valid block in the zone and if write pointer is
|
||||
* not at zone start, reset the write pointer.
|
||||
* If there is no valid block in the zone and if write pointer
|
||||
* is not at zone start, reset the write pointer.
|
||||
*/
|
||||
if (last_valid_block + 1 == zone_block && zone->wp != zone->start) {
|
||||
f2fs_notice(sbi,
|
||||
"Zone without valid block has non-zero write "
|
||||
"pointer. Reset the write pointer: wp[0x%x,0x%x]",
|
||||
wp_segno, wp_blkoff);
|
||||
ret = __f2fs_issue_discard_zone(sbi, fdev->bdev, zone_block,
|
||||
zone->len >> log_sectors_per_block);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
f2fs_err(sbi, "Discard zone failed: %s (errno=%d)",
|
||||
fdev->path, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
/*
|
||||
* If there are valid blocks and the write pointer doesn't
|
||||
* match with them, we need to report the inconsistency and
|
||||
* fill the zone till the end to close the zone. This inconsistency
|
||||
* does not cause write error because the zone will not be selected
|
||||
* for write operation until it get discarded.
|
||||
*/
|
||||
f2fs_notice(sbi, "Valid blocks are not aligned with write pointer: "
|
||||
"valid block[0x%x,0x%x] wp[0x%x,0x%x]",
|
||||
GET_SEGNO(sbi, last_valid_block),
|
||||
GET_BLKOFF_FROM_SEG0(sbi, last_valid_block),
|
||||
wp_segno, wp_blkoff);
|
||||
|
||||
ret = blkdev_issue_zeroout(fdev->bdev, zone->wp,
|
||||
zone->len - (zone->wp - zone->start),
|
||||
GFP_NOFS, 0);
|
||||
if (ret)
|
||||
f2fs_err(sbi, "Fill up zone failed: %s (errno=%d)",
|
||||
fdev->path, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct f2fs_dev_info *get_target_zoned_dev(struct f2fs_sb_info *sbi,
|
||||
|
Loading…
Reference in New Issue
Block a user