UPSTREAM: 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> Change-Id: Ie0b0d56aa773ac8c28ac376a5e616890bc4fc292 Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> (cherry picked from commit 5f95c1812a65e4e8a6b89b6c0bafd654e8bc03de)
This commit is contained in:
committed by
Carlos Llamas
parent
1ad6825180
commit
54d0f7f84d
@@ -417,6 +417,7 @@ int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr)
|
||||
static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio)
|
||||
{
|
||||
unsigned int temp_mask = GENMASK(NR_TEMP_TYPE - 1, 0);
|
||||
struct folio *fio_folio = page_folio(fio->page);
|
||||
unsigned int fua_flag, meta_flag, io_flag;
|
||||
blk_opf_t op_flags = 0;
|
||||
|
||||
@@ -442,6 +443,11 @@ static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio)
|
||||
op_flags |= REQ_META;
|
||||
if (BIT(fio->temp) & fua_flag)
|
||||
op_flags |= REQ_FUA;
|
||||
|
||||
if (fio->type == DATA &&
|
||||
F2FS_I(fio_folio->mapping->host)->ioprio_hint == F2FS_IOPRIO_WRITE)
|
||||
op_flags |= REQ_PRIO;
|
||||
|
||||
return op_flags;
|
||||
}
|
||||
|
||||
|
||||
@@ -831,6 +831,7 @@ struct f2fs_inode_info {
|
||||
|
||||
/* Use below internally in f2fs*/
|
||||
unsigned long flags[BITS_TO_LONGS(FI_MAX)]; /* use to pass per-file flags */
|
||||
unsigned int ioprio_hint; /* hint for IO priority */
|
||||
struct f2fs_rwsem i_sem; /* protect fi info */
|
||||
atomic_t dirty_pages; /* # of dirty pages */
|
||||
f2fs_hash_t chash; /* hash value of given file name */
|
||||
|
||||
@@ -3451,6 +3451,23 @@ static int f2fs_ioc_get_dev_alias_file(struct file *filp, unsigned long arg)
|
||||
(u32 __user *)arg);
|
||||
}
|
||||
|
||||
static int f2fs_ioc_io_prio(struct file *filp, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file_inode(filp);
|
||||
__u32 level;
|
||||
|
||||
if (get_user(level, (__u32 __user *)arg))
|
||||
return -EFAULT;
|
||||
|
||||
if (!S_ISREG(inode->i_mode) || level >= F2FS_IOPRIO_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
inode_lock(inode);
|
||||
F2FS_I(inode)->ioprio_hint = level;
|
||||
inode_unlock(inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int f2fs_precache_extents(struct inode *inode)
|
||||
{
|
||||
struct f2fs_inode_info *fi = F2FS_I(inode);
|
||||
@@ -4552,6 +4569,8 @@ static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
return f2fs_ioc_compress_file(filp);
|
||||
case F2FS_IOC_GET_DEV_ALIAS_FILE:
|
||||
return f2fs_ioc_get_dev_alias_file(filp, arg);
|
||||
case F2FS_IOC_IO_PRIO:
|
||||
return f2fs_ioc_io_prio(filp, arg);
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
@@ -5266,6 +5285,7 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
case F2FS_IOC_DECOMPRESS_FILE:
|
||||
case F2FS_IOC_COMPRESS_FILE:
|
||||
case F2FS_IOC_GET_DEV_ALIAS_FILE:
|
||||
case F2FS_IOC_IO_PRIO:
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24)
|
||||
#define F2FS_IOC_START_ATOMIC_REPLACE _IO(F2FS_IOCTL_MAGIC, 25)
|
||||
#define F2FS_IOC_GET_DEV_ALIAS_FILE _IOR(F2FS_IOCTL_MAGIC, 26, __u32)
|
||||
#define F2FS_IOC_IO_PRIO _IOW(F2FS_IOCTL_MAGIC, 27, __u32)
|
||||
|
||||
/*
|
||||
* should be same as XFS_IOC_GOINGDOWN.
|
||||
@@ -63,6 +64,12 @@
|
||||
#define F2FS_TRIM_FILE_ZEROOUT 0x2 /* zero out */
|
||||
#define F2FS_TRIM_FILE_MASK 0x3
|
||||
|
||||
/* for F2FS_IOC_IO_PRIO */
|
||||
enum {
|
||||
F2FS_IOPRIO_WRITE = 1, /* high write priority */
|
||||
F2FS_IOPRIO_MAX,
|
||||
};
|
||||
|
||||
struct f2fs_gc_range {
|
||||
__u32 sync;
|
||||
__u64 start;
|
||||
|
||||
Reference in New Issue
Block a user