]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - fs/btrfs/file.c
btrfs: add and use helpers for reading and writing fs_info->generation
[thirdparty/linux.git] / fs / btrfs / file.c
index 361535c71c0f5a172328832e32b6d00f7b14f131..723f0c70452e57d346aa0d8c6ad240edf427b321 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/uio.h>
 #include <linux/iversion.h>
 #include <linux/fsverity.h>
+#include <linux/iomap.h>
 #include "ctree.h"
 #include "disk-io.h"
 #include "transaction.h"
@@ -368,12 +369,13 @@ next_slot:
                        btrfs_set_file_extent_offset(leaf, fi, extent_offset);
                        btrfs_set_file_extent_num_bytes(leaf, fi,
                                                        extent_end - args->start);
-                       btrfs_mark_buffer_dirty(leaf);
+                       btrfs_mark_buffer_dirty(trans, leaf);
 
                        if (update_refs && disk_bytenr > 0) {
                                btrfs_init_generic_ref(&ref,
                                                BTRFS_ADD_DELAYED_REF,
-                                               disk_bytenr, num_bytes, 0);
+                                               disk_bytenr, num_bytes, 0,
+                                               root->root_key.objectid);
                                btrfs_init_data_ref(&ref,
                                                root->root_key.objectid,
                                                new_key.objectid,
@@ -405,13 +407,13 @@ next_slot:
 
                        memcpy(&new_key, &key, sizeof(new_key));
                        new_key.offset = args->end;
-                       btrfs_set_item_key_safe(fs_info, path, &new_key);
+                       btrfs_set_item_key_safe(trans, path, &new_key);
 
                        extent_offset += args->end - key.offset;
                        btrfs_set_file_extent_offset(leaf, fi, extent_offset);
                        btrfs_set_file_extent_num_bytes(leaf, fi,
                                                        extent_end - args->end);
-                       btrfs_mark_buffer_dirty(leaf);
+                       btrfs_mark_buffer_dirty(trans, leaf);
                        if (update_refs && disk_bytenr > 0)
                                args->bytes_found += args->end - key.offset;
                        break;
@@ -431,7 +433,7 @@ next_slot:
 
                        btrfs_set_file_extent_num_bytes(leaf, fi,
                                                        args->start - key.offset);
-                       btrfs_mark_buffer_dirty(leaf);
+                       btrfs_mark_buffer_dirty(trans, leaf);
                        if (update_refs && disk_bytenr > 0)
                                args->bytes_found += extent_end - args->start;
                        if (args->end == extent_end)
@@ -463,7 +465,8 @@ delete_extent_item:
                        } else if (update_refs && disk_bytenr > 0) {
                                btrfs_init_generic_ref(&ref,
                                                BTRFS_DROP_DELAYED_REF,
-                                               disk_bytenr, num_bytes, 0);
+                                               disk_bytenr, num_bytes, 0,
+                                               root->root_key.objectid);
                                btrfs_init_data_ref(&ref,
                                                root->root_key.objectid,
                                                key.objectid,
@@ -536,7 +539,8 @@ delete_extent_item:
                        if (btrfs_comp_cpu_keys(&key, &slot_key) > 0)
                                path->slots[0]++;
                }
-               btrfs_setup_item_for_insert(root, path, &key, args->extent_item_size);
+               btrfs_setup_item_for_insert(trans, root, path, &key,
+                                           args->extent_item_size);
                args->extent_inserted = true;
        }
 
@@ -593,7 +597,6 @@ static int extent_mergeable(struct extent_buffer *leaf, int slot,
 int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
                              struct btrfs_inode *inode, u64 start, u64 end)
 {
-       struct btrfs_fs_info *fs_info = trans->fs_info;
        struct btrfs_root *root = inode->root;
        struct extent_buffer *leaf;
        struct btrfs_path *path;
@@ -664,7 +667,7 @@ again:
                                     ino, bytenr, orig_offset,
                                     &other_start, &other_end)) {
                        new_key.offset = end;
-                       btrfs_set_item_key_safe(fs_info, path, &new_key);
+                       btrfs_set_item_key_safe(trans, path, &new_key);
                        fi = btrfs_item_ptr(leaf, path->slots[0],
                                            struct btrfs_file_extent_item);
                        btrfs_set_file_extent_generation(leaf, fi,
@@ -679,7 +682,7 @@ again:
                                                         trans->transid);
                        btrfs_set_file_extent_num_bytes(leaf, fi,
                                                        end - other_start);
-                       btrfs_mark_buffer_dirty(leaf);
+                       btrfs_mark_buffer_dirty(trans, leaf);
                        goto out;
                }
        }
@@ -698,7 +701,7 @@ again:
                                                         trans->transid);
                        path->slots[0]++;
                        new_key.offset = start;
-                       btrfs_set_item_key_safe(fs_info, path, &new_key);
+                       btrfs_set_item_key_safe(trans, path, &new_key);
 
                        fi = btrfs_item_ptr(leaf, path->slots[0],
                                            struct btrfs_file_extent_item);
@@ -708,7 +711,7 @@ again:
                                                        other_end - start);
                        btrfs_set_file_extent_offset(leaf, fi,
                                                     start - orig_offset);
-                       btrfs_mark_buffer_dirty(leaf);
+                       btrfs_mark_buffer_dirty(trans, leaf);
                        goto out;
                }
        }
@@ -742,10 +745,10 @@ again:
                btrfs_set_file_extent_offset(leaf, fi, split - orig_offset);
                btrfs_set_file_extent_num_bytes(leaf, fi,
                                                extent_end - split);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
 
                btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF, bytenr,
-                                      num_bytes, 0);
+                                      num_bytes, 0, root->root_key.objectid);
                btrfs_init_data_ref(&ref, root->root_key.objectid, ino,
                                    orig_offset, 0, false);
                ret = btrfs_inc_extent_ref(trans, &ref);
@@ -771,7 +774,7 @@ again:
        other_start = end;
        other_end = 0;
        btrfs_init_generic_ref(&ref, BTRFS_DROP_DELAYED_REF, bytenr,
-                              num_bytes, 0);
+                              num_bytes, 0, root->root_key.objectid);
        btrfs_init_data_ref(&ref, root->root_key.objectid, ino, orig_offset,
                            0, false);
        if (extent_mergeable(leaf, path->slots[0] + 1,
@@ -814,7 +817,7 @@ again:
                btrfs_set_file_extent_type(leaf, fi,
                                           BTRFS_FILE_EXTENT_REG);
                btrfs_set_file_extent_generation(leaf, fi, trans->transid);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
        } else {
                fi = btrfs_item_ptr(leaf, del_slot - 1,
                           struct btrfs_file_extent_item);
@@ -823,7 +826,7 @@ again:
                btrfs_set_file_extent_generation(leaf, fi, trans->transid);
                btrfs_set_file_extent_num_bytes(leaf, fi,
                                                extent_end - key.offset);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
 
                ret = btrfs_del_items(trans, root, path, del_slot, del_nr);
                if (ret < 0) {
@@ -1746,7 +1749,7 @@ static inline bool skip_inode_logging(const struct btrfs_log_ctx *ctx)
        struct btrfs_inode *inode = BTRFS_I(ctx->inode);
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
 
-       if (btrfs_inode_in_log(inode, fs_info->generation) &&
+       if (btrfs_inode_in_log(inode, btrfs_get_fs_generation(fs_info)) &&
            list_empty(&ctx->ordered_extents))
                return true;
 
@@ -2104,7 +2107,7 @@ static int fill_holes(struct btrfs_trans_handle *trans,
                btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes);
                btrfs_set_file_extent_offset(leaf, fi, 0);
                btrfs_set_file_extent_generation(leaf, fi, trans->transid);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
                goto out;
        }
 
@@ -2112,7 +2115,7 @@ static int fill_holes(struct btrfs_trans_handle *trans,
                u64 num_bytes;
 
                key.offset = offset;
-               btrfs_set_item_key_safe(fs_info, path, &key);
+               btrfs_set_item_key_safe(trans, path, &key);
                fi = btrfs_item_ptr(leaf, path->slots[0],
                                    struct btrfs_file_extent_item);
                num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + end -
@@ -2121,7 +2124,7 @@ static int fill_holes(struct btrfs_trans_handle *trans,
                btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes);
                btrfs_set_file_extent_offset(leaf, fi, 0);
                btrfs_set_file_extent_generation(leaf, fi, trans->transid);
-               btrfs_mark_buffer_dirty(leaf);
+               btrfs_mark_buffer_dirty(trans, leaf);
                goto out;
        }
        btrfs_release_path(path);
@@ -2273,7 +2276,7 @@ static int btrfs_insert_replace_extent(struct btrfs_trans_handle *trans,
        btrfs_set_file_extent_num_bytes(leaf, extent, replace_len);
        if (extent_info->is_new_extent)
                btrfs_set_file_extent_generation(leaf, extent, trans->transid);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
        btrfs_release_path(path);
 
        ret = btrfs_inode_set_file_extent_range(inode, extent_info->file_offset,
@@ -2303,7 +2306,8 @@ static int btrfs_insert_replace_extent(struct btrfs_trans_handle *trans,
 
                btrfs_init_generic_ref(&ref, BTRFS_ADD_DELAYED_REF,
                                       extent_info->disk_offset,
-                                      extent_info->disk_len, 0);
+                                      extent_info->disk_len, 0,
+                                      root->root_key.objectid);
                ref_offset = extent_info->file_offset - extent_info->data_offset;
                btrfs_init_data_ref(&ref, root->root_key.objectid,
                                    btrfs_ino(inode), ref_offset, 0, false);
@@ -2475,7 +2479,7 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
                if (!extent_info || extent_info->update_times)
                        inode->vfs_inode.i_mtime = inode_set_ctime_current(&inode->vfs_inode);
 
-               ret = btrfs_update_inode(trans, root, inode);
+               ret = btrfs_update_inode(trans, inode);
                if (ret)
                        break;
 
@@ -2715,7 +2719,7 @@ static int btrfs_punch_hole(struct file *file, loff_t offset, loff_t len)
        ASSERT(trans != NULL);
        inode_inc_iversion(inode);
        inode->i_mtime = inode_set_ctime_current(inode);
-       ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
+       ret = btrfs_update_inode(trans, BTRFS_I(inode));
        updated_inode = true;
        btrfs_end_transaction(trans);
        btrfs_btree_balance_dirty(fs_info);
@@ -2741,7 +2745,7 @@ out_only_mutex:
                } else {
                        int ret2;
 
-                       ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
+                       ret = btrfs_update_inode(trans, BTRFS_I(inode));
                        ret2 = btrfs_end_transaction(trans);
                        if (!ret)
                                ret = ret2;
@@ -2808,7 +2812,7 @@ static int btrfs_fallocate_update_isize(struct inode *inode,
        inode_set_ctime_current(inode);
        i_size_write(inode, end);
        btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), 0);
-       ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
+       ret = btrfs_update_inode(trans, BTRFS_I(inode));
        ret2 = btrfs_end_transaction(trans);
 
        return ret ? ret : ret2;