Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

f2fs: ensure minimum trim granularity accounts for all devices

When F2FS uses multiple block devices, each device may have a
different discard granularity. The minimum trim granularity must be
at least the maximum discard granularity of all devices, excluding
zoned devices. Use max_t instead of the max() macro to compute the
maximum value.

Signed-off-by: Yongpeng Yang <yangyongpeng@xiaomi.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

authored by

Yongpeng Yang and committed by
Jaegeuk Kim
d8bdf785 392711ef

+18 -6
+12
fs/f2fs/f2fs.h
··· 4752 4752 return false; 4753 4753 } 4754 4754 4755 + static inline unsigned int f2fs_hw_discard_granularity(struct f2fs_sb_info *sbi) 4756 + { 4757 + int i = 1; 4758 + unsigned int discard_granularity = bdev_discard_granularity(sbi->sb->s_bdev); 4759 + 4760 + if (f2fs_is_multi_device(sbi)) 4761 + for (; i < sbi->s_ndevs && !bdev_is_zoned(FDEV(i).bdev); i++) 4762 + discard_granularity = max_t(unsigned int, discard_granularity, 4763 + bdev_discard_granularity(FDEV(i).bdev)); 4764 + return discard_granularity; 4765 + } 4766 + 4755 4767 static inline bool f2fs_realtime_discard_enable(struct f2fs_sb_info *sbi) 4756 4768 { 4757 4769 return (test_opt(sbi, DISCARD) && f2fs_hw_support_discard(sbi)) ||
+6 -6
fs/f2fs/file.c
··· 2588 2588 static int f2fs_ioc_fitrim(struct file *filp, unsigned long arg) 2589 2589 { 2590 2590 struct inode *inode = file_inode(filp); 2591 - struct super_block *sb = inode->i_sb; 2591 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 2592 2592 struct fstrim_range range; 2593 2593 int ret; 2594 2594 2595 2595 if (!capable(CAP_SYS_ADMIN)) 2596 2596 return -EPERM; 2597 2597 2598 - if (!f2fs_hw_support_discard(F2FS_SB(sb))) 2598 + if (!f2fs_hw_support_discard(sbi)) 2599 2599 return -EOPNOTSUPP; 2600 2600 2601 2601 if (copy_from_user(&range, (struct fstrim_range __user *)arg, ··· 2606 2606 if (ret) 2607 2607 return ret; 2608 2608 2609 - range.minlen = max((unsigned int)range.minlen, 2610 - bdev_discard_granularity(sb->s_bdev)); 2611 - ret = f2fs_trim_fs(F2FS_SB(sb), &range); 2609 + range.minlen = max_t(unsigned int, range.minlen, 2610 + f2fs_hw_discard_granularity(sbi)); 2611 + ret = f2fs_trim_fs(sbi, &range); 2612 2612 mnt_drop_write_file(filp); 2613 2613 if (ret < 0) 2614 2614 return ret; ··· 2616 2616 if (copy_to_user((struct fstrim_range __user *)arg, &range, 2617 2617 sizeof(range))) 2618 2618 return -EFAULT; 2619 - f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); 2619 + f2fs_update_time(sbi, REQ_TIME); 2620 2620 return 0; 2621 2621 } 2622 2622