lkml.org 
[lkml]   [2022]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 7/7] f2fs: support STATX_IOALIGN
    Date
    From: Eric Biggers <ebiggers@google.com>

    Add support for STATX_IOALIGN to f2fs, so that I/O alignment information
    is exposed to userspace in a consistent and easy-to-use way.

    Signed-off-by: Eric Biggers <ebiggers@google.com>
    ---
    fs/f2fs/file.c | 31 +++++++++++++++++++++++++++++++
    1 file changed, 31 insertions(+)

    diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
    index 9cc985258f17e..334d363a7b8c5 100644
    --- a/fs/f2fs/file.c
    +++ b/fs/f2fs/file.c
    @@ -835,6 +835,21 @@ static bool f2fs_force_buffered_io(struct inode *inode)
    return false;
    }

    +/* Return the maximum value of io_opt across all the filesystem's devices. */
    +static unsigned int f2fs_max_io_opt(struct inode *inode)
    +{
    + struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
    + int io_opt = 0;
    + int i;
    +
    + if (!f2fs_is_multi_device(sbi))
    + return bdev_io_opt(sbi->sb->s_bdev);
    +
    + for (i = 0; i < sbi->s_ndevs; i++)
    + io_opt = max(io_opt, bdev_io_opt(FDEV(i).bdev));
    + return io_opt;
    +}
    +
    int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
    struct kstat *stat, u32 request_mask, unsigned int query_flags)
    {
    @@ -851,6 +866,22 @@ int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
    stat->btime.tv_nsec = fi->i_crtime.tv_nsec;
    }

    + /*
    + * Return the I/O alignment information if requested. We only return
    + * this information when requested, since on encrypted files it might
    + * take a fair bit of work to get if the file wasn't opened recently.
    + */
    + if ((request_mask & STATX_IOALIGN) && S_ISREG(inode->i_mode)) {
    + unsigned int bsize = i_blocksize(inode);
    +
    + stat->result_mask |= STATX_IOALIGN;
    + if (!f2fs_force_buffered_io(inode)) {
    + stat->mem_align_dio = bsize;
    + stat->offset_align_dio = bsize;
    + }
    + stat->offset_align_optimal = max(f2fs_max_io_opt(inode), bsize);
    + }
    +
    flags = fi->i_flags;
    if (flags & F2FS_COMPR_FL)
    stat->attributes |= STATX_ATTR_COMPRESSED;
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-02-11 07:15    [W:4.885 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site