]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ocfs2: support large folios in ocfs2_zero_cluster_folios()
authorMark Tinguely <mark.tinguely@oracle.com>
Thu, 5 Dec 2024 17:16:50 +0000 (17:16 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 13 Jan 2025 04:21:14 +0000 (20:21 -0800)
Remove assumptions that a folio is one page in size.

Link: https://lkml.kernel.org/r/20241205171653.3179945-23-willy@infradead.org
Signed-off-by: Mark Tinguely <mark.tinguely@oracle.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Jun Piao <piaojun@huawei.com>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Mark Fasheh <mark@fasheh.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/ocfs2/alloc.c

index 453be2d2c124a7d37b80f6f0bda41d0202316855..5cf698785faeee8920662245d82061e963be0225 100644 (file)
@@ -6851,7 +6851,6 @@ static void ocfs2_zero_cluster_folios(struct inode *inode, loff_t start,
                u64 phys, handle_t *handle)
 {
        int i;
-       unsigned int from, to = PAGE_SIZE;
        struct super_block *sb = inode->i_sb;
 
        BUG_ON(!ocfs2_sparse_alloc(OCFS2_SB(sb)));
@@ -6859,21 +6858,18 @@ static void ocfs2_zero_cluster_folios(struct inode *inode, loff_t start,
        if (numfolios == 0)
                goto out;
 
-       to = PAGE_SIZE;
        for (i = 0; i < numfolios; i++) {
                struct folio *folio = folios[i];
+               size_t to = folio_size(folio);
+               size_t from = offset_in_folio(folio, start);
 
-               from = start & (PAGE_SIZE - 1);
-               if ((end >> PAGE_SHIFT) == folio->index)
-                       to = end & (PAGE_SIZE - 1);
-
-               BUG_ON(from > PAGE_SIZE);
-               BUG_ON(to > PAGE_SIZE);
+               if (to > end - folio_pos(folio))
+                       to = end - folio_pos(folio);
 
                ocfs2_map_and_dirty_folio(inode, handle, from, to, folio, 1,
                                &phys);
 
-               start = (folio->index + 1) << PAGE_SHIFT;
+               start = folio_next_index(folio) << PAGE_SHIFT;
        }
 out:
        if (folios)