segment.c (0916878da355650d7e77104a7ac0fa1784eca852) segment.c (95175dafc4399ab5b9e937da205b2a6927b19227)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/segment.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 1721 unchanged lines hidden (view full) ---

1730 struct block_device *bdev, block_t blkstart, block_t blklen)
1731{
1732 sector_t sector, nr_sects;
1733 block_t lblkstart = blkstart;
1734 int devi = 0;
1735
1736 if (f2fs_is_multi_device(sbi)) {
1737 devi = f2fs_target_device_index(sbi, blkstart);
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/segment.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 1721 unchanged lines hidden (view full) ---

1730 struct block_device *bdev, block_t blkstart, block_t blklen)
1731{
1732 sector_t sector, nr_sects;
1733 block_t lblkstart = blkstart;
1734 int devi = 0;
1735
1736 if (f2fs_is_multi_device(sbi)) {
1737 devi = f2fs_target_device_index(sbi, blkstart);
1738 if (blkstart < FDEV(devi).start_blk ||
1739 blkstart > FDEV(devi).end_blk) {
1740 f2fs_msg(sbi->sb, KERN_ERR, "Invalid block %x",
1741 blkstart);
1742 return -EIO;
1743 }
1738 blkstart -= FDEV(devi).start_blk;
1739 }
1740
1744 blkstart -= FDEV(devi).start_blk;
1745 }
1746
1741 /*
1742 * We need to know the type of the zone: for conventional zones,
1743 * use regular discard if the drive supports it. For sequential
1744 * zones, reset the zone write pointer.
1745 */
1746 switch (get_blkz_type(sbi, bdev, blkstart)) {
1747
1748 case BLK_ZONE_TYPE_CONVENTIONAL:
1749 if (!blk_queue_discard(bdev_get_queue(bdev)))
1750 return 0;
1751 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
1752 case BLK_ZONE_TYPE_SEQWRITE_REQ:
1753 case BLK_ZONE_TYPE_SEQWRITE_PREF:
1747 /* For sequential zones, reset the zone write pointer */
1748 if (f2fs_blkz_is_seq(sbi, devi, blkstart)) {
1754 sector = SECTOR_FROM_BLOCK(blkstart);
1755 nr_sects = SECTOR_FROM_BLOCK(blklen);
1756
1757 if (sector & (bdev_zone_sectors(bdev) - 1) ||
1758 nr_sects != bdev_zone_sectors(bdev)) {
1749 sector = SECTOR_FROM_BLOCK(blkstart);
1750 nr_sects = SECTOR_FROM_BLOCK(blklen);
1751
1752 if (sector & (bdev_zone_sectors(bdev) - 1) ||
1753 nr_sects != bdev_zone_sectors(bdev)) {
1759 f2fs_msg(sbi->sb, KERN_INFO,
1760 "(%d) %s: Unaligned discard attempted (block %x + %x)",
1754 f2fs_msg(sbi->sb, KERN_ERR,
1755 "(%d) %s: Unaligned zone reset attempted (block %x + %x)",
1761 devi, sbi->s_ndevs ? FDEV(devi).path: "",
1762 blkstart, blklen);
1763 return -EIO;
1764 }
1765 trace_f2fs_issue_reset_zone(bdev, blkstart);
1756 devi, sbi->s_ndevs ? FDEV(devi).path: "",
1757 blkstart, blklen);
1758 return -EIO;
1759 }
1760 trace_f2fs_issue_reset_zone(bdev, blkstart);
1766 return blkdev_reset_zones(bdev, sector,
1767 nr_sects, GFP_NOFS);
1768 default:
1769 /* Unknown zone type: broken device ? */
1770 return -EIO;
1761 return blkdev_reset_zones(bdev, sector, nr_sects, GFP_NOFS);
1771 }
1762 }
1763
1764 /* For conventional zones, use regular discard if supported */
1765 if (!blk_queue_discard(bdev_get_queue(bdev)))
1766 return 0;
1767 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
1772}
1773#endif
1774
1775static int __issue_discard_async(struct f2fs_sb_info *sbi,
1776 struct block_device *bdev, block_t blkstart, block_t blklen)
1777{
1778#ifdef CONFIG_BLK_DEV_ZONED
1779 if (f2fs_sb_has_blkzoned(sbi) &&

--- 2698 unchanged lines hidden ---
1768}
1769#endif
1770
1771static int __issue_discard_async(struct f2fs_sb_info *sbi,
1772 struct block_device *bdev, block_t blkstart, block_t blklen)
1773{
1774#ifdef CONFIG_BLK_DEV_ZONED
1775 if (f2fs_sb_has_blkzoned(sbi) &&

--- 2698 unchanged lines hidden ---