]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
nfs: add support for large folios
authorChristoph Hellwig <hch@lst.de>
Mon, 27 May 2024 16:36:09 +0000 (18:36 +0200)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 14:55:39 +0000 (10:55 -0400)
NFS already is void of folio size assumption, so just pass the chunk size
to __filemap_get_folio and set the large folio address_space flag for all
regular files.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/file.c
fs/nfs/inode.c

index 6bd127e6683dcef2bef33ec721821e787c10098d..7f1295475a90fd34d8159b02c9f2b4d5182f9b24 100644 (file)
@@ -339,6 +339,7 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
                           loff_t pos, unsigned len, struct page **pagep,
                           void **fsdata)
 {
+       fgf_t fgp = FGP_WRITEBEGIN;
        struct folio *folio;
        int once_thru = 0;
        int ret;
@@ -346,8 +347,9 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
        dfprintk(PAGECACHE, "NFS: write_begin(%pD2(%lu), %u@%lld)\n",
                file, mapping->host->i_ino, len, (long long) pos);
 
+       fgp |= fgf_set_order(len);
 start:
-       folio = __filemap_get_folio(mapping, pos >> PAGE_SHIFT, FGP_WRITEBEGIN,
+       folio = __filemap_get_folio(mapping, pos >> PAGE_SHIFT, fgp,
                                    mapping_gfp_mask(mapping));
        if (IS_ERR(folio))
                return PTR_ERR(folio);
index acef52ecb1bb7ee01ff448f0c066d4bc1c9df932..6d185af4cb29d4b5b9d459b382a9e393d34183b5 100644 (file)
@@ -491,6 +491,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
                        inode->i_fop = NFS_SB(sb)->nfs_client->rpc_ops->file_ops;
                        inode->i_data.a_ops = &nfs_file_aops;
                        nfs_inode_init_regular(nfsi);
+                       mapping_set_large_folios(inode->i_mapping);
                } else if (S_ISDIR(inode->i_mode)) {
                        inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->dir_inode_ops;
                        inode->i_fop = &nfs_dir_operations;