]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: add helper to truncate inode items when logging inode
authorFilipe Manana <fdmanana@suse.com>
Tue, 31 Aug 2021 14:30:36 +0000 (15:30 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 26 Oct 2021 17:08:00 +0000 (19:08 +0200)
Move the call to btrfs_truncate_inode_items(), and the surrounding retry
loop, into a local helper function. This avoids some repetition and avoids
making the next change a bit awkward due to a bit of too much indentation.

This patch is part of a patch set comprised of the following patches:

  btrfs: check if a log tree exists at inode_logged()
  btrfs: remove no longer needed checks for NULL log context
  btrfs: do not log new dentries when logging that a new name exists
  btrfs: always update the logged transaction when logging new names
  btrfs: avoid expensive search when dropping inode items from log
  btrfs: add helper to truncate inode items when logging inode
  btrfs: avoid expensive search when truncating inode items from the log
  btrfs: avoid search for logged i_size when logging inode if possible
  btrfs: avoid attempt to drop extents when logging inode for the first time
  btrfs: do not commit delayed inode when logging a file in full sync mode

This is patch 6/10 and test results are listed in the change log of the
last patch in the set.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 39648f4048bc7b7f3137eb40b95e2688da66d004..2d92187a127374631f078397d1941ce2611b4305 100644 (file)
@@ -3937,6 +3937,21 @@ static int drop_inode_items(struct btrfs_trans_handle *trans,
        return ret;
 }
 
+static int truncate_inode_items(struct btrfs_trans_handle *trans,
+                               struct btrfs_root *log_root,
+                               struct btrfs_inode *inode,
+                               u64 new_size, u32 min_type)
+{
+       int ret;
+
+       do {
+               ret = btrfs_truncate_inode_items(trans, log_root, inode,
+                                                new_size, min_type, NULL);
+       } while (ret == -EAGAIN);
+
+       return ret;
+}
+
 static void fill_inode_item(struct btrfs_trans_handle *trans,
                            struct extent_buffer *leaf,
                            struct btrfs_inode_item *item,
@@ -4525,13 +4540,9 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans,
                         * Avoid logging extent items logged in past fsync calls
                         * and leading to duplicate keys in the log tree.
                         */
-                       do {
-                               ret = btrfs_truncate_inode_items(trans,
-                                                        root->log_root,
-                                                        inode, truncate_offset,
-                                                        BTRFS_EXTENT_DATA_KEY,
-                                                        NULL);
-                       } while (ret == -EAGAIN);
+                       ret = truncate_inode_items(trans, root->log_root, inode,
+                                                  truncate_offset,
+                                                  BTRFS_EXTENT_DATA_KEY);
                        if (ret)
                                goto out;
                        dropped_extents = true;
@@ -5477,12 +5488,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
                                          &inode->runtime_flags);
                                clear_bit(BTRFS_INODE_COPY_EVERYTHING,
                                          &inode->runtime_flags);
-                               while(1) {
-                                       ret = btrfs_truncate_inode_items(trans,
-                                               log, inode, 0, 0, NULL);
-                                       if (ret != -EAGAIN)
-                                               break;
-                               }
+                               ret = truncate_inode_items(trans, log, inode, 0, 0);
                        }
                } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
                                              &inode->runtime_flags) ||