]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - fs/f2fs/extent_cache.c
f2fs: extent cache: support unaligned extent
[mirror_ubuntu-jammy-kernel.git] / fs / f2fs / extent_cache.c
index 3ebf976a682d56a9ddf10de973d4c1a6e8a70dac..b120589d8517e2ecf0124f348fef9f913a32b296 100644 (file)
@@ -661,6 +661,47 @@ static void f2fs_update_extent_tree_range(struct inode *inode,
                f2fs_mark_inode_dirty_sync(inode, true);
 }
 
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+void f2fs_update_extent_tree_range_compressed(struct inode *inode,
+                               pgoff_t fofs, block_t blkaddr, unsigned int llen,
+                               unsigned int c_len)
+{
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       struct extent_tree *et = F2FS_I(inode)->extent_tree;
+       struct extent_node *en = NULL;
+       struct extent_node *prev_en = NULL, *next_en = NULL;
+       struct extent_info ei;
+       struct rb_node **insert_p = NULL, *insert_parent = NULL;
+       bool leftmost = false;
+
+       trace_f2fs_update_extent_tree_range(inode, fofs, blkaddr, llen);
+
+       /* it is safe here to check FI_NO_EXTENT w/o et->lock in ro image */
+       if (is_inode_flag_set(inode, FI_NO_EXTENT))
+               return;
+
+       write_lock(&et->lock);
+
+       en = (struct extent_node *)f2fs_lookup_rb_tree_ret(&et->root,
+                               (struct rb_entry *)et->cached_en, fofs,
+                               (struct rb_entry **)&prev_en,
+                               (struct rb_entry **)&next_en,
+                               &insert_p, &insert_parent, false,
+                               &leftmost);
+       if (en)
+               goto unlock_out;
+
+       set_extent_info(&ei, fofs, blkaddr, llen);
+       ei.c_len = c_len;
+
+       if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
+               __insert_extent_tree(sbi, et, &ei,
+                               insert_p, insert_parent, leftmost);
+unlock_out:
+       write_unlock(&et->lock);
+}
+#endif
+
 unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink)
 {
        struct extent_tree *et, *next;