Commit 92592285 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: check discard alignment only for SEQWRITE zones



For converntional zones, we don't need to align discard commands to exact zone
size.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 40465257
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -793,24 +793,13 @@ static int __f2fs_issue_discard_async(struct f2fs_sb_info *sbi,
static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi,
		struct block_device *bdev, block_t blkstart, block_t blklen)
{
	sector_t nr_sects = SECTOR_FROM_BLOCK(blklen);
	sector_t sector;
	sector_t sector, nr_sects;
	int devi = 0;

	if (sbi->s_ndevs) {
		devi = f2fs_target_device_index(sbi, blkstart);
		blkstart -= FDEV(devi).start_blk;
	}
	sector = SECTOR_FROM_BLOCK(blkstart);

	if (sector & (bdev_zone_sectors(bdev) - 1) ||
	    nr_sects != bdev_zone_sectors(bdev)) {
		f2fs_msg(sbi->sb, KERN_INFO,
			"(%d) %s: Unaligned discard attempted (block %x + %x)",
			devi, sbi->s_ndevs ? FDEV(devi).path: "",
			blkstart, blklen);
		return -EIO;
	}

	/*
	 * We need to know the type of the zone: for conventional zones,
@@ -825,6 +814,17 @@ static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi,
		return __f2fs_issue_discard_async(sbi, bdev, blkstart, blklen);
	case BLK_ZONE_TYPE_SEQWRITE_REQ:
	case BLK_ZONE_TYPE_SEQWRITE_PREF:
		sector = SECTOR_FROM_BLOCK(blkstart);
		nr_sects = SECTOR_FROM_BLOCK(blklen);

		if (sector & (bdev_zone_sectors(bdev) - 1) ||
				nr_sects != bdev_zone_sectors(bdev)) {
			f2fs_msg(sbi->sb, KERN_INFO,
				"(%d) %s: Unaligned discard attempted (block %x + %x)",
				devi, sbi->s_ndevs ? FDEV(devi).path: "",
				blkstart, blklen);
			return -EIO;
		}
		trace_f2fs_issue_reset_zone(bdev, blkstart);
		return blkdev_reset_zones(bdev, sector,
					  nr_sects, GFP_NOFS);