Btrfs: Optimize tree log block allocations
authorChris Mason <chris.mason@oracle.com>
Thu, 11 Sep 2008 19:54:42 +0000 (15:54 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:07 +0000 (11:04 -0400)
Since tree log blocks get freed every transaction, they never really
need to be written to disk.  This skips the step where we update
metadata to record they were allocated.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/tree-log.c

index 7c06eb4ecfddf94779496844cf9643cb22b0e42b..5edb7f885799b46920124d430661be21087e6a0a 100644 (file)
@@ -829,9 +829,8 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
        WARN_ON(btrfs_header_level(eb) != 0);
        WARN_ON(btrfs_header_nritems(eb) != 0);
 
-       ret = btrfs_free_extent(trans, fs_info->tree_root,
-                               eb->start, eb->len,
-                               BTRFS_TREE_LOG_OBJECTID, 0, 0, 0, 1);
+       ret = btrfs_free_reserved_extent(fs_info->tree_root,
+                               eb->start, eb->len);
        BUG_ON(ret);
 
        free_extent_buffer(eb);
index 3181759da1cfab72ed02f1de5253dd922e678d99..c479d71e2869cb7acae651a040c7dbee1d74be19 100644 (file)
@@ -1872,8 +1872,15 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
                return 0;
        }
        /* if metadata always pin */
-       if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID)
+       if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID) {
+               if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
+                       /* btrfs_free_reserved_extent */
+                       set_extent_dirty(&root->fs_info->free_space_cache,
+                                bytenr, bytenr + num_bytes - 1, GFP_NOFS);
+                       return 0;
+               }
                pin = 1;
+       }
 
        /* if data pin when any transaction has committed this */
        if (ref_generation != trans->transid)
@@ -2361,11 +2368,13 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
                                     min_alloc_size, empty_size, hint_byte,
                                     search_end, ins, data);
        BUG_ON(ret);
-       ret = __btrfs_alloc_reserved_extent(trans, root, root_objectid,
-                                           ref_generation, owner,
-                                           owner_offset, ins);
-       BUG_ON(ret);
+       if (root_objectid != BTRFS_TREE_LOG_OBJECTID) {
+               ret = __btrfs_alloc_reserved_extent(trans, root, root_objectid,
+                                                   ref_generation, owner,
+                                                   owner_offset, ins);
+               BUG_ON(ret);
 
+       }
        maybe_unlock_mutex(root);
        return ret;
 }
index f43ee33ec2dc485abe241c19700d08e02dcc4257..5f77bee0f8469207231f4418bd36777e8081a597 100644 (file)
@@ -1728,9 +1728,8 @@ static int noinline walk_down_log_tree(struct btrfs_trans_handle *trans,
 
                                WARN_ON(root_owner !=
                                        BTRFS_TREE_LOG_OBJECTID);
-                               ret = btrfs_free_extent(trans, root, bytenr,
-                                                       blocksize, root_owner,
-                                                       root_gen, 0, 0, 1);
+                               ret = btrfs_free_reserved_extent(root,
+                                                        bytenr, blocksize);
                                BUG_ON(ret);
                        }
                        free_extent_buffer(next);
@@ -1775,8 +1774,7 @@ static int noinline walk_down_log_tree(struct btrfs_trans_handle *trans,
                        BUG_ON(ret);
                }
                WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
-               ret = btrfs_free_extent(trans, root, bytenr, blocksize,
-                                         root_owner, root_gen, 0, 0, 1);
+               ret = btrfs_free_reserved_extent(root, bytenr, blocksize);
                BUG_ON(ret);
        }
        free_extent_buffer(path->nodes[*level]);
@@ -1837,10 +1835,9 @@ static int noinline walk_up_log_tree(struct btrfs_trans_handle *trans,
                                }
 
                                WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
-                               ret = btrfs_free_extent(trans, root,
+                               ret = btrfs_free_reserved_extent(root,
                                                path->nodes[*level]->start,
-                                               path->nodes[*level]->len,
-                                               root_owner, root_gen, 0, 0, 1);
+                                               path->nodes[*level]->len);
                                BUG_ON(ret);
                        }
                        free_extent_buffer(path->nodes[*level]);
@@ -1910,11 +1907,8 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
                        }
                        WARN_ON(log->root_key.objectid !=
                                BTRFS_TREE_LOG_OBJECTID);
-                       ret = btrfs_free_extent(trans, log,
-                                               next->start, next->len,
-                                               log->root_key.objectid,
-                                               btrfs_header_generation(next),
-                                               0, 0, 1);
+                       ret = btrfs_free_reserved_extent(log, next->start,
+                                                        next->len);
                        BUG_ON(ret);
                }
        }