On Fri, May 15, 2020 at 06:16:27AM -0700, Matthew Wilcox wrote:
> From: "Matthew Wilcox (Oracle)" <wi...@infradead.org>
> 
> The page cache needs to know whether the filesystem supports pages >
> PAGE_SIZE.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
> ---
>  include/linux/fs.h      | 1 +
>  include/linux/pagemap.h | 5 +++++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 55c743925c40..777783c8760b 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2241,6 +2241,7 @@ struct file_system_type {
>  #define FS_HAS_SUBTYPE               4
>  #define FS_USERNS_MOUNT              8       /* Can be mounted by userns 
> root */
>  #define FS_DISALLOW_NOTIFY_PERM      16      /* Disable fanotify permission 
> events */
> +#define FS_LARGE_PAGES               8192    /* Remove once all fs converted 
> */
>  #define FS_RENAME_DOES_D_MOVE        32768   /* FS will handle d_move() 
> during rename() internally. */
>       int (*init_fs_context)(struct fs_context *);
>       const struct fs_parameter_spec *parameters;
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 36bfc9d855bb..c6db74b5e62f 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -116,6 +116,11 @@ static inline void mapping_set_gfp_mask(struct 
> address_space *m, gfp_t mask)
>       m->gfp_mask = mask;
>  }
>  
> +static inline bool mapping_large_pages(struct address_space *mapping)
> +{
> +     return mapping->host->i_sb->s_type->fs_flags & FS_LARGE_PAGES;
> +}

If you've got to dereference 4 layers deep to check a behaviour
flag, the object needs it's own flag.  Can you just propagate this
to the address space when the inode is instantiated and the address
space initialised?

Cheers,

Dave.
-- 
Dave Chinner
da...@fromorbit.com

Reply via email to