Merge tag 'trace-v6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux...
[sfrench/cifs-2.6.git] / fs / f2fs / node.c
index 9b546fd2101004c306d83bb5a33a11e53a88b7c7..b3de6d6cdb02199c13808bfaabbc8e742b52a067 100644 (file)
@@ -852,21 +852,29 @@ int f2fs_get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
 
        if (is_inode_flag_set(dn->inode, FI_COMPRESSED_FILE) &&
                                        f2fs_sb_has_readonly(sbi)) {
-               unsigned int c_len = f2fs_cluster_blocks_are_contiguous(dn);
+               unsigned int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
+               unsigned int ofs_in_node = dn->ofs_in_node;
+               pgoff_t fofs = index;
+               unsigned int c_len;
                block_t blkaddr;
 
+               /* should align fofs and ofs_in_node to cluster_size */
+               if (fofs % cluster_size) {
+                       fofs = round_down(fofs, cluster_size);
+                       ofs_in_node = round_down(ofs_in_node, cluster_size);
+               }
+
+               c_len = f2fs_cluster_blocks_are_contiguous(dn, ofs_in_node);
                if (!c_len)
                        goto out;
 
-               blkaddr = f2fs_data_blkaddr(dn);
+               blkaddr = data_blkaddr(dn->inode, dn->node_page, ofs_in_node);
                if (blkaddr == COMPRESS_ADDR)
                        blkaddr = data_blkaddr(dn->inode, dn->node_page,
-                                               dn->ofs_in_node + 1);
+                                               ofs_in_node + 1);
 
                f2fs_update_read_extent_tree_range_compressed(dn->inode,
-                                       index, blkaddr,
-                                       F2FS_I(dn->inode)->i_cluster_size,
-                                       c_len);
+                                       fofs, blkaddr, cluster_size, c_len);
        }
 out:
        return 0;
@@ -1919,7 +1927,7 @@ void f2fs_flush_inline_data(struct f2fs_sb_info *sbi)
                for (i = 0; i < nr_folios; i++) {
                        struct page *page = &fbatch.folios[i]->page;
 
-                       if (!IS_DNODE(page))
+                       if (!IS_INODE(page))
                                continue;
 
                        lock_page(page);
@@ -2841,7 +2849,7 @@ int f2fs_restore_node_summary(struct f2fs_sb_info *sbi,
        int i, idx, last_offset, nrpages;
 
        /* scan the node segment */
-       last_offset = sbi->blocks_per_seg;
+       last_offset = BLKS_PER_SEG(sbi);
        addr = START_BLOCK(sbi, segno);
        sum_entry = &sum->entries[0];
 
@@ -3158,7 +3166,7 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
        if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG))
                return 0;
 
-       nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg -
+       nat_bits_addr = __start_cp_addr(sbi) + BLKS_PER_SEG(sbi) -
                                                nm_i->nat_bits_blocks;
        for (i = 0; i < nm_i->nat_bits_blocks; i++) {
                struct page *page;