btrfs: Open code btrfs_write_and_wait_marked_extents
[sfrench/cifs-2.6.git] / fs / btrfs / transaction.c
index 9220f004001c4ecb2cf14b328e2353ce946106ec..03fbb8854a1bf11d7ab283e4cda875a3e6008116 100644 (file)
@@ -658,14 +658,6 @@ struct btrfs_trans_handle *btrfs_start_transaction_fallback_global_rsv(
        return trans;
 }
 
-struct btrfs_trans_handle *btrfs_start_transaction_lflush(
-                                       struct btrfs_root *root,
-                                       unsigned int num_items)
-{
-       return start_transaction(root, num_items, TRANS_START,
-                                BTRFS_RESERVE_FLUSH_LIMIT, true);
-}
-
 struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root)
 {
        return start_transaction(root, 0, TRANS_JOIN, BTRFS_RESERVE_NO_FLUSH,
@@ -826,6 +818,25 @@ int btrfs_should_end_transaction(struct btrfs_trans_handle *trans)
        return should_end_transaction(trans);
 }
 
+static void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
+                                 struct btrfs_fs_info *fs_info)
+{
+       if (!trans->block_rsv) {
+               ASSERT(!trans->bytes_reserved);
+               return;
+       }
+
+       if (!trans->bytes_reserved)
+               return;
+
+       ASSERT(trans->block_rsv == &fs_info->trans_block_rsv);
+       trace_btrfs_space_reservation(fs_info, "transaction",
+                                     trans->transid, trans->bytes_reserved, 0);
+       btrfs_block_rsv_release(fs_info, trans->block_rsv,
+                               trans->bytes_reserved);
+       trans->bytes_reserved = 0;
+}
+
 static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
                                   int throttle)
 {
@@ -1072,40 +1083,33 @@ int btrfs_wait_tree_log_extents(struct btrfs_root *log_root, int mark)
 }
 
 /*
- * when btree blocks are allocated, they have some corresponding bits set for
- * them in one of two extent_io trees.  This is used to make sure all of
- * those extents are on disk for transaction or log commit
+ * When btree blocks are allocated the corresponding extents are marked dirty.
+ * This function ensures such extents are persisted on disk for transaction or
+ * log commit.
+ *
+ * @trans: transaction whose dirty pages we'd like to write
  */
-static int btrfs_write_and_wait_marked_extents(struct btrfs_fs_info *fs_info,
-                               struct extent_io_tree *dirty_pages, int mark)
+static int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
+                                           struct btrfs_fs_info *fs_info)
 {
        int ret;
        int ret2;
+       struct extent_io_tree *dirty_pages = &trans->transaction->dirty_pages;
        struct blk_plug plug;
 
        blk_start_plug(&plug);
-       ret = btrfs_write_marked_extents(fs_info, dirty_pages, mark);
+       ret = btrfs_write_marked_extents(fs_info, dirty_pages, EXTENT_DIRTY);
        blk_finish_plug(&plug);
        ret2 = btrfs_wait_extents(fs_info, dirty_pages);
 
+       clear_btree_io_tree(&trans->transaction->dirty_pages);
+
        if (ret)
                return ret;
-       if (ret2)
+       else if (ret2)
                return ret2;
-       return 0;
-}
-
-static int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
-                                           struct btrfs_fs_info *fs_info)
-{
-       int ret;
-
-       ret = btrfs_write_and_wait_marked_extents(fs_info,
-                                          &trans->transaction->dirty_pages,
-                                          EXTENT_DIRTY);
-       clear_btree_io_tree(&trans->transaction->dirty_pages);
-
-       return ret;
+       else
+               return 0;
 }
 
 /*
@@ -1722,23 +1726,19 @@ static void update_super_roots(struct btrfs_fs_info *fs_info)
 
        super = fs_info->super_copy;
 
-       /* update latest btrfs_super_block::chunk_root refs */
        root_item = &fs_info->chunk_root->root_item;
-       btrfs_set_super_chunk_root(super, root_item->bytenr);
-       btrfs_set_super_chunk_root_generation(super, root_item->generation);
-       btrfs_set_super_chunk_root_level(super, root_item->level);
+       super->chunk_root = root_item->bytenr;
+       super->chunk_root_generation = root_item->generation;
+       super->chunk_root_level = root_item->level;
 
-       /* update latest btrfs_super_block::root refs */
        root_item = &fs_info->tree_root->root_item;
-       btrfs_set_super_root(super, root_item->bytenr);
-       btrfs_set_super_generation(super, root_item->generation);
-       btrfs_set_super_root_level(super, root_item->level);
-
+       super->root = root_item->bytenr;
+       super->generation = root_item->generation;
+       super->root_level = root_item->level;
        if (btrfs_test_opt(fs_info, SPACE_CACHE))
-               btrfs_set_super_cache_generation(super, root_item->generation);
+               super->cache_generation = root_item->generation;
        if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags))
-               btrfs_set_super_uuid_tree_generation(super,
-                                                    root_item->generation);
+               super->uuid_tree_generation = root_item->generation;
 }
 
 int btrfs_transaction_in_commit(struct btrfs_fs_info *info)