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

f2fs: add ioctl to get IO priority hint

This patch adds an ioctl to give a per-file priority hint to attach
REQ_PRIO.

Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+34
+6
fs/f2fs/data.c
··· 413 413 static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) 414 414 { 415 415 unsigned int temp_mask = GENMASK(NR_TEMP_TYPE - 1, 0); 416 + struct folio *fio_folio = page_folio(fio->page); 416 417 unsigned int fua_flag, meta_flag, io_flag; 417 418 blk_opf_t op_flags = 0; 418 419 ··· 439 438 op_flags |= REQ_META; 440 439 if (BIT(fio->temp) & fua_flag) 441 440 op_flags |= REQ_FUA; 441 + 442 + if (fio->type == DATA && 443 + F2FS_I(fio_folio->mapping->host)->ioprio_hint == F2FS_IOPRIO_WRITE) 444 + op_flags |= REQ_PRIO; 445 + 442 446 return op_flags; 443 447 } 444 448
+1
fs/f2fs/f2fs.h
··· 830 830 831 831 /* Use below internally in f2fs*/ 832 832 unsigned long flags[BITS_TO_LONGS(FI_MAX)]; /* use to pass per-file flags */ 833 + unsigned int ioprio_hint; /* hint for IO priority */ 833 834 struct f2fs_rwsem i_sem; /* protect fi info */ 834 835 atomic_t dirty_pages; /* # of dirty pages */ 835 836 f2fs_hash_t chash; /* hash value of given file name */
+20
fs/f2fs/file.c
··· 3446 3446 (u32 __user *)arg); 3447 3447 } 3448 3448 3449 + static int f2fs_ioc_io_prio(struct file *filp, unsigned long arg) 3450 + { 3451 + struct inode *inode = file_inode(filp); 3452 + __u32 level; 3453 + 3454 + if (get_user(level, (__u32 __user *)arg)) 3455 + return -EFAULT; 3456 + 3457 + if (!S_ISREG(inode->i_mode) || level >= F2FS_IOPRIO_MAX) 3458 + return -EINVAL; 3459 + 3460 + inode_lock(inode); 3461 + F2FS_I(inode)->ioprio_hint = level; 3462 + inode_unlock(inode); 3463 + return 0; 3464 + } 3465 + 3449 3466 int f2fs_precache_extents(struct inode *inode) 3450 3467 { 3451 3468 struct f2fs_inode_info *fi = F2FS_I(inode); ··· 4564 4547 return f2fs_ioc_compress_file(filp); 4565 4548 case F2FS_IOC_GET_DEV_ALIAS_FILE: 4566 4549 return f2fs_ioc_get_dev_alias_file(filp, arg); 4550 + case F2FS_IOC_IO_PRIO: 4551 + return f2fs_ioc_io_prio(filp, arg); 4567 4552 default: 4568 4553 return -ENOTTY; 4569 4554 } ··· 5280 5261 case F2FS_IOC_DECOMPRESS_FILE: 5281 5262 case F2FS_IOC_COMPRESS_FILE: 5282 5263 case F2FS_IOC_GET_DEV_ALIAS_FILE: 5264 + case F2FS_IOC_IO_PRIO: 5283 5265 break; 5284 5266 default: 5285 5267 return -ENOIOCTLCMD;
+7
include/uapi/linux/f2fs.h
··· 44 44 #define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24) 45 45 #define F2FS_IOC_START_ATOMIC_REPLACE _IO(F2FS_IOCTL_MAGIC, 25) 46 46 #define F2FS_IOC_GET_DEV_ALIAS_FILE _IOR(F2FS_IOCTL_MAGIC, 26, __u32) 47 + #define F2FS_IOC_IO_PRIO _IOW(F2FS_IOCTL_MAGIC, 27, __u32) 47 48 48 49 /* 49 50 * should be same as XFS_IOC_GOINGDOWN. ··· 63 62 #define F2FS_TRIM_FILE_DISCARD 0x1 /* send discard command */ 64 63 #define F2FS_TRIM_FILE_ZEROOUT 0x2 /* zero out */ 65 64 #define F2FS_TRIM_FILE_MASK 0x3 65 + 66 + /* for F2FS_IOC_IO_PRIO */ 67 + enum { 68 + F2FS_IOPRIO_WRITE = 1, /* high write priority */ 69 + F2FS_IOPRIO_MAX, 70 + }; 66 71 67 72 struct f2fs_gc_range { 68 73 __u32 sync;