We have a pwritev2(2) interface based on passing in flags. Add an fcntl interface for querying these flags, and also for setting them as well: F_GET_WRITE_LIFE Returns one of the valid type of write hints, like WRITE_HINT_MEDIUM. F_SET_WRITE_LIFE Pass in a WRITE_HINT_* type to set the write life time hint for this file/inode. Returns 0 on succes, -1 otherwise. Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- fs/fcntl.c | 38 ++++++++++++++++++++++++++++++++++++++ include/uapi/linux/fcntl.h | 6 ++++++ 2 files changed, 44 insertions(+) diff --git a/fs/fcntl.c b/fs/fcntl.c index f4e7267d117f..f89fef847f73 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -243,6 +243,40 @@ static int f_getowner_uids(struct file *filp, unsigned long arg) } #endif +long fcntl_write_life(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct inode *inode = file_inode(file); + long ret; + + switch (cmd) { + case F_GET_WRITE_LIFE: + ret = mask_to_write_hint(inode->i_flags, S_WRITE_LIFE_SHIFT); + break; + case F_SET_WRITE_LIFE: { + enum write_hint hint = arg; + + switch (hint) { + case WRITE_HINT_NONE: + case WRITE_HINT_SHORT: + case WRITE_HINT_MEDIUM: + case WRITE_HINT_LONG: + case WRITE_HINT_EXTREME: + inode_set_write_hint(inode, hint); + ret = 0; + break; + default: + ret = -EINVAL; + } + break; + } + default: + ret = -EINVAL; + break; + } + + return ret; +} + static long do_fcntl(int fd, unsigned int cmd, unsigned long arg, struct file *filp) { @@ -337,6 +371,10 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg, case F_GET_SEALS: err = shmem_fcntl(filp, cmd, arg); break; + case F_GET_WRITE_LIFE: + case F_SET_WRITE_LIFE: + err = fcntl_write_life(filp, cmd, arg); + break; default: break; } diff --git a/include/uapi/linux/fcntl.h b/include/uapi/linux/fcntl.h index 813afd6eee71..1c5b2a95e9c9 100644 --- a/include/uapi/linux/fcntl.h +++ b/include/uapi/linux/fcntl.h @@ -43,6 +43,12 @@ /* (1U << 31) is reserved for signed error codes */ /* + * Set/Get write life time hints + */ +#define F_GET_WRITE_LIFE (F_LINUX_SPECIFIC_BASE + 11) +#define F_SET_WRITE_LIFE (F_LINUX_SPECIFIC_BASE + 20) + +/* * Types of directory notifications that may be requested. */ #define DN_ACCESS 0x00000001 /* File accessed */ -- 2.7.4