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 --- |