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

Reply via email to