On 06/13/2017 01:36 PM, Andreas Dilger wrote:
> On Jun 13, 2017, at 11:15 AM, Jens Axboe <[email protected]> wrote:
>>
>> Add four flags for the pwritev2(2) system call, allowing an application
>> to give the kernel a hint about what on-media life times can be
>> expected from a given write.
>>
>> The intent is for these values to be relative to each other, no
>> absolute meaning should be attached to these flag names.
>>
>> Define IOCB flags to carry this information over, and finally
>> transform them into the block defined stream values.
>>
>> Signed-off-by: Jens Axboe <[email protected]>
>> ---
>> fs/read_write.c | 17 ++++++++++++++++-
>> include/linux/fs.h | 18 ++++++++++++++++++
>> include/uapi/linux/fs.h | 4 ++++
>> 3 files changed, 38 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/read_write.c b/fs/read_write.c
>> index 47c1d4484df9..1734728aa48b 100644
>> --- a/fs/read_write.c
>> +++ b/fs/read_write.c
>> @@ -678,7 +678,9 @@ static ssize_t do_iter_readv_writev(struct file *filp,
>> struct iov_iter *iter,
>> struct kiocb kiocb;
>> ssize_t ret;
>>
>> - if (flags & ~(RWF_HIPRI | RWF_DSYNC | RWF_SYNC))
>> + if (flags & ~(RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_WRITE_LIFE_SHORT |
>> + RWF_WRITE_LIFE_MEDIUM | RWF_WRITE_LIFE_LONG |
>> + RWF_WRITE_LIFE_EXTREME))
>> return -EOPNOTSUPP;
>
> Since this is essentially just a 4-bit mask, which also works fine if the
> stream
> ID is an arbitrary value, it would be more clear to just define a mask like
> RWF_WRITE_LIFE_MASK that covers these bits instead of spelling out individual
> bits.
I almost defined a RWF_VALID_FLAGS mask to cover them all. How's that? I don't
think
we should split these out separately, if we don't have to.
>> @@ -688,6 +690,19 @@ static ssize_t do_iter_readv_writev(struct file *filp,
>> struct iov_iter *iter,
>> kiocb.ki_flags |= IOCB_DSYNC;
>> if (flags & RWF_SYNC)
>> kiocb.ki_flags |= (IOCB_DSYNC | IOCB_SYNC);
>> + if (flags & RWF_WRITE_LIFE_SHORT) {
>> + kiocb.ki_flags |= IOCB_WRITE_LIFE_SHORT;
>> + file_inode(filp)->i_stream = WRITE_LIFE_SHORT;
>> + } else if (flags & RWF_WRITE_LIFE_MEDIUM) {
>> + kiocb.ki_flags |= IOCB_WRITE_LIFE_MEDIUM;
>> + file_inode(filp)->i_stream = WRITE_LIFE_MEDIUM;
>> + } else if (flags & RWF_WRITE_LIFE_LONG) {
>> + kiocb.ki_flags |= IOCB_WRITE_LIFE_LONG;
>> + file_inode(filp)->i_stream = WRITE_LIFE_LONG;
>> + } else if (flags & RWF_WRITE_LIFE_EXTREME) {
>> + kiocb.ki_flags |= IOCB_WRITE_LIFE_EXTREME;
>> + file_inode(filp)->i_stream = WRITE_LIFE_EXTREME;
>> + }
>
> This should just pass all of the bits through:
>
> if (flags & RWF_WRITE_LIFE_MASK) {
> file_inode(filp)->i_stream =
> ((flags & RWF_WRITE_LIFE_MASK) >> RWF_WRITE_LIFE_SHIFT;
> kiocb.ki_flags |=
> file_inode(filp)->i_stream << IOCB_WRITE_LIFE_SHIFT;
> }
Agree, that's the nice benefit of rolling them into one, it'll make the code
more efficient too. OK, let me get that done...
--
Jens Axboe