]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: add large folios support for moving extents
authorZhang Yi <yi.zhang@huawei.com>
Mon, 13 Oct 2025 01:51:27 +0000 (09:51 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 6 Nov 2025 15:44:39 +0000 (10:44 -0500)
Pass the moving extent length into mext_folio_double_lock() so that it
can acquire a higher-order folio if the length exceeds PAGE_SIZE. This
can speed up extent moving when the extent is larger than one page.
Additionally, remove the unnecessary comments from
mext_folio_double_lock().

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Message-ID: <20251013015128.499308-12-yi.zhang@huaweicloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/move_extent.c

index 933c2afed550507795e8bd5163c297062047de33..f04755c2165ac11915419736f8b3ceca56d34afe 100644 (file)
@@ -54,23 +54,14 @@ ext4_double_up_write_data_sem(struct inode *orig_inode,
        up_write(&EXT4_I(donor_inode)->i_data_sem);
 }
 
-/**
- * mext_folio_double_lock - Grab and lock folio on both @inode1 and @inode2
- *
- * @inode1:    the inode structure
- * @inode2:    the inode structure
- * @index1:    folio index
- * @index2:    folio index
- * @folio:     result folio vector
- *
- * Grab two locked folio for inode's by inode order
- */
-static int
-mext_folio_double_lock(struct inode *inode1, struct inode *inode2,
-                     pgoff_t index1, pgoff_t index2, struct folio *folio[2])
+/* Grab and lock folio on both @inode1 and @inode2 by inode order. */
+static int mext_folio_double_lock(struct inode *inode1, struct inode *inode2,
+                                 pgoff_t index1, pgoff_t index2, size_t len,
+                                 struct folio *folio[2])
 {
        struct address_space *mapping[2];
        unsigned int flags;
+       fgf_t fgp_flags = FGP_WRITEBEGIN;
 
        BUG_ON(!inode1 || !inode2);
        if (inode1 < inode2) {
@@ -83,14 +74,15 @@ mext_folio_double_lock(struct inode *inode1, struct inode *inode2,
        }
 
        flags = memalloc_nofs_save();
-       folio[0] = __filemap_get_folio(mapping[0], index1, FGP_WRITEBEGIN,
+       fgp_flags |= fgf_set_order(len);
+       folio[0] = __filemap_get_folio(mapping[0], index1, fgp_flags,
                        mapping_gfp_mask(mapping[0]));
        if (IS_ERR(folio[0])) {
                memalloc_nofs_restore(flags);
                return PTR_ERR(folio[0]);
        }
 
-       folio[1] = __filemap_get_folio(mapping[1], index2, FGP_WRITEBEGIN,
+       folio[1] = __filemap_get_folio(mapping[1], index2, fgp_flags,
                        mapping_gfp_mask(mapping[1]));
        memalloc_nofs_restore(flags);
        if (IS_ERR(folio[1])) {
@@ -214,7 +206,8 @@ static int mext_move_begin(struct mext_data *mext, struct folio *folio[2],
        orig_pos = ((loff_t)mext->orig_map.m_lblk) << blkbits;
        donor_pos = ((loff_t)mext->donor_lblk) << blkbits;
        ret = mext_folio_double_lock(orig_inode, donor_inode,
-                       orig_pos >> PAGE_SHIFT, donor_pos >> PAGE_SHIFT, folio);
+                       orig_pos >> PAGE_SHIFT, donor_pos >> PAGE_SHIFT,
+                       ((size_t)mext->orig_map.m_len) << blkbits, folio);
        if (ret)
                return ret;