xref: /openbmc/linux/fs/btrfs/transaction.c (revision 0af3d00b)
16cbd5570SChris Mason /*
26cbd5570SChris Mason  * Copyright (C) 2007 Oracle.  All rights reserved.
36cbd5570SChris Mason  *
46cbd5570SChris Mason  * This program is free software; you can redistribute it and/or
56cbd5570SChris Mason  * modify it under the terms of the GNU General Public
66cbd5570SChris Mason  * License v2 as published by the Free Software Foundation.
76cbd5570SChris Mason  *
86cbd5570SChris Mason  * This program is distributed in the hope that it will be useful,
96cbd5570SChris Mason  * but WITHOUT ANY WARRANTY; without even the implied warranty of
106cbd5570SChris Mason  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
116cbd5570SChris Mason  * General Public License for more details.
126cbd5570SChris Mason  *
136cbd5570SChris Mason  * You should have received a copy of the GNU General Public
146cbd5570SChris Mason  * License along with this program; if not, write to the
156cbd5570SChris Mason  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
166cbd5570SChris Mason  * Boston, MA 021110-1307, USA.
176cbd5570SChris Mason  */
186cbd5570SChris Mason 
1979154b1bSChris Mason #include <linux/fs.h>
205a0e3ad6STejun Heo #include <linux/slab.h>
2134088780SChris Mason #include <linux/sched.h>
22d3c2fdcfSChris Mason #include <linux/writeback.h>
235f39d397SChris Mason #include <linux/pagemap.h>
245f2cc086SChris Mason #include <linux/blkdev.h>
2579154b1bSChris Mason #include "ctree.h"
2679154b1bSChris Mason #include "disk-io.h"
2779154b1bSChris Mason #include "transaction.h"
28925baeddSChris Mason #include "locking.h"
29e02119d5SChris Mason #include "tree-log.h"
3079154b1bSChris Mason 
310f7d52f4SChris Mason #define BTRFS_ROOT_TRANS_TAG 0
320f7d52f4SChris Mason 
3380b6794dSChris Mason static noinline void put_transaction(struct btrfs_transaction *transaction)
3479154b1bSChris Mason {
352c90e5d6SChris Mason 	WARN_ON(transaction->use_count == 0);
3679154b1bSChris Mason 	transaction->use_count--;
3778fae27eSChris Mason 	if (transaction->use_count == 0) {
388fd17795SChris Mason 		list_del_init(&transaction->list);
392c90e5d6SChris Mason 		memset(transaction, 0, sizeof(*transaction));
402c90e5d6SChris Mason 		kmem_cache_free(btrfs_transaction_cachep, transaction);
4179154b1bSChris Mason 	}
4278fae27eSChris Mason }
4379154b1bSChris Mason 
44817d52f8SJosef Bacik static noinline void switch_commit_root(struct btrfs_root *root)
45817d52f8SJosef Bacik {
46817d52f8SJosef Bacik 	free_extent_buffer(root->commit_root);
47817d52f8SJosef Bacik 	root->commit_root = btrfs_root_node(root);
48817d52f8SJosef Bacik }
49817d52f8SJosef Bacik 
50d352ac68SChris Mason /*
51d352ac68SChris Mason  * either allocate a new transaction or hop into the existing one
52d352ac68SChris Mason  */
5380b6794dSChris Mason static noinline int join_transaction(struct btrfs_root *root)
5479154b1bSChris Mason {
5579154b1bSChris Mason 	struct btrfs_transaction *cur_trans;
5679154b1bSChris Mason 	cur_trans = root->fs_info->running_transaction;
5779154b1bSChris Mason 	if (!cur_trans) {
582c90e5d6SChris Mason 		cur_trans = kmem_cache_alloc(btrfs_transaction_cachep,
592c90e5d6SChris Mason 					     GFP_NOFS);
6079154b1bSChris Mason 		BUG_ON(!cur_trans);
610f7d52f4SChris Mason 		root->fs_info->generation++;
6215ee9bc7SJosef Bacik 		cur_trans->num_writers = 1;
6315ee9bc7SJosef Bacik 		cur_trans->num_joined = 0;
640f7d52f4SChris Mason 		cur_trans->transid = root->fs_info->generation;
6579154b1bSChris Mason 		init_waitqueue_head(&cur_trans->writer_wait);
6679154b1bSChris Mason 		init_waitqueue_head(&cur_trans->commit_wait);
6779154b1bSChris Mason 		cur_trans->in_commit = 0;
68f9295749SChris Mason 		cur_trans->blocked = 0;
69d5719762SChris Mason 		cur_trans->use_count = 1;
7079154b1bSChris Mason 		cur_trans->commit_done = 0;
7108607c1bSChris Mason 		cur_trans->start_time = get_seconds();
7256bec294SChris Mason 
736bef4d31SEric Paris 		cur_trans->delayed_refs.root = RB_ROOT;
7456bec294SChris Mason 		cur_trans->delayed_refs.num_entries = 0;
75c3e69d58SChris Mason 		cur_trans->delayed_refs.num_heads_ready = 0;
76c3e69d58SChris Mason 		cur_trans->delayed_refs.num_heads = 0;
7756bec294SChris Mason 		cur_trans->delayed_refs.flushing = 0;
78c3e69d58SChris Mason 		cur_trans->delayed_refs.run_delayed_start = 0;
7956bec294SChris Mason 		spin_lock_init(&cur_trans->delayed_refs.lock);
8056bec294SChris Mason 
813063d29fSChris Mason 		INIT_LIST_HEAD(&cur_trans->pending_snapshots);
828fd17795SChris Mason 		list_add_tail(&cur_trans->list, &root->fs_info->trans_list);
83d1310b2eSChris Mason 		extent_io_tree_init(&cur_trans->dirty_pages,
845f39d397SChris Mason 				     root->fs_info->btree_inode->i_mapping,
855f39d397SChris Mason 				     GFP_NOFS);
8648ec2cf8SChris Mason 		spin_lock(&root->fs_info->new_trans_lock);
8748ec2cf8SChris Mason 		root->fs_info->running_transaction = cur_trans;
8848ec2cf8SChris Mason 		spin_unlock(&root->fs_info->new_trans_lock);
8915ee9bc7SJosef Bacik 	} else {
9079154b1bSChris Mason 		cur_trans->num_writers++;
9115ee9bc7SJosef Bacik 		cur_trans->num_joined++;
9215ee9bc7SJosef Bacik 	}
9315ee9bc7SJosef Bacik 
9479154b1bSChris Mason 	return 0;
9579154b1bSChris Mason }
9679154b1bSChris Mason 
97d352ac68SChris Mason /*
98d397712bSChris Mason  * this does all the record keeping required to make sure that a reference
99d397712bSChris Mason  * counted root is properly recorded in a given transaction.  This is required
100d397712bSChris Mason  * to make sure the old root from before we joined the transaction is deleted
101d397712bSChris Mason  * when the transaction commits
102d352ac68SChris Mason  */
1035d4f98a2SYan Zheng static noinline int record_root_in_trans(struct btrfs_trans_handle *trans,
1045d4f98a2SYan Zheng 					 struct btrfs_root *root)
1056702ed49SChris Mason {
1065d4f98a2SYan Zheng 	if (root->ref_cows && root->last_trans < trans->transid) {
1076702ed49SChris Mason 		WARN_ON(root == root->fs_info->extent_root);
1085d4f98a2SYan Zheng 		WARN_ON(root->commit_root != root->node);
1095d4f98a2SYan Zheng 
1106702ed49SChris Mason 		radix_tree_tag_set(&root->fs_info->fs_roots_radix,
1116702ed49SChris Mason 			   (unsigned long)root->root_key.objectid,
1126702ed49SChris Mason 			   BTRFS_ROOT_TRANS_TAG);
1135d4f98a2SYan Zheng 		root->last_trans = trans->transid;
1145d4f98a2SYan Zheng 		btrfs_init_reloc_root(trans, root);
1156702ed49SChris Mason 	}
1165d4f98a2SYan Zheng 	return 0;
1176702ed49SChris Mason }
1185d4f98a2SYan Zheng 
1195d4f98a2SYan Zheng int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans,
1205d4f98a2SYan Zheng 			       struct btrfs_root *root)
1215d4f98a2SYan Zheng {
1225d4f98a2SYan Zheng 	if (!root->ref_cows)
1235d4f98a2SYan Zheng 		return 0;
1245d4f98a2SYan Zheng 
1255d4f98a2SYan Zheng 	mutex_lock(&root->fs_info->trans_mutex);
1265d4f98a2SYan Zheng 	if (root->last_trans == trans->transid) {
1275d4f98a2SYan Zheng 		mutex_unlock(&root->fs_info->trans_mutex);
1285d4f98a2SYan Zheng 		return 0;
1295d4f98a2SYan Zheng 	}
1305d4f98a2SYan Zheng 
1315d4f98a2SYan Zheng 	record_root_in_trans(trans, root);
1325d4f98a2SYan Zheng 	mutex_unlock(&root->fs_info->trans_mutex);
1336702ed49SChris Mason 	return 0;
1346702ed49SChris Mason }
1356702ed49SChris Mason 
136d352ac68SChris Mason /* wait for commit against the current transaction to become unblocked
137d352ac68SChris Mason  * when this is done, it is safe to start a new transaction, but the current
138d352ac68SChris Mason  * transaction might not be fully on disk.
139d352ac68SChris Mason  */
14037d1aeeeSChris Mason static void wait_current_trans(struct btrfs_root *root)
14179154b1bSChris Mason {
142f9295749SChris Mason 	struct btrfs_transaction *cur_trans;
14379154b1bSChris Mason 
144f9295749SChris Mason 	cur_trans = root->fs_info->running_transaction;
14537d1aeeeSChris Mason 	if (cur_trans && cur_trans->blocked) {
146f9295749SChris Mason 		DEFINE_WAIT(wait);
147f9295749SChris Mason 		cur_trans->use_count++;
148f9295749SChris Mason 		while (1) {
149f9295749SChris Mason 			prepare_to_wait(&root->fs_info->transaction_wait, &wait,
150f9295749SChris Mason 					TASK_UNINTERRUPTIBLE);
151471fa17dSZhao Lei 			if (!cur_trans->blocked)
152471fa17dSZhao Lei 				break;
153f9295749SChris Mason 			mutex_unlock(&root->fs_info->trans_mutex);
154f9295749SChris Mason 			schedule();
155f9295749SChris Mason 			mutex_lock(&root->fs_info->trans_mutex);
156f9295749SChris Mason 		}
157471fa17dSZhao Lei 		finish_wait(&root->fs_info->transaction_wait, &wait);
158f9295749SChris Mason 		put_transaction(cur_trans);
159f9295749SChris Mason 	}
16037d1aeeeSChris Mason }
16137d1aeeeSChris Mason 
162249ac1e5SJosef Bacik enum btrfs_trans_type {
163249ac1e5SJosef Bacik 	TRANS_START,
164249ac1e5SJosef Bacik 	TRANS_JOIN,
165249ac1e5SJosef Bacik 	TRANS_USERSPACE,
1660af3d00bSJosef Bacik 	TRANS_JOIN_NOLOCK,
167249ac1e5SJosef Bacik };
168249ac1e5SJosef Bacik 
169a22285a6SYan, Zheng static int may_wait_transaction(struct btrfs_root *root, int type)
17037d1aeeeSChris Mason {
1714bef0848SChris Mason 	if (!root->fs_info->log_root_recovering &&
172249ac1e5SJosef Bacik 	    ((type == TRANS_START && !root->fs_info->open_ioctl_trans) ||
173249ac1e5SJosef Bacik 	     type == TRANS_USERSPACE))
174a22285a6SYan, Zheng 		return 1;
175a22285a6SYan, Zheng 	return 0;
176a22285a6SYan, Zheng }
177a22285a6SYan, Zheng 
178a22285a6SYan, Zheng static struct btrfs_trans_handle *start_transaction(struct btrfs_root *root,
179a22285a6SYan, Zheng 						    u64 num_items, int type)
180a22285a6SYan, Zheng {
181a22285a6SYan, Zheng 	struct btrfs_trans_handle *h;
182a22285a6SYan, Zheng 	struct btrfs_transaction *cur_trans;
183a22285a6SYan, Zheng 	int retries = 0;
184a22285a6SYan, Zheng 	int ret;
185a22285a6SYan, Zheng again:
186a22285a6SYan, Zheng 	h = kmem_cache_alloc(btrfs_trans_handle_cachep, GFP_NOFS);
187a22285a6SYan, Zheng 	if (!h)
188a22285a6SYan, Zheng 		return ERR_PTR(-ENOMEM);
189a22285a6SYan, Zheng 
1900af3d00bSJosef Bacik 	if (type != TRANS_JOIN_NOLOCK)
191a22285a6SYan, Zheng 		mutex_lock(&root->fs_info->trans_mutex);
192a22285a6SYan, Zheng 	if (may_wait_transaction(root, type))
19337d1aeeeSChris Mason 		wait_current_trans(root);
194a22285a6SYan, Zheng 
19579154b1bSChris Mason 	ret = join_transaction(root);
19679154b1bSChris Mason 	BUG_ON(ret);
1970f7d52f4SChris Mason 
198a22285a6SYan, Zheng 	cur_trans = root->fs_info->running_transaction;
199a22285a6SYan, Zheng 	cur_trans->use_count++;
2000af3d00bSJosef Bacik 	if (type != TRANS_JOIN_NOLOCK)
201a22285a6SYan, Zheng 		mutex_unlock(&root->fs_info->trans_mutex);
202a22285a6SYan, Zheng 
203a22285a6SYan, Zheng 	h->transid = cur_trans->transid;
204a22285a6SYan, Zheng 	h->transaction = cur_trans;
20579154b1bSChris Mason 	h->blocks_used = 0;
206d2fb3437SYan Zheng 	h->block_group = 0;
207a22285a6SYan, Zheng 	h->bytes_reserved = 0;
20856bec294SChris Mason 	h->delayed_ref_updates = 0;
209f0486c68SYan, Zheng 	h->block_rsv = NULL;
210b7ec40d7SChris Mason 
211a22285a6SYan, Zheng 	smp_mb();
212a22285a6SYan, Zheng 	if (cur_trans->blocked && may_wait_transaction(root, type)) {
213a22285a6SYan, Zheng 		btrfs_commit_transaction(h, root);
214a22285a6SYan, Zheng 		goto again;
215a22285a6SYan, Zheng 	}
2169ed74f2dSJosef Bacik 
217a22285a6SYan, Zheng 	if (num_items > 0) {
218a22285a6SYan, Zheng 		ret = btrfs_trans_reserve_metadata(h, root, num_items,
219a22285a6SYan, Zheng 						   &retries);
220a22285a6SYan, Zheng 		if (ret == -EAGAIN) {
221a22285a6SYan, Zheng 			btrfs_commit_transaction(h, root);
222a22285a6SYan, Zheng 			goto again;
223a22285a6SYan, Zheng 		}
224a22285a6SYan, Zheng 		if (ret < 0) {
225a22285a6SYan, Zheng 			btrfs_end_transaction(h, root);
226a22285a6SYan, Zheng 			return ERR_PTR(ret);
227a22285a6SYan, Zheng 		}
228a22285a6SYan, Zheng 	}
229a22285a6SYan, Zheng 
2300af3d00bSJosef Bacik 	if (type != TRANS_JOIN_NOLOCK)
231a22285a6SYan, Zheng 		mutex_lock(&root->fs_info->trans_mutex);
2325d4f98a2SYan Zheng 	record_root_in_trans(h, root);
2330af3d00bSJosef Bacik 	if (type != TRANS_JOIN_NOLOCK)
23479154b1bSChris Mason 		mutex_unlock(&root->fs_info->trans_mutex);
235a22285a6SYan, Zheng 
236a22285a6SYan, Zheng 	if (!current->journal_info && type != TRANS_USERSPACE)
237a22285a6SYan, Zheng 		current->journal_info = h;
23879154b1bSChris Mason 	return h;
23979154b1bSChris Mason }
24079154b1bSChris Mason 
241f9295749SChris Mason struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
242a22285a6SYan, Zheng 						   int num_items)
243f9295749SChris Mason {
244a22285a6SYan, Zheng 	return start_transaction(root, num_items, TRANS_START);
245f9295749SChris Mason }
246f9295749SChris Mason struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root,
247f9295749SChris Mason 						   int num_blocks)
248f9295749SChris Mason {
249a22285a6SYan, Zheng 	return start_transaction(root, 0, TRANS_JOIN);
250f9295749SChris Mason }
251f9295749SChris Mason 
2520af3d00bSJosef Bacik struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root,
2530af3d00bSJosef Bacik 							  int num_blocks)
2540af3d00bSJosef Bacik {
2550af3d00bSJosef Bacik 	return start_transaction(root, 0, TRANS_JOIN_NOLOCK);
2560af3d00bSJosef Bacik }
2570af3d00bSJosef Bacik 
2589ca9ee09SSage Weil struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *r,
2599ca9ee09SSage Weil 							 int num_blocks)
2609ca9ee09SSage Weil {
261a22285a6SYan, Zheng 	return start_transaction(r, 0, TRANS_USERSPACE);
2629ca9ee09SSage Weil }
2639ca9ee09SSage Weil 
264d352ac68SChris Mason /* wait for a transaction commit to be fully complete */
26589ce8a63SChris Mason static noinline int wait_for_commit(struct btrfs_root *root,
26689ce8a63SChris Mason 				    struct btrfs_transaction *commit)
26789ce8a63SChris Mason {
26889ce8a63SChris Mason 	DEFINE_WAIT(wait);
26989ce8a63SChris Mason 	mutex_lock(&root->fs_info->trans_mutex);
27089ce8a63SChris Mason 	while (!commit->commit_done) {
27189ce8a63SChris Mason 		prepare_to_wait(&commit->commit_wait, &wait,
27289ce8a63SChris Mason 				TASK_UNINTERRUPTIBLE);
27389ce8a63SChris Mason 		if (commit->commit_done)
27489ce8a63SChris Mason 			break;
27589ce8a63SChris Mason 		mutex_unlock(&root->fs_info->trans_mutex);
27689ce8a63SChris Mason 		schedule();
27789ce8a63SChris Mason 		mutex_lock(&root->fs_info->trans_mutex);
27889ce8a63SChris Mason 	}
27989ce8a63SChris Mason 	mutex_unlock(&root->fs_info->trans_mutex);
28089ce8a63SChris Mason 	finish_wait(&commit->commit_wait, &wait);
28189ce8a63SChris Mason 	return 0;
28289ce8a63SChris Mason }
28389ce8a63SChris Mason 
2845d4f98a2SYan Zheng #if 0
285d352ac68SChris Mason /*
286d397712bSChris Mason  * rate limit against the drop_snapshot code.  This helps to slow down new
287d397712bSChris Mason  * operations if the drop_snapshot code isn't able to keep up.
288d352ac68SChris Mason  */
28937d1aeeeSChris Mason static void throttle_on_drops(struct btrfs_root *root)
290ab78c84dSChris Mason {
291ab78c84dSChris Mason 	struct btrfs_fs_info *info = root->fs_info;
2922dd3e67bSChris Mason 	int harder_count = 0;
293ab78c84dSChris Mason 
2942dd3e67bSChris Mason harder:
295ab78c84dSChris Mason 	if (atomic_read(&info->throttles)) {
296ab78c84dSChris Mason 		DEFINE_WAIT(wait);
297ab78c84dSChris Mason 		int thr;
298ab78c84dSChris Mason 		thr = atomic_read(&info->throttle_gen);
299ab78c84dSChris Mason 
300ab78c84dSChris Mason 		do {
301ab78c84dSChris Mason 			prepare_to_wait(&info->transaction_throttle,
302ab78c84dSChris Mason 					&wait, TASK_UNINTERRUPTIBLE);
303ab78c84dSChris Mason 			if (!atomic_read(&info->throttles)) {
304ab78c84dSChris Mason 				finish_wait(&info->transaction_throttle, &wait);
305ab78c84dSChris Mason 				break;
306ab78c84dSChris Mason 			}
307ab78c84dSChris Mason 			schedule();
308ab78c84dSChris Mason 			finish_wait(&info->transaction_throttle, &wait);
309ab78c84dSChris Mason 		} while (thr == atomic_read(&info->throttle_gen));
3102dd3e67bSChris Mason 		harder_count++;
3112dd3e67bSChris Mason 
3122dd3e67bSChris Mason 		if (root->fs_info->total_ref_cache_size > 1 * 1024 * 1024 &&
3132dd3e67bSChris Mason 		    harder_count < 2)
3142dd3e67bSChris Mason 			goto harder;
3152dd3e67bSChris Mason 
3162dd3e67bSChris Mason 		if (root->fs_info->total_ref_cache_size > 5 * 1024 * 1024 &&
3172dd3e67bSChris Mason 		    harder_count < 10)
3182dd3e67bSChris Mason 			goto harder;
3192dd3e67bSChris Mason 
3202dd3e67bSChris Mason 		if (root->fs_info->total_ref_cache_size > 10 * 1024 * 1024 &&
3212dd3e67bSChris Mason 		    harder_count < 20)
3222dd3e67bSChris Mason 			goto harder;
323ab78c84dSChris Mason 	}
324ab78c84dSChris Mason }
3255d4f98a2SYan Zheng #endif
326ab78c84dSChris Mason 
32737d1aeeeSChris Mason void btrfs_throttle(struct btrfs_root *root)
32837d1aeeeSChris Mason {
32937d1aeeeSChris Mason 	mutex_lock(&root->fs_info->trans_mutex);
3309ca9ee09SSage Weil 	if (!root->fs_info->open_ioctl_trans)
33137d1aeeeSChris Mason 		wait_current_trans(root);
33237d1aeeeSChris Mason 	mutex_unlock(&root->fs_info->trans_mutex);
33337d1aeeeSChris Mason }
33437d1aeeeSChris Mason 
3358929ecfaSYan, Zheng static int should_end_transaction(struct btrfs_trans_handle *trans,
3368929ecfaSYan, Zheng 				  struct btrfs_root *root)
3378929ecfaSYan, Zheng {
3388929ecfaSYan, Zheng 	int ret;
3398929ecfaSYan, Zheng 	ret = btrfs_block_rsv_check(trans, root,
3408929ecfaSYan, Zheng 				    &root->fs_info->global_block_rsv, 0, 5);
3418929ecfaSYan, Zheng 	return ret ? 1 : 0;
3428929ecfaSYan, Zheng }
3438929ecfaSYan, Zheng 
3448929ecfaSYan, Zheng int btrfs_should_end_transaction(struct btrfs_trans_handle *trans,
3458929ecfaSYan, Zheng 				 struct btrfs_root *root)
3468929ecfaSYan, Zheng {
3478929ecfaSYan, Zheng 	struct btrfs_transaction *cur_trans = trans->transaction;
3488929ecfaSYan, Zheng 	int updates;
3498929ecfaSYan, Zheng 
3508929ecfaSYan, Zheng 	if (cur_trans->blocked || cur_trans->delayed_refs.flushing)
3518929ecfaSYan, Zheng 		return 1;
3528929ecfaSYan, Zheng 
3538929ecfaSYan, Zheng 	updates = trans->delayed_ref_updates;
3548929ecfaSYan, Zheng 	trans->delayed_ref_updates = 0;
3558929ecfaSYan, Zheng 	if (updates)
3568929ecfaSYan, Zheng 		btrfs_run_delayed_refs(trans, root, updates);
3578929ecfaSYan, Zheng 
3588929ecfaSYan, Zheng 	return should_end_transaction(trans, root);
3598929ecfaSYan, Zheng }
3608929ecfaSYan, Zheng 
36189ce8a63SChris Mason static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
3620af3d00bSJosef Bacik 			  struct btrfs_root *root, int throttle, int lock)
36379154b1bSChris Mason {
3648929ecfaSYan, Zheng 	struct btrfs_transaction *cur_trans = trans->transaction;
365ab78c84dSChris Mason 	struct btrfs_fs_info *info = root->fs_info;
366c3e69d58SChris Mason 	int count = 0;
367d6e4a428SChris Mason 
368c3e69d58SChris Mason 	while (count < 4) {
369c3e69d58SChris Mason 		unsigned long cur = trans->delayed_ref_updates;
370c3e69d58SChris Mason 		trans->delayed_ref_updates = 0;
371c3e69d58SChris Mason 		if (cur &&
372c3e69d58SChris Mason 		    trans->transaction->delayed_refs.num_heads_ready > 64) {
373c3e69d58SChris Mason 			trans->delayed_ref_updates = 0;
374b7ec40d7SChris Mason 
375b7ec40d7SChris Mason 			/*
376b7ec40d7SChris Mason 			 * do a full flush if the transaction is trying
377b7ec40d7SChris Mason 			 * to close
378b7ec40d7SChris Mason 			 */
379b7ec40d7SChris Mason 			if (trans->transaction->delayed_refs.flushing)
380b7ec40d7SChris Mason 				cur = 0;
381c3e69d58SChris Mason 			btrfs_run_delayed_refs(trans, root, cur);
382c3e69d58SChris Mason 		} else {
383c3e69d58SChris Mason 			break;
384c3e69d58SChris Mason 		}
385c3e69d58SChris Mason 		count++;
38656bec294SChris Mason 	}
38756bec294SChris Mason 
388a22285a6SYan, Zheng 	btrfs_trans_release_metadata(trans, root);
389a22285a6SYan, Zheng 
3900af3d00bSJosef Bacik 	if (lock && !root->fs_info->open_ioctl_trans &&
3918929ecfaSYan, Zheng 	    should_end_transaction(trans, root))
3928929ecfaSYan, Zheng 		trans->transaction->blocked = 1;
3938929ecfaSYan, Zheng 
3940af3d00bSJosef Bacik 	if (lock && cur_trans->blocked && !cur_trans->in_commit) {
3958929ecfaSYan, Zheng 		if (throttle)
3968929ecfaSYan, Zheng 			return btrfs_commit_transaction(trans, root);
3978929ecfaSYan, Zheng 		else
3988929ecfaSYan, Zheng 			wake_up_process(info->transaction_kthread);
3998929ecfaSYan, Zheng 	}
4008929ecfaSYan, Zheng 
4010af3d00bSJosef Bacik 	if (lock)
402ab78c84dSChris Mason 		mutex_lock(&info->trans_mutex);
4038929ecfaSYan, Zheng 	WARN_ON(cur_trans != info->running_transaction);
404d5719762SChris Mason 	WARN_ON(cur_trans->num_writers < 1);
405ccd467d6SChris Mason 	cur_trans->num_writers--;
40689ce8a63SChris Mason 
40779154b1bSChris Mason 	if (waitqueue_active(&cur_trans->writer_wait))
40879154b1bSChris Mason 		wake_up(&cur_trans->writer_wait);
40979154b1bSChris Mason 	put_transaction(cur_trans);
4100af3d00bSJosef Bacik 	if (lock)
411ab78c84dSChris Mason 		mutex_unlock(&info->trans_mutex);
4129ed74f2dSJosef Bacik 
4139ed74f2dSJosef Bacik 	if (current->journal_info == trans)
4149ed74f2dSJosef Bacik 		current->journal_info = NULL;
415d6025579SChris Mason 	memset(trans, 0, sizeof(*trans));
4162c90e5d6SChris Mason 	kmem_cache_free(btrfs_trans_handle_cachep, trans);
417ab78c84dSChris Mason 
41824bbcf04SYan, Zheng 	if (throttle)
41924bbcf04SYan, Zheng 		btrfs_run_delayed_iputs(root);
42024bbcf04SYan, Zheng 
42179154b1bSChris Mason 	return 0;
42279154b1bSChris Mason }
42379154b1bSChris Mason 
42489ce8a63SChris Mason int btrfs_end_transaction(struct btrfs_trans_handle *trans,
42589ce8a63SChris Mason 			  struct btrfs_root *root)
42689ce8a63SChris Mason {
4270af3d00bSJosef Bacik 	return __btrfs_end_transaction(trans, root, 0, 1);
42889ce8a63SChris Mason }
42989ce8a63SChris Mason 
43089ce8a63SChris Mason int btrfs_end_transaction_throttle(struct btrfs_trans_handle *trans,
43189ce8a63SChris Mason 				   struct btrfs_root *root)
43289ce8a63SChris Mason {
4330af3d00bSJosef Bacik 	return __btrfs_end_transaction(trans, root, 1, 1);
4340af3d00bSJosef Bacik }
4350af3d00bSJosef Bacik 
4360af3d00bSJosef Bacik int btrfs_end_transaction_nolock(struct btrfs_trans_handle *trans,
4370af3d00bSJosef Bacik 				 struct btrfs_root *root)
4380af3d00bSJosef Bacik {
4390af3d00bSJosef Bacik 	return __btrfs_end_transaction(trans, root, 0, 0);
44089ce8a63SChris Mason }
44189ce8a63SChris Mason 
442d352ac68SChris Mason /*
443d352ac68SChris Mason  * when btree blocks are allocated, they have some corresponding bits set for
444d352ac68SChris Mason  * them in one of two extent_io trees.  This is used to make sure all of
445690587d1SChris Mason  * those extents are sent to disk but does not wait on them
446d352ac68SChris Mason  */
447690587d1SChris Mason int btrfs_write_marked_extents(struct btrfs_root *root,
4488cef4e16SYan, Zheng 			       struct extent_io_tree *dirty_pages, int mark)
44979154b1bSChris Mason {
4507c4452b9SChris Mason 	int ret;
451777e6bd7SChris Mason 	int err = 0;
4527c4452b9SChris Mason 	int werr = 0;
4537c4452b9SChris Mason 	struct page *page;
4547c4452b9SChris Mason 	struct inode *btree_inode = root->fs_info->btree_inode;
455777e6bd7SChris Mason 	u64 start = 0;
4565f39d397SChris Mason 	u64 end;
4575f39d397SChris Mason 	unsigned long index;
4587c4452b9SChris Mason 
4597c4452b9SChris Mason 	while (1) {
460777e6bd7SChris Mason 		ret = find_first_extent_bit(dirty_pages, start, &start, &end,
4618cef4e16SYan, Zheng 					    mark);
4625f39d397SChris Mason 		if (ret)
4637c4452b9SChris Mason 			break;
4645f39d397SChris Mason 		while (start <= end) {
465777e6bd7SChris Mason 			cond_resched();
466777e6bd7SChris Mason 
4675f39d397SChris Mason 			index = start >> PAGE_CACHE_SHIFT;
46835ebb934SChris Mason 			start = (u64)(index + 1) << PAGE_CACHE_SHIFT;
4694bef0848SChris Mason 			page = find_get_page(btree_inode->i_mapping, index);
4707c4452b9SChris Mason 			if (!page)
4717c4452b9SChris Mason 				continue;
4724bef0848SChris Mason 
4734bef0848SChris Mason 			btree_lock_page_hook(page);
4744bef0848SChris Mason 			if (!page->mapping) {
4754bef0848SChris Mason 				unlock_page(page);
4764bef0848SChris Mason 				page_cache_release(page);
4774bef0848SChris Mason 				continue;
4784bef0848SChris Mason 			}
4794bef0848SChris Mason 
4806702ed49SChris Mason 			if (PageWriteback(page)) {
4816702ed49SChris Mason 				if (PageDirty(page))
4826702ed49SChris Mason 					wait_on_page_writeback(page);
4836702ed49SChris Mason 				else {
4846702ed49SChris Mason 					unlock_page(page);
4856702ed49SChris Mason 					page_cache_release(page);
4866702ed49SChris Mason 					continue;
4876702ed49SChris Mason 				}
4886702ed49SChris Mason 			}
4897c4452b9SChris Mason 			err = write_one_page(page, 0);
4907c4452b9SChris Mason 			if (err)
4917c4452b9SChris Mason 				werr = err;
4927c4452b9SChris Mason 			page_cache_release(page);
4937c4452b9SChris Mason 		}
4947c4452b9SChris Mason 	}
495690587d1SChris Mason 	if (err)
496690587d1SChris Mason 		werr = err;
497690587d1SChris Mason 	return werr;
498690587d1SChris Mason }
499690587d1SChris Mason 
500690587d1SChris Mason /*
501690587d1SChris Mason  * when btree blocks are allocated, they have some corresponding bits set for
502690587d1SChris Mason  * them in one of two extent_io trees.  This is used to make sure all of
503690587d1SChris Mason  * those extents are on disk for transaction or log commit.  We wait
504690587d1SChris Mason  * on all the pages and clear them from the dirty pages state tree
505690587d1SChris Mason  */
506690587d1SChris Mason int btrfs_wait_marked_extents(struct btrfs_root *root,
5078cef4e16SYan, Zheng 			      struct extent_io_tree *dirty_pages, int mark)
508690587d1SChris Mason {
509690587d1SChris Mason 	int ret;
510690587d1SChris Mason 	int err = 0;
511690587d1SChris Mason 	int werr = 0;
512690587d1SChris Mason 	struct page *page;
513690587d1SChris Mason 	struct inode *btree_inode = root->fs_info->btree_inode;
514690587d1SChris Mason 	u64 start = 0;
515690587d1SChris Mason 	u64 end;
516690587d1SChris Mason 	unsigned long index;
517690587d1SChris Mason 
518777e6bd7SChris Mason 	while (1) {
5198cef4e16SYan, Zheng 		ret = find_first_extent_bit(dirty_pages, start, &start, &end,
5208cef4e16SYan, Zheng 					    mark);
521777e6bd7SChris Mason 		if (ret)
522777e6bd7SChris Mason 			break;
523777e6bd7SChris Mason 
5248cef4e16SYan, Zheng 		clear_extent_bits(dirty_pages, start, end, mark, GFP_NOFS);
525777e6bd7SChris Mason 		while (start <= end) {
526777e6bd7SChris Mason 			index = start >> PAGE_CACHE_SHIFT;
527777e6bd7SChris Mason 			start = (u64)(index + 1) << PAGE_CACHE_SHIFT;
528777e6bd7SChris Mason 			page = find_get_page(btree_inode->i_mapping, index);
529777e6bd7SChris Mason 			if (!page)
530777e6bd7SChris Mason 				continue;
531777e6bd7SChris Mason 			if (PageDirty(page)) {
5324bef0848SChris Mason 				btree_lock_page_hook(page);
5334bef0848SChris Mason 				wait_on_page_writeback(page);
534777e6bd7SChris Mason 				err = write_one_page(page, 0);
535777e6bd7SChris Mason 				if (err)
536777e6bd7SChris Mason 					werr = err;
537777e6bd7SChris Mason 			}
538777e6bd7SChris Mason 			wait_on_page_writeback(page);
539777e6bd7SChris Mason 			page_cache_release(page);
540777e6bd7SChris Mason 			cond_resched();
541777e6bd7SChris Mason 		}
542777e6bd7SChris Mason 	}
5437c4452b9SChris Mason 	if (err)
5447c4452b9SChris Mason 		werr = err;
5457c4452b9SChris Mason 	return werr;
54679154b1bSChris Mason }
54779154b1bSChris Mason 
548690587d1SChris Mason /*
549690587d1SChris Mason  * when btree blocks are allocated, they have some corresponding bits set for
550690587d1SChris Mason  * them in one of two extent_io trees.  This is used to make sure all of
551690587d1SChris Mason  * those extents are on disk for transaction or log commit
552690587d1SChris Mason  */
553690587d1SChris Mason int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
5548cef4e16SYan, Zheng 				struct extent_io_tree *dirty_pages, int mark)
555690587d1SChris Mason {
556690587d1SChris Mason 	int ret;
557690587d1SChris Mason 	int ret2;
558690587d1SChris Mason 
5598cef4e16SYan, Zheng 	ret = btrfs_write_marked_extents(root, dirty_pages, mark);
5608cef4e16SYan, Zheng 	ret2 = btrfs_wait_marked_extents(root, dirty_pages, mark);
561690587d1SChris Mason 	return ret || ret2;
562690587d1SChris Mason }
563690587d1SChris Mason 
564d0c803c4SChris Mason int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
565d0c803c4SChris Mason 				     struct btrfs_root *root)
566d0c803c4SChris Mason {
567d0c803c4SChris Mason 	if (!trans || !trans->transaction) {
568d0c803c4SChris Mason 		struct inode *btree_inode;
569d0c803c4SChris Mason 		btree_inode = root->fs_info->btree_inode;
570d0c803c4SChris Mason 		return filemap_write_and_wait(btree_inode->i_mapping);
571d0c803c4SChris Mason 	}
572d0c803c4SChris Mason 	return btrfs_write_and_wait_marked_extents(root,
5738cef4e16SYan, Zheng 					   &trans->transaction->dirty_pages,
5748cef4e16SYan, Zheng 					   EXTENT_DIRTY);
575d0c803c4SChris Mason }
576d0c803c4SChris Mason 
577d352ac68SChris Mason /*
578d352ac68SChris Mason  * this is used to update the root pointer in the tree of tree roots.
579d352ac68SChris Mason  *
580d352ac68SChris Mason  * But, in the case of the extent allocation tree, updating the root
581d352ac68SChris Mason  * pointer may allocate blocks which may change the root of the extent
582d352ac68SChris Mason  * allocation tree.
583d352ac68SChris Mason  *
584d352ac68SChris Mason  * So, this loops and repeats and makes sure the cowonly root didn't
585d352ac68SChris Mason  * change while the root pointer was being updated in the metadata.
586d352ac68SChris Mason  */
5870b86a832SChris Mason static int update_cowonly_root(struct btrfs_trans_handle *trans,
58879154b1bSChris Mason 			       struct btrfs_root *root)
58979154b1bSChris Mason {
59079154b1bSChris Mason 	int ret;
5910b86a832SChris Mason 	u64 old_root_bytenr;
59286b9f2ecSYan, Zheng 	u64 old_root_used;
5930b86a832SChris Mason 	struct btrfs_root *tree_root = root->fs_info->tree_root;
59479154b1bSChris Mason 
59586b9f2ecSYan, Zheng 	old_root_used = btrfs_root_used(&root->root_item);
5960b86a832SChris Mason 	btrfs_write_dirty_block_groups(trans, root);
59756bec294SChris Mason 
59879154b1bSChris Mason 	while (1) {
5990b86a832SChris Mason 		old_root_bytenr = btrfs_root_bytenr(&root->root_item);
60086b9f2ecSYan, Zheng 		if (old_root_bytenr == root->node->start &&
60186b9f2ecSYan, Zheng 		    old_root_used == btrfs_root_used(&root->root_item))
60279154b1bSChris Mason 			break;
60387ef2bb4SChris Mason 
6045d4f98a2SYan Zheng 		btrfs_set_root_node(&root->root_item, root->node);
60579154b1bSChris Mason 		ret = btrfs_update_root(trans, tree_root,
6060b86a832SChris Mason 					&root->root_key,
6070b86a832SChris Mason 					&root->root_item);
60879154b1bSChris Mason 		BUG_ON(ret);
60956bec294SChris Mason 
61086b9f2ecSYan, Zheng 		old_root_used = btrfs_root_used(&root->root_item);
6114a8c9a62SYan Zheng 		ret = btrfs_write_dirty_block_groups(trans, root);
61256bec294SChris Mason 		BUG_ON(ret);
6130b86a832SChris Mason 	}
614276e680dSYan Zheng 
615276e680dSYan Zheng 	if (root != root->fs_info->extent_root)
616817d52f8SJosef Bacik 		switch_commit_root(root);
617276e680dSYan Zheng 
6180b86a832SChris Mason 	return 0;
6190b86a832SChris Mason }
6200b86a832SChris Mason 
621d352ac68SChris Mason /*
622d352ac68SChris Mason  * update all the cowonly tree roots on disk
623d352ac68SChris Mason  */
6245d4f98a2SYan Zheng static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans,
6250b86a832SChris Mason 					 struct btrfs_root *root)
6260b86a832SChris Mason {
6270b86a832SChris Mason 	struct btrfs_fs_info *fs_info = root->fs_info;
6280b86a832SChris Mason 	struct list_head *next;
62984234f3aSYan Zheng 	struct extent_buffer *eb;
63056bec294SChris Mason 	int ret;
63184234f3aSYan Zheng 
63256bec294SChris Mason 	ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
63356bec294SChris Mason 	BUG_ON(ret);
63487ef2bb4SChris Mason 
63584234f3aSYan Zheng 	eb = btrfs_lock_root_node(fs_info->tree_root);
6369fa8cfe7SChris Mason 	btrfs_cow_block(trans, fs_info->tree_root, eb, NULL, 0, &eb);
63784234f3aSYan Zheng 	btrfs_tree_unlock(eb);
63884234f3aSYan Zheng 	free_extent_buffer(eb);
6390b86a832SChris Mason 
64056bec294SChris Mason 	ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
64156bec294SChris Mason 	BUG_ON(ret);
64287ef2bb4SChris Mason 
6430b86a832SChris Mason 	while (!list_empty(&fs_info->dirty_cowonly_roots)) {
6440b86a832SChris Mason 		next = fs_info->dirty_cowonly_roots.next;
6450b86a832SChris Mason 		list_del_init(next);
6460b86a832SChris Mason 		root = list_entry(next, struct btrfs_root, dirty_list);
64787ef2bb4SChris Mason 
6480b86a832SChris Mason 		update_cowonly_root(trans, root);
64979154b1bSChris Mason 	}
650276e680dSYan Zheng 
651276e680dSYan Zheng 	down_write(&fs_info->extent_commit_sem);
652276e680dSYan Zheng 	switch_commit_root(fs_info->extent_root);
653276e680dSYan Zheng 	up_write(&fs_info->extent_commit_sem);
654276e680dSYan Zheng 
65579154b1bSChris Mason 	return 0;
65679154b1bSChris Mason }
65779154b1bSChris Mason 
658d352ac68SChris Mason /*
659d352ac68SChris Mason  * dead roots are old snapshots that need to be deleted.  This allocates
660d352ac68SChris Mason  * a dirty root struct and adds it into the list of dead roots that need to
661d352ac68SChris Mason  * be deleted
662d352ac68SChris Mason  */
6635d4f98a2SYan Zheng int btrfs_add_dead_root(struct btrfs_root *root)
6645eda7b5eSChris Mason {
665b48652c1SYan Zheng 	mutex_lock(&root->fs_info->trans_mutex);
6665d4f98a2SYan Zheng 	list_add(&root->root_list, &root->fs_info->dead_roots);
667b48652c1SYan Zheng 	mutex_unlock(&root->fs_info->trans_mutex);
6685eda7b5eSChris Mason 	return 0;
6695eda7b5eSChris Mason }
6705eda7b5eSChris Mason 
671d352ac68SChris Mason /*
6725d4f98a2SYan Zheng  * update all the cowonly tree roots on disk
673d352ac68SChris Mason  */
6745d4f98a2SYan Zheng static noinline int commit_fs_roots(struct btrfs_trans_handle *trans,
6755d4f98a2SYan Zheng 				    struct btrfs_root *root)
6760f7d52f4SChris Mason {
6770f7d52f4SChris Mason 	struct btrfs_root *gang[8];
6785d4f98a2SYan Zheng 	struct btrfs_fs_info *fs_info = root->fs_info;
6790f7d52f4SChris Mason 	int i;
6800f7d52f4SChris Mason 	int ret;
68154aa1f4dSChris Mason 	int err = 0;
68254aa1f4dSChris Mason 
6830f7d52f4SChris Mason 	while (1) {
6845d4f98a2SYan Zheng 		ret = radix_tree_gang_lookup_tag(&fs_info->fs_roots_radix,
6855d4f98a2SYan Zheng 						 (void **)gang, 0,
6860f7d52f4SChris Mason 						 ARRAY_SIZE(gang),
6870f7d52f4SChris Mason 						 BTRFS_ROOT_TRANS_TAG);
6880f7d52f4SChris Mason 		if (ret == 0)
6890f7d52f4SChris Mason 			break;
6900f7d52f4SChris Mason 		for (i = 0; i < ret; i++) {
6910f7d52f4SChris Mason 			root = gang[i];
6925d4f98a2SYan Zheng 			radix_tree_tag_clear(&fs_info->fs_roots_radix,
6932619ba1fSChris Mason 					(unsigned long)root->root_key.objectid,
6940f7d52f4SChris Mason 					BTRFS_ROOT_TRANS_TAG);
69531153d81SYan Zheng 
696e02119d5SChris Mason 			btrfs_free_log(trans, root);
6975d4f98a2SYan Zheng 			btrfs_update_reloc_root(trans, root);
698d68fc57bSYan, Zheng 			btrfs_orphan_commit_root(trans, root);
699e02119d5SChris Mason 
700978d910dSYan Zheng 			if (root->commit_root != root->node) {
701817d52f8SJosef Bacik 				switch_commit_root(root);
702978d910dSYan Zheng 				btrfs_set_root_node(&root->root_item,
703978d910dSYan Zheng 						    root->node);
704978d910dSYan Zheng 			}
70531153d81SYan Zheng 
7065d4f98a2SYan Zheng 			err = btrfs_update_root(trans, fs_info->tree_root,
7070f7d52f4SChris Mason 						&root->root_key,
7080f7d52f4SChris Mason 						&root->root_item);
70954aa1f4dSChris Mason 			if (err)
71054aa1f4dSChris Mason 				break;
7110f7d52f4SChris Mason 		}
7129f3a7427SChris Mason 	}
71354aa1f4dSChris Mason 	return err;
7140f7d52f4SChris Mason }
7150f7d52f4SChris Mason 
716d352ac68SChris Mason /*
717d352ac68SChris Mason  * defrag a given btree.  If cacheonly == 1, this won't read from the disk,
718d352ac68SChris Mason  * otherwise every leaf in the btree is read and defragged.
719d352ac68SChris Mason  */
720e9d0b13bSChris Mason int btrfs_defrag_root(struct btrfs_root *root, int cacheonly)
721e9d0b13bSChris Mason {
722e9d0b13bSChris Mason 	struct btrfs_fs_info *info = root->fs_info;
723e9d0b13bSChris Mason 	struct btrfs_trans_handle *trans;
7248929ecfaSYan, Zheng 	int ret;
725d3c2fdcfSChris Mason 	unsigned long nr;
726e9d0b13bSChris Mason 
7278929ecfaSYan, Zheng 	if (xchg(&root->defrag_running, 1))
728e9d0b13bSChris Mason 		return 0;
7298929ecfaSYan, Zheng 
7306b80053dSChris Mason 	while (1) {
7318929ecfaSYan, Zheng 		trans = btrfs_start_transaction(root, 0);
7328929ecfaSYan, Zheng 		if (IS_ERR(trans))
7338929ecfaSYan, Zheng 			return PTR_ERR(trans);
7348929ecfaSYan, Zheng 
735e9d0b13bSChris Mason 		ret = btrfs_defrag_leaves(trans, root, cacheonly);
7368929ecfaSYan, Zheng 
737d3c2fdcfSChris Mason 		nr = trans->blocks_used;
738e9d0b13bSChris Mason 		btrfs_end_transaction(trans, root);
739d3c2fdcfSChris Mason 		btrfs_btree_balance_dirty(info->tree_root, nr);
740e9d0b13bSChris Mason 		cond_resched();
741e9d0b13bSChris Mason 
7423f157a2fSChris Mason 		if (root->fs_info->closing || ret != -EAGAIN)
743e9d0b13bSChris Mason 			break;
744e9d0b13bSChris Mason 	}
745e9d0b13bSChris Mason 	root->defrag_running = 0;
7468929ecfaSYan, Zheng 	return ret;
747e9d0b13bSChris Mason }
748e9d0b13bSChris Mason 
7492c47e605SYan Zheng #if 0
750d352ac68SChris Mason /*
751b7ec40d7SChris Mason  * when dropping snapshots, we generate a ton of delayed refs, and it makes
752b7ec40d7SChris Mason  * sense not to join the transaction while it is trying to flush the current
753b7ec40d7SChris Mason  * queue of delayed refs out.
754b7ec40d7SChris Mason  *
755b7ec40d7SChris Mason  * This is used by the drop snapshot code only
756b7ec40d7SChris Mason  */
757b7ec40d7SChris Mason static noinline int wait_transaction_pre_flush(struct btrfs_fs_info *info)
758b7ec40d7SChris Mason {
759b7ec40d7SChris Mason 	DEFINE_WAIT(wait);
760b7ec40d7SChris Mason 
761b7ec40d7SChris Mason 	mutex_lock(&info->trans_mutex);
762b7ec40d7SChris Mason 	while (info->running_transaction &&
763b7ec40d7SChris Mason 	       info->running_transaction->delayed_refs.flushing) {
764b7ec40d7SChris Mason 		prepare_to_wait(&info->transaction_wait, &wait,
765b7ec40d7SChris Mason 				TASK_UNINTERRUPTIBLE);
766b7ec40d7SChris Mason 		mutex_unlock(&info->trans_mutex);
76759bc5c75SChris Mason 
768b7ec40d7SChris Mason 		schedule();
76959bc5c75SChris Mason 
770b7ec40d7SChris Mason 		mutex_lock(&info->trans_mutex);
771b7ec40d7SChris Mason 		finish_wait(&info->transaction_wait, &wait);
772b7ec40d7SChris Mason 	}
773b7ec40d7SChris Mason 	mutex_unlock(&info->trans_mutex);
774b7ec40d7SChris Mason 	return 0;
775b7ec40d7SChris Mason }
776b7ec40d7SChris Mason 
777b7ec40d7SChris Mason /*
778d352ac68SChris Mason  * Given a list of roots that need to be deleted, call btrfs_drop_snapshot on
779d352ac68SChris Mason  * all of them
780d352ac68SChris Mason  */
7815d4f98a2SYan Zheng int btrfs_drop_dead_root(struct btrfs_root *root)
7820f7d52f4SChris Mason {
7830f7d52f4SChris Mason 	struct btrfs_trans_handle *trans;
7845d4f98a2SYan Zheng 	struct btrfs_root *tree_root = root->fs_info->tree_root;
785d3c2fdcfSChris Mason 	unsigned long nr;
7865d4f98a2SYan Zheng 	int ret;
78758176a96SJosef Bacik 
7889f3a7427SChris Mason 	while (1) {
789b7ec40d7SChris Mason 		/*
790b7ec40d7SChris Mason 		 * we don't want to jump in and create a bunch of
791b7ec40d7SChris Mason 		 * delayed refs if the transaction is starting to close
792b7ec40d7SChris Mason 		 */
793b7ec40d7SChris Mason 		wait_transaction_pre_flush(tree_root->fs_info);
7940f7d52f4SChris Mason 		trans = btrfs_start_transaction(tree_root, 1);
795b7ec40d7SChris Mason 
796b7ec40d7SChris Mason 		/*
797b7ec40d7SChris Mason 		 * we've joined a transaction, make sure it isn't
798b7ec40d7SChris Mason 		 * closing right now
799b7ec40d7SChris Mason 		 */
800b7ec40d7SChris Mason 		if (trans->transaction->delayed_refs.flushing) {
801b7ec40d7SChris Mason 			btrfs_end_transaction(trans, tree_root);
802b7ec40d7SChris Mason 			continue;
803b7ec40d7SChris Mason 		}
804b7ec40d7SChris Mason 
8055d4f98a2SYan Zheng 		ret = btrfs_drop_snapshot(trans, root);
806d397712bSChris Mason 		if (ret != -EAGAIN)
8079f3a7427SChris Mason 			break;
80858176a96SJosef Bacik 
8095d4f98a2SYan Zheng 		ret = btrfs_update_root(trans, tree_root,
8105d4f98a2SYan Zheng 					&root->root_key,
8115d4f98a2SYan Zheng 					&root->root_item);
8125d4f98a2SYan Zheng 		if (ret)
81354aa1f4dSChris Mason 			break;
814bcc63abbSYan 
815d3c2fdcfSChris Mason 		nr = trans->blocks_used;
8160f7d52f4SChris Mason 		ret = btrfs_end_transaction(trans, tree_root);
8170f7d52f4SChris Mason 		BUG_ON(ret);
8185eda7b5eSChris Mason 
819d3c2fdcfSChris Mason 		btrfs_btree_balance_dirty(tree_root, nr);
8204dc11904SChris Mason 		cond_resched();
8210f7d52f4SChris Mason 	}
8225d4f98a2SYan Zheng 	BUG_ON(ret);
8235d4f98a2SYan Zheng 
8245d4f98a2SYan Zheng 	ret = btrfs_del_root(trans, tree_root, &root->root_key);
8255d4f98a2SYan Zheng 	BUG_ON(ret);
8265d4f98a2SYan Zheng 
8275d4f98a2SYan Zheng 	nr = trans->blocks_used;
8285d4f98a2SYan Zheng 	ret = btrfs_end_transaction(trans, tree_root);
8295d4f98a2SYan Zheng 	BUG_ON(ret);
8305d4f98a2SYan Zheng 
8315d4f98a2SYan Zheng 	free_extent_buffer(root->node);
8325d4f98a2SYan Zheng 	free_extent_buffer(root->commit_root);
8335d4f98a2SYan Zheng 	kfree(root);
8345d4f98a2SYan Zheng 
8355d4f98a2SYan Zheng 	btrfs_btree_balance_dirty(tree_root, nr);
83654aa1f4dSChris Mason 	return ret;
8370f7d52f4SChris Mason }
8382c47e605SYan Zheng #endif
8390f7d52f4SChris Mason 
840d352ac68SChris Mason /*
841d352ac68SChris Mason  * new snapshots need to be created at a very specific time in the
842d352ac68SChris Mason  * transaction commit.  This does the actual creation
843d352ac68SChris Mason  */
84480b6794dSChris Mason static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
8453063d29fSChris Mason 				   struct btrfs_fs_info *fs_info,
8463063d29fSChris Mason 				   struct btrfs_pending_snapshot *pending)
8473063d29fSChris Mason {
8483063d29fSChris Mason 	struct btrfs_key key;
84980b6794dSChris Mason 	struct btrfs_root_item *new_root_item;
8503063d29fSChris Mason 	struct btrfs_root *tree_root = fs_info->tree_root;
8513063d29fSChris Mason 	struct btrfs_root *root = pending->root;
8526bdb72deSSage Weil 	struct btrfs_root *parent_root;
8536bdb72deSSage Weil 	struct inode *parent_inode;
854a22285a6SYan, Zheng 	struct dentry *dentry;
8553063d29fSChris Mason 	struct extent_buffer *tmp;
856925baeddSChris Mason 	struct extent_buffer *old;
8573063d29fSChris Mason 	int ret;
858d68fc57bSYan, Zheng 	int retries = 0;
859d68fc57bSYan, Zheng 	u64 to_reserve = 0;
8606bdb72deSSage Weil 	u64 index = 0;
861a22285a6SYan, Zheng 	u64 objectid;
8623063d29fSChris Mason 
86380b6794dSChris Mason 	new_root_item = kmalloc(sizeof(*new_root_item), GFP_NOFS);
86480b6794dSChris Mason 	if (!new_root_item) {
865a22285a6SYan, Zheng 		pending->error = -ENOMEM;
86680b6794dSChris Mason 		goto fail;
86780b6794dSChris Mason 	}
868a22285a6SYan, Zheng 
8693063d29fSChris Mason 	ret = btrfs_find_free_objectid(trans, tree_root, 0, &objectid);
870a22285a6SYan, Zheng 	if (ret) {
871a22285a6SYan, Zheng 		pending->error = ret;
8723063d29fSChris Mason 		goto fail;
873a22285a6SYan, Zheng 	}
8743063d29fSChris Mason 
8753fd0a558SYan, Zheng 	btrfs_reloc_pre_snapshot(trans, pending, &to_reserve);
876d68fc57bSYan, Zheng 	btrfs_orphan_pre_snapshot(trans, pending, &to_reserve);
877d68fc57bSYan, Zheng 
878d68fc57bSYan, Zheng 	if (to_reserve > 0) {
879d68fc57bSYan, Zheng 		ret = btrfs_block_rsv_add(trans, root, &pending->block_rsv,
880d68fc57bSYan, Zheng 					  to_reserve, &retries);
881d68fc57bSYan, Zheng 		if (ret) {
882d68fc57bSYan, Zheng 			pending->error = ret;
883d68fc57bSYan, Zheng 			goto fail;
884d68fc57bSYan, Zheng 		}
885d68fc57bSYan, Zheng 	}
886d68fc57bSYan, Zheng 
8873063d29fSChris Mason 	key.objectid = objectid;
888a22285a6SYan, Zheng 	key.offset = (u64)-1;
889a22285a6SYan, Zheng 	key.type = BTRFS_ROOT_ITEM_KEY;
8903063d29fSChris Mason 
891a22285a6SYan, Zheng 	trans->block_rsv = &pending->block_rsv;
8926bdb72deSSage Weil 
893a22285a6SYan, Zheng 	dentry = pending->dentry;
894a22285a6SYan, Zheng 	parent_inode = dentry->d_parent->d_inode;
895a22285a6SYan, Zheng 	parent_root = BTRFS_I(parent_inode)->root;
8966bdb72deSSage Weil 	record_root_in_trans(trans, parent_root);
897a22285a6SYan, Zheng 
8986bdb72deSSage Weil 	/*
8996bdb72deSSage Weil 	 * insert the directory item
9006bdb72deSSage Weil 	 */
9016bdb72deSSage Weil 	ret = btrfs_set_inode_index(parent_inode, &index);
9026bdb72deSSage Weil 	BUG_ON(ret);
9036bdb72deSSage Weil 	ret = btrfs_insert_dir_item(trans, parent_root,
904a22285a6SYan, Zheng 				dentry->d_name.name, dentry->d_name.len,
905a22285a6SYan, Zheng 				parent_inode->i_ino, &key,
906a22285a6SYan, Zheng 				BTRFS_FT_DIR, index);
9076bdb72deSSage Weil 	BUG_ON(ret);
9086bdb72deSSage Weil 
909a22285a6SYan, Zheng 	btrfs_i_size_write(parent_inode, parent_inode->i_size +
910a22285a6SYan, Zheng 					 dentry->d_name.len * 2);
9116bdb72deSSage Weil 	ret = btrfs_update_inode(trans, parent_root, parent_inode);
9126bdb72deSSage Weil 	BUG_ON(ret);
9136bdb72deSSage Weil 
9146bdb72deSSage Weil 	record_root_in_trans(trans, root);
9156bdb72deSSage Weil 	btrfs_set_root_last_snapshot(&root->root_item, trans->transid);
9166bdb72deSSage Weil 	memcpy(new_root_item, &root->root_item, sizeof(*new_root_item));
9176bdb72deSSage Weil 
918925baeddSChris Mason 	old = btrfs_lock_root_node(root);
9199fa8cfe7SChris Mason 	btrfs_cow_block(trans, root, old, NULL, 0, &old);
9205d4f98a2SYan Zheng 	btrfs_set_lock_blocking(old);
9213063d29fSChris Mason 
922925baeddSChris Mason 	btrfs_copy_root(trans, root, old, &tmp, objectid);
923925baeddSChris Mason 	btrfs_tree_unlock(old);
924925baeddSChris Mason 	free_extent_buffer(old);
9253063d29fSChris Mason 
9265d4f98a2SYan Zheng 	btrfs_set_root_node(new_root_item, tmp);
927a22285a6SYan, Zheng 	/* record when the snapshot was created in key.offset */
928a22285a6SYan, Zheng 	key.offset = trans->transid;
929a22285a6SYan, Zheng 	ret = btrfs_insert_root(trans, tree_root, &key, new_root_item);
930925baeddSChris Mason 	btrfs_tree_unlock(tmp);
9313063d29fSChris Mason 	free_extent_buffer(tmp);
9320660b5afSChris Mason 	BUG_ON(ret);
9330660b5afSChris Mason 
934a22285a6SYan, Zheng 	/*
935a22285a6SYan, Zheng 	 * insert root back/forward references
936a22285a6SYan, Zheng 	 */
937a22285a6SYan, Zheng 	ret = btrfs_add_root_ref(trans, tree_root, objectid,
938a22285a6SYan, Zheng 				 parent_root->root_key.objectid,
939a22285a6SYan, Zheng 				 parent_inode->i_ino, index,
940a22285a6SYan, Zheng 				 dentry->d_name.name, dentry->d_name.len);
941a22285a6SYan, Zheng 	BUG_ON(ret);
942a22285a6SYan, Zheng 
943a22285a6SYan, Zheng 	key.offset = (u64)-1;
944a22285a6SYan, Zheng 	pending->snap = btrfs_read_fs_root_no_name(root->fs_info, &key);
945a22285a6SYan, Zheng 	BUG_ON(IS_ERR(pending->snap));
946d68fc57bSYan, Zheng 
9473fd0a558SYan, Zheng 	btrfs_reloc_post_snapshot(trans, pending);
948d68fc57bSYan, Zheng 	btrfs_orphan_post_snapshot(trans, pending);
9493063d29fSChris Mason fail:
9506bdb72deSSage Weil 	kfree(new_root_item);
951a22285a6SYan, Zheng 	btrfs_block_rsv_release(root, &pending->block_rsv, (u64)-1);
952a22285a6SYan, Zheng 	return 0;
9533063d29fSChris Mason }
9543063d29fSChris Mason 
955d352ac68SChris Mason /*
956d352ac68SChris Mason  * create all the snapshots we've scheduled for creation
957d352ac68SChris Mason  */
95880b6794dSChris Mason static noinline int create_pending_snapshots(struct btrfs_trans_handle *trans,
9593063d29fSChris Mason 					     struct btrfs_fs_info *fs_info)
9603063d29fSChris Mason {
9613063d29fSChris Mason 	struct btrfs_pending_snapshot *pending;
9623063d29fSChris Mason 	struct list_head *head = &trans->transaction->pending_snapshots;
9633de4586cSChris Mason 	int ret;
9643de4586cSChris Mason 
965c6e30871SQinghuang Feng 	list_for_each_entry(pending, head, list) {
9663de4586cSChris Mason 		ret = create_pending_snapshot(trans, fs_info, pending);
9673de4586cSChris Mason 		BUG_ON(ret);
9683de4586cSChris Mason 	}
9693de4586cSChris Mason 	return 0;
9703de4586cSChris Mason }
9713de4586cSChris Mason 
9725d4f98a2SYan Zheng static void update_super_roots(struct btrfs_root *root)
9735d4f98a2SYan Zheng {
9745d4f98a2SYan Zheng 	struct btrfs_root_item *root_item;
9755d4f98a2SYan Zheng 	struct btrfs_super_block *super;
9765d4f98a2SYan Zheng 
9775d4f98a2SYan Zheng 	super = &root->fs_info->super_copy;
9785d4f98a2SYan Zheng 
9795d4f98a2SYan Zheng 	root_item = &root->fs_info->chunk_root->root_item;
9805d4f98a2SYan Zheng 	super->chunk_root = root_item->bytenr;
9815d4f98a2SYan Zheng 	super->chunk_root_generation = root_item->generation;
9825d4f98a2SYan Zheng 	super->chunk_root_level = root_item->level;
9835d4f98a2SYan Zheng 
9845d4f98a2SYan Zheng 	root_item = &root->fs_info->tree_root->root_item;
9855d4f98a2SYan Zheng 	super->root = root_item->bytenr;
9865d4f98a2SYan Zheng 	super->generation = root_item->generation;
9875d4f98a2SYan Zheng 	super->root_level = root_item->level;
9880af3d00bSJosef Bacik 	if (super->cache_generation != 0 || btrfs_test_opt(root, SPACE_CACHE))
9890af3d00bSJosef Bacik 		super->cache_generation = root_item->generation;
9905d4f98a2SYan Zheng }
9915d4f98a2SYan Zheng 
992f36f3042SChris Mason int btrfs_transaction_in_commit(struct btrfs_fs_info *info)
993f36f3042SChris Mason {
994f36f3042SChris Mason 	int ret = 0;
995f36f3042SChris Mason 	spin_lock(&info->new_trans_lock);
996f36f3042SChris Mason 	if (info->running_transaction)
997f36f3042SChris Mason 		ret = info->running_transaction->in_commit;
998f36f3042SChris Mason 	spin_unlock(&info->new_trans_lock);
999f36f3042SChris Mason 	return ret;
1000f36f3042SChris Mason }
1001f36f3042SChris Mason 
10028929ecfaSYan, Zheng int btrfs_transaction_blocked(struct btrfs_fs_info *info)
10038929ecfaSYan, Zheng {
10048929ecfaSYan, Zheng 	int ret = 0;
10058929ecfaSYan, Zheng 	spin_lock(&info->new_trans_lock);
10068929ecfaSYan, Zheng 	if (info->running_transaction)
10078929ecfaSYan, Zheng 		ret = info->running_transaction->blocked;
10088929ecfaSYan, Zheng 	spin_unlock(&info->new_trans_lock);
10098929ecfaSYan, Zheng 	return ret;
10108929ecfaSYan, Zheng }
10118929ecfaSYan, Zheng 
101279154b1bSChris Mason int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
101379154b1bSChris Mason 			     struct btrfs_root *root)
101479154b1bSChris Mason {
101515ee9bc7SJosef Bacik 	unsigned long joined = 0;
101615ee9bc7SJosef Bacik 	unsigned long timeout = 1;
101779154b1bSChris Mason 	struct btrfs_transaction *cur_trans;
10188fd17795SChris Mason 	struct btrfs_transaction *prev_trans = NULL;
101979154b1bSChris Mason 	DEFINE_WAIT(wait);
102015ee9bc7SJosef Bacik 	int ret;
102189573b9cSChris Mason 	int should_grow = 0;
102289573b9cSChris Mason 	unsigned long now = get_seconds();
1023dccae999SSage Weil 	int flush_on_commit = btrfs_test_opt(root, FLUSHONCOMMIT);
102479154b1bSChris Mason 
10255a3f23d5SChris Mason 	btrfs_run_ordered_operations(root, 0);
10265a3f23d5SChris Mason 
102756bec294SChris Mason 	/* make a pass through all the delayed refs we have so far
102856bec294SChris Mason 	 * any runnings procs may add more while we are here
102956bec294SChris Mason 	 */
103056bec294SChris Mason 	ret = btrfs_run_delayed_refs(trans, root, 0);
103156bec294SChris Mason 	BUG_ON(ret);
103256bec294SChris Mason 
1033a22285a6SYan, Zheng 	btrfs_trans_release_metadata(trans, root);
1034a22285a6SYan, Zheng 
1035b7ec40d7SChris Mason 	cur_trans = trans->transaction;
103656bec294SChris Mason 	/*
103756bec294SChris Mason 	 * set the flushing flag so procs in this transaction have to
103856bec294SChris Mason 	 * start sending their work down.
103956bec294SChris Mason 	 */
1040b7ec40d7SChris Mason 	cur_trans->delayed_refs.flushing = 1;
104156bec294SChris Mason 
1042c3e69d58SChris Mason 	ret = btrfs_run_delayed_refs(trans, root, 0);
104356bec294SChris Mason 	BUG_ON(ret);
104456bec294SChris Mason 
104579154b1bSChris Mason 	mutex_lock(&root->fs_info->trans_mutex);
1046b7ec40d7SChris Mason 	if (cur_trans->in_commit) {
1047b7ec40d7SChris Mason 		cur_trans->use_count++;
1048ccd467d6SChris Mason 		mutex_unlock(&root->fs_info->trans_mutex);
104979154b1bSChris Mason 		btrfs_end_transaction(trans, root);
1050ccd467d6SChris Mason 
105179154b1bSChris Mason 		ret = wait_for_commit(root, cur_trans);
105279154b1bSChris Mason 		BUG_ON(ret);
105315ee9bc7SJosef Bacik 
105415ee9bc7SJosef Bacik 		mutex_lock(&root->fs_info->trans_mutex);
105579154b1bSChris Mason 		put_transaction(cur_trans);
105615ee9bc7SJosef Bacik 		mutex_unlock(&root->fs_info->trans_mutex);
105715ee9bc7SJosef Bacik 
105879154b1bSChris Mason 		return 0;
105979154b1bSChris Mason 	}
10604313b399SChris Mason 
10612c90e5d6SChris Mason 	trans->transaction->in_commit = 1;
1062f9295749SChris Mason 	trans->transaction->blocked = 1;
1063ccd467d6SChris Mason 	if (cur_trans->list.prev != &root->fs_info->trans_list) {
1064ccd467d6SChris Mason 		prev_trans = list_entry(cur_trans->list.prev,
1065ccd467d6SChris Mason 					struct btrfs_transaction, list);
1066ccd467d6SChris Mason 		if (!prev_trans->commit_done) {
1067ccd467d6SChris Mason 			prev_trans->use_count++;
1068ccd467d6SChris Mason 			mutex_unlock(&root->fs_info->trans_mutex);
1069ccd467d6SChris Mason 
1070ccd467d6SChris Mason 			wait_for_commit(root, prev_trans);
1071ccd467d6SChris Mason 
1072ccd467d6SChris Mason 			mutex_lock(&root->fs_info->trans_mutex);
107315ee9bc7SJosef Bacik 			put_transaction(prev_trans);
1074ccd467d6SChris Mason 		}
1075ccd467d6SChris Mason 	}
107615ee9bc7SJosef Bacik 
107789573b9cSChris Mason 	if (now < cur_trans->start_time || now - cur_trans->start_time < 1)
107889573b9cSChris Mason 		should_grow = 1;
107989573b9cSChris Mason 
108015ee9bc7SJosef Bacik 	do {
10817ea394f1SYan Zheng 		int snap_pending = 0;
108215ee9bc7SJosef Bacik 		joined = cur_trans->num_joined;
10837ea394f1SYan Zheng 		if (!list_empty(&trans->transaction->pending_snapshots))
10847ea394f1SYan Zheng 			snap_pending = 1;
10857ea394f1SYan Zheng 
10862c90e5d6SChris Mason 		WARN_ON(cur_trans != trans->transaction);
108715ee9bc7SJosef Bacik 		if (cur_trans->num_writers > 1)
108815ee9bc7SJosef Bacik 			timeout = MAX_SCHEDULE_TIMEOUT;
108989573b9cSChris Mason 		else if (should_grow)
109015ee9bc7SJosef Bacik 			timeout = 1;
109115ee9bc7SJosef Bacik 
109279154b1bSChris Mason 		mutex_unlock(&root->fs_info->trans_mutex);
109315ee9bc7SJosef Bacik 
10940bdb1db2SSage Weil 		if (flush_on_commit || snap_pending) {
109524bbcf04SYan, Zheng 			btrfs_start_delalloc_inodes(root, 1);
109624bbcf04SYan, Zheng 			ret = btrfs_wait_ordered_extents(root, 0, 1);
1097ebecd3d9SSage Weil 			BUG_ON(ret);
10987ea394f1SYan Zheng 		}
10997ea394f1SYan Zheng 
11005a3f23d5SChris Mason 		/*
11015a3f23d5SChris Mason 		 * rename don't use btrfs_join_transaction, so, once we
11025a3f23d5SChris Mason 		 * set the transaction to blocked above, we aren't going
11035a3f23d5SChris Mason 		 * to get any new ordered operations.  We can safely run
11045a3f23d5SChris Mason 		 * it here and no for sure that nothing new will be added
11055a3f23d5SChris Mason 		 * to the list
11065a3f23d5SChris Mason 		 */
11075a3f23d5SChris Mason 		btrfs_run_ordered_operations(root, 1);
11085a3f23d5SChris Mason 
1109ed3b3d31SChris Mason 		prepare_to_wait(&cur_trans->writer_wait, &wait,
1110ed3b3d31SChris Mason 				TASK_UNINTERRUPTIBLE);
1111ed3b3d31SChris Mason 
111289573b9cSChris Mason 		smp_mb();
111389573b9cSChris Mason 		if (cur_trans->num_writers > 1 || should_grow)
111415ee9bc7SJosef Bacik 			schedule_timeout(timeout);
111515ee9bc7SJosef Bacik 
111679154b1bSChris Mason 		mutex_lock(&root->fs_info->trans_mutex);
111715ee9bc7SJosef Bacik 		finish_wait(&cur_trans->writer_wait, &wait);
111815ee9bc7SJosef Bacik 	} while (cur_trans->num_writers > 1 ||
111989573b9cSChris Mason 		 (should_grow && cur_trans->num_joined != joined));
112015ee9bc7SJosef Bacik 
11213063d29fSChris Mason 	ret = create_pending_snapshots(trans, root->fs_info);
11223063d29fSChris Mason 	BUG_ON(ret);
11233063d29fSChris Mason 
112456bec294SChris Mason 	ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
112556bec294SChris Mason 	BUG_ON(ret);
112656bec294SChris Mason 
11272c90e5d6SChris Mason 	WARN_ON(cur_trans != trans->transaction);
1128dc17ff8fSChris Mason 
1129e02119d5SChris Mason 	/* btrfs_commit_tree_roots is responsible for getting the
1130e02119d5SChris Mason 	 * various roots consistent with each other.  Every pointer
1131e02119d5SChris Mason 	 * in the tree of tree roots has to point to the most up to date
1132e02119d5SChris Mason 	 * root for every subvolume and other tree.  So, we have to keep
1133e02119d5SChris Mason 	 * the tree logging code from jumping in and changing any
1134e02119d5SChris Mason 	 * of the trees.
1135e02119d5SChris Mason 	 *
1136e02119d5SChris Mason 	 * At this point in the commit, there can't be any tree-log
1137e02119d5SChris Mason 	 * writers, but a little lower down we drop the trans mutex
1138e02119d5SChris Mason 	 * and let new people in.  By holding the tree_log_mutex
1139e02119d5SChris Mason 	 * from now until after the super is written, we avoid races
1140e02119d5SChris Mason 	 * with the tree-log code.
1141e02119d5SChris Mason 	 */
1142e02119d5SChris Mason 	mutex_lock(&root->fs_info->tree_log_mutex);
11431a40e23bSZheng Yan 
11445d4f98a2SYan Zheng 	ret = commit_fs_roots(trans, root);
114554aa1f4dSChris Mason 	BUG_ON(ret);
114654aa1f4dSChris Mason 
11475d4f98a2SYan Zheng 	/* commit_fs_roots gets rid of all the tree log roots, it is now
1148e02119d5SChris Mason 	 * safe to free the root of tree log roots
1149e02119d5SChris Mason 	 */
1150e02119d5SChris Mason 	btrfs_free_log_root_tree(trans, root->fs_info);
1151e02119d5SChris Mason 
11525d4f98a2SYan Zheng 	ret = commit_cowonly_roots(trans, root);
115379154b1bSChris Mason 	BUG_ON(ret);
115454aa1f4dSChris Mason 
115511833d66SYan Zheng 	btrfs_prepare_extent_commit(trans, root);
115611833d66SYan Zheng 
115778fae27eSChris Mason 	cur_trans = root->fs_info->running_transaction;
1158cee36a03SChris Mason 	spin_lock(&root->fs_info->new_trans_lock);
115978fae27eSChris Mason 	root->fs_info->running_transaction = NULL;
1160cee36a03SChris Mason 	spin_unlock(&root->fs_info->new_trans_lock);
11615f39d397SChris Mason 
11625d4f98a2SYan Zheng 	btrfs_set_root_node(&root->fs_info->tree_root->root_item,
11635d4f98a2SYan Zheng 			    root->fs_info->tree_root->node);
1164817d52f8SJosef Bacik 	switch_commit_root(root->fs_info->tree_root);
11655d4f98a2SYan Zheng 
11665d4f98a2SYan Zheng 	btrfs_set_root_node(&root->fs_info->chunk_root->root_item,
11675d4f98a2SYan Zheng 			    root->fs_info->chunk_root->node);
1168817d52f8SJosef Bacik 	switch_commit_root(root->fs_info->chunk_root);
11695d4f98a2SYan Zheng 
11705d4f98a2SYan Zheng 	update_super_roots(root);
1171e02119d5SChris Mason 
1172e02119d5SChris Mason 	if (!root->fs_info->log_root_recovering) {
1173e02119d5SChris Mason 		btrfs_set_super_log_root(&root->fs_info->super_copy, 0);
1174e02119d5SChris Mason 		btrfs_set_super_log_root_level(&root->fs_info->super_copy, 0);
1175e02119d5SChris Mason 	}
1176e02119d5SChris Mason 
1177a061fc8dSChris Mason 	memcpy(&root->fs_info->super_for_commit, &root->fs_info->super_copy,
11784b52dff6SChris Mason 	       sizeof(root->fs_info->super_copy));
1179ccd467d6SChris Mason 
1180f9295749SChris Mason 	trans->transaction->blocked = 0;
1181b7ec40d7SChris Mason 
1182f9295749SChris Mason 	wake_up(&root->fs_info->transaction_wait);
1183e6dcd2dcSChris Mason 
118478fae27eSChris Mason 	mutex_unlock(&root->fs_info->trans_mutex);
118579154b1bSChris Mason 	ret = btrfs_write_and_wait_transaction(trans, root);
118679154b1bSChris Mason 	BUG_ON(ret);
1187a512bbf8SYan Zheng 	write_ctree_super(trans, root, 0);
11884313b399SChris Mason 
1189e02119d5SChris Mason 	/*
1190e02119d5SChris Mason 	 * the super is written, we can safely allow the tree-loggers
1191e02119d5SChris Mason 	 * to go about their business
1192e02119d5SChris Mason 	 */
1193e02119d5SChris Mason 	mutex_unlock(&root->fs_info->tree_log_mutex);
1194e02119d5SChris Mason 
119511833d66SYan Zheng 	btrfs_finish_extent_commit(trans, root);
11964313b399SChris Mason 
11971a40e23bSZheng Yan 	mutex_lock(&root->fs_info->trans_mutex);
11981a40e23bSZheng Yan 
11992c90e5d6SChris Mason 	cur_trans->commit_done = 1;
1200b7ec40d7SChris Mason 
120115ee9bc7SJosef Bacik 	root->fs_info->last_trans_committed = cur_trans->transid;
1202817d52f8SJosef Bacik 
12032c90e5d6SChris Mason 	wake_up(&cur_trans->commit_wait);
12043de4586cSChris Mason 
120579154b1bSChris Mason 	put_transaction(cur_trans);
120678fae27eSChris Mason 	put_transaction(cur_trans);
120758176a96SJosef Bacik 
120878fae27eSChris Mason 	mutex_unlock(&root->fs_info->trans_mutex);
12093de4586cSChris Mason 
12109ed74f2dSJosef Bacik 	if (current->journal_info == trans)
12119ed74f2dSJosef Bacik 		current->journal_info = NULL;
12129ed74f2dSJosef Bacik 
12132c90e5d6SChris Mason 	kmem_cache_free(btrfs_trans_handle_cachep, trans);
121424bbcf04SYan, Zheng 
121524bbcf04SYan, Zheng 	if (current != root->fs_info->transaction_kthread)
121624bbcf04SYan, Zheng 		btrfs_run_delayed_iputs(root);
121724bbcf04SYan, Zheng 
121879154b1bSChris Mason 	return ret;
121979154b1bSChris Mason }
122079154b1bSChris Mason 
1221d352ac68SChris Mason /*
1222d352ac68SChris Mason  * interface function to delete all the snapshots we have scheduled for deletion
1223d352ac68SChris Mason  */
1224e9d0b13bSChris Mason int btrfs_clean_old_snapshots(struct btrfs_root *root)
1225e9d0b13bSChris Mason {
12265d4f98a2SYan Zheng 	LIST_HEAD(list);
12275d4f98a2SYan Zheng 	struct btrfs_fs_info *fs_info = root->fs_info;
1228e9d0b13bSChris Mason 
12295d4f98a2SYan Zheng 	mutex_lock(&fs_info->trans_mutex);
12305d4f98a2SYan Zheng 	list_splice_init(&fs_info->dead_roots, &list);
12315d4f98a2SYan Zheng 	mutex_unlock(&fs_info->trans_mutex);
12325d4f98a2SYan Zheng 
12335d4f98a2SYan Zheng 	while (!list_empty(&list)) {
12345d4f98a2SYan Zheng 		root = list_entry(list.next, struct btrfs_root, root_list);
123576dda93cSYan, Zheng 		list_del(&root->root_list);
123676dda93cSYan, Zheng 
123776dda93cSYan, Zheng 		if (btrfs_header_backref_rev(root->node) <
123876dda93cSYan, Zheng 		    BTRFS_MIXED_BACKREF_REV)
12393fd0a558SYan, Zheng 			btrfs_drop_snapshot(root, NULL, 0);
124076dda93cSYan, Zheng 		else
12413fd0a558SYan, Zheng 			btrfs_drop_snapshot(root, NULL, 1);
1242e9d0b13bSChris Mason 	}
1243e9d0b13bSChris Mason 	return 0;
1244e9d0b13bSChris Mason }
1245