xref: /linux-6.15/fs/jbd2/commit.c (revision dd3932ed)
1470decc6SDave Kleikamp /*
2f7f4bccbSMingming Cao  * linux/fs/jbd2/commit.c
3470decc6SDave Kleikamp  *
4470decc6SDave Kleikamp  * Written by Stephen C. Tweedie <[email protected]>, 1998
5470decc6SDave Kleikamp  *
6470decc6SDave Kleikamp  * Copyright 1998 Red Hat corp --- All Rights Reserved
7470decc6SDave Kleikamp  *
8470decc6SDave Kleikamp  * This file is part of the Linux kernel and is made available under
9470decc6SDave Kleikamp  * the terms of the GNU General Public License, version 2, or at your
10470decc6SDave Kleikamp  * option, any later version, incorporated herein by reference.
11470decc6SDave Kleikamp  *
12470decc6SDave Kleikamp  * Journal commit routines for the generic filesystem journaling code;
13470decc6SDave Kleikamp  * part of the ext2fs journaling system.
14470decc6SDave Kleikamp  */
15470decc6SDave Kleikamp 
16470decc6SDave Kleikamp #include <linux/time.h>
17470decc6SDave Kleikamp #include <linux/fs.h>
18f7f4bccbSMingming Cao #include <linux/jbd2.h>
19470decc6SDave Kleikamp #include <linux/errno.h>
20470decc6SDave Kleikamp #include <linux/slab.h>
21470decc6SDave Kleikamp #include <linux/mm.h>
22470decc6SDave Kleikamp #include <linux/pagemap.h>
238e85fb3fSJohann Lombardi #include <linux/jiffies.h>
24818d276cSGirish Shilamkar #include <linux/crc32.h>
25cd1aac32SAneesh Kumar K.V #include <linux/writeback.h>
26cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h>
27fd98496fSTheodore Ts'o #include <linux/bio.h>
280e3d2a63STheodore Ts'o #include <linux/blkdev.h>
29879c5e6bSTheodore Ts'o #include <trace/events/jbd2.h>
30470decc6SDave Kleikamp 
31470decc6SDave Kleikamp /*
32470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
33470decc6SDave Kleikamp  */
34470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
35470decc6SDave Kleikamp {
36470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
37470decc6SDave Kleikamp 	if (uptodate)
38470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
39470decc6SDave Kleikamp 	else
40470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
41470decc6SDave Kleikamp 	unlock_buffer(bh);
42470decc6SDave Kleikamp }
43470decc6SDave Kleikamp 
44470decc6SDave Kleikamp /*
4587c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4687c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
47470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
48470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
49470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
50470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
51470decc6SDave Kleikamp  *
52470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
53470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
54470decc6SDave Kleikamp  *
55470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
56470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
57470decc6SDave Kleikamp  */
58470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
59470decc6SDave Kleikamp {
60470decc6SDave Kleikamp 	struct page *page;
61470decc6SDave Kleikamp 
62470decc6SDave Kleikamp 	if (buffer_dirty(bh))
63470decc6SDave Kleikamp 		goto nope;
64470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
65470decc6SDave Kleikamp 		goto nope;
66470decc6SDave Kleikamp 	page = bh->b_page;
67470decc6SDave Kleikamp 	if (!page)
68470decc6SDave Kleikamp 		goto nope;
69470decc6SDave Kleikamp 	if (page->mapping)
70470decc6SDave Kleikamp 		goto nope;
71470decc6SDave Kleikamp 
72470decc6SDave Kleikamp 	/* OK, it's a truncated page */
73529ae9aaSNick Piggin 	if (!trylock_page(page))
74470decc6SDave Kleikamp 		goto nope;
75470decc6SDave Kleikamp 
76470decc6SDave Kleikamp 	page_cache_get(page);
77470decc6SDave Kleikamp 	__brelse(bh);
78470decc6SDave Kleikamp 	try_to_free_buffers(page);
79470decc6SDave Kleikamp 	unlock_page(page);
80470decc6SDave Kleikamp 	page_cache_release(page);
81470decc6SDave Kleikamp 	return;
82470decc6SDave Kleikamp 
83470decc6SDave Kleikamp nope:
84470decc6SDave Kleikamp 	__brelse(bh);
85470decc6SDave Kleikamp }
86470decc6SDave Kleikamp 
87470decc6SDave Kleikamp /*
88818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
89470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
90470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
91470decc6SDave Kleikamp  * entirely.
92470decc6SDave Kleikamp  *
93470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
94470decc6SDave Kleikamp  */
95818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
96818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
97818d276cSGirish Shilamkar 					struct buffer_head **cbh,
98818d276cSGirish Shilamkar 					__u32 crc32_sum)
99470decc6SDave Kleikamp {
100470decc6SDave Kleikamp 	struct journal_head *descriptor;
101818d276cSGirish Shilamkar 	struct commit_header *tmp;
102470decc6SDave Kleikamp 	struct buffer_head *bh;
103818d276cSGirish Shilamkar 	int ret;
104736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
105470decc6SDave Kleikamp 
106470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
107470decc6SDave Kleikamp 		return 0;
108470decc6SDave Kleikamp 
109f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
110470decc6SDave Kleikamp 	if (!descriptor)
111470decc6SDave Kleikamp 		return 1;
112470decc6SDave Kleikamp 
113470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
114470decc6SDave Kleikamp 
115818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
116f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
117f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
118470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
119736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
120736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
121818d276cSGirish Shilamkar 
122818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
123818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
124818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
125818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
126818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
127470decc6SDave Kleikamp 	}
128470decc6SDave Kleikamp 
129818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
130818d276cSGirish Shilamkar 	lock_buffer(bh);
13145a90bfdSTheodore Ts'o 	clear_buffer_dirty(bh);
132818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
133818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
134818d276cSGirish Shilamkar 
135818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1364d605179SAneesh Kumar K.V 	    !JBD2_HAS_INCOMPAT_FEATURE(journal,
1379c35575bSChristoph Hellwig 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT))
1389c35575bSChristoph Hellwig 		ret = submit_bh(WRITE_SYNC_PLUG | WRITE_FLUSH_FUA, bh);
1399c35575bSChristoph Hellwig 	else
1409c35575bSChristoph Hellwig 		ret = submit_bh(WRITE_SYNC_PLUG, bh);
141470decc6SDave Kleikamp 
142818d276cSGirish Shilamkar 	*cbh = bh;
143818d276cSGirish Shilamkar 	return ret;
144818d276cSGirish Shilamkar }
145470decc6SDave Kleikamp 
146818d276cSGirish Shilamkar /*
147818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
148818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
149818d276cSGirish Shilamkar  */
150fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal,
151fd98496fSTheodore Ts'o 					 struct buffer_head *bh)
152818d276cSGirish Shilamkar {
153818d276cSGirish Shilamkar 	int ret = 0;
154818d276cSGirish Shilamkar 
155818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
156818d276cSGirish Shilamkar 	wait_on_buffer(bh);
157818d276cSGirish Shilamkar 
158818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
159818d276cSGirish Shilamkar 		ret = -EIO;
160818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
161818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
162818d276cSGirish Shilamkar 
163818d276cSGirish Shilamkar 	return ret;
164818d276cSGirish Shilamkar }
165818d276cSGirish Shilamkar 
166818d276cSGirish Shilamkar /*
167cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
168cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
169cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
170cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
171cd1aac32SAneesh Kumar K.V  */
172cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
173cd1aac32SAneesh Kumar K.V {
174cd1aac32SAneesh Kumar K.V 	int ret;
175cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
176cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
177cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
178cd1aac32SAneesh Kumar K.V 		.range_start = 0,
179cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
180cd1aac32SAneesh Kumar K.V 	};
181cd1aac32SAneesh Kumar K.V 
182cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
183cd1aac32SAneesh Kumar K.V 	return ret;
184cd1aac32SAneesh Kumar K.V }
185cd1aac32SAneesh Kumar K.V 
186cd1aac32SAneesh Kumar K.V /*
187c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
188c851ed54SJan Kara  * disk.
189c851ed54SJan Kara  *
190c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
191c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
192c851ed54SJan Kara  * operate on from being released while we write out pages.
193c851ed54SJan Kara  */
194cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
195c851ed54SJan Kara 		transaction_t *commit_transaction)
196c851ed54SJan Kara {
197c851ed54SJan Kara 	struct jbd2_inode *jinode;
198c851ed54SJan Kara 	int err, ret = 0;
199c851ed54SJan Kara 	struct address_space *mapping;
200c851ed54SJan Kara 
201c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
202c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
203c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
204c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
205c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
206cd1aac32SAneesh Kumar K.V 		/*
207cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
208cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
209cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
210cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
211cd1aac32SAneesh Kumar K.V 		 */
212879c5e6bSTheodore Ts'o 		trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
213cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
214c851ed54SJan Kara 		if (!ret)
215c851ed54SJan Kara 			ret = err;
216c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
217c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
218cc3e1beaSTheodore Ts'o 		commit_transaction->t_flushed_data_blocks = 1;
219c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
220c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
221c851ed54SJan Kara 	}
222c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
223c851ed54SJan Kara 	return ret;
224c851ed54SJan Kara }
225c851ed54SJan Kara 
226c851ed54SJan Kara /*
227c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
228c851ed54SJan Kara  * transaction if needed.
229c851ed54SJan Kara  *
230c851ed54SJan Kara  */
231c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
232c851ed54SJan Kara 		transaction_t *commit_transaction)
233c851ed54SJan Kara {
234c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
235c851ed54SJan Kara 	int err, ret = 0;
236c851ed54SJan Kara 
237cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
238c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
239c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
240c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
241c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
242c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
243e9e34f4eSHidehiro Kawai 		if (err) {
244e9e34f4eSHidehiro Kawai 			/*
245e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
24694004ed7SChristoph Hellwig 			 * filemap_fdatawait_range(), set it again so
247e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
248e9e34f4eSHidehiro Kawai 			 */
249e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
250e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
251e9e34f4eSHidehiro Kawai 
252c851ed54SJan Kara 			if (!ret)
253c851ed54SJan Kara 				ret = err;
254e9e34f4eSHidehiro Kawai 		}
255c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
256c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
257c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
258c851ed54SJan Kara 	}
259c851ed54SJan Kara 
260c851ed54SJan Kara 	/* Now refile inode to proper lists */
261c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
262c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
263c851ed54SJan Kara 		list_del(&jinode->i_list);
264c851ed54SJan Kara 		if (jinode->i_next_transaction) {
265c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
266c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
267c851ed54SJan Kara 			list_add(&jinode->i_list,
268c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
269c851ed54SJan Kara 		} else {
270c851ed54SJan Kara 			jinode->i_transaction = NULL;
271c851ed54SJan Kara 		}
272c851ed54SJan Kara 	}
273c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
274c851ed54SJan Kara 
275c851ed54SJan Kara 	return ret;
276c851ed54SJan Kara }
277c851ed54SJan Kara 
278818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
279818d276cSGirish Shilamkar {
280818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
281818d276cSGirish Shilamkar 	char *addr;
282818d276cSGirish Shilamkar 	__u32 checksum;
283818d276cSGirish Shilamkar 
284818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
285818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
286818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
287818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
288818d276cSGirish Shilamkar 
289818d276cSGirish Shilamkar 	return checksum;
290818d276cSGirish Shilamkar }
291818d276cSGirish Shilamkar 
292818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
29318eba7aaSMingming Cao 				   unsigned long long block)
294b517bea1SZach Brown {
295b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
296cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
297b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
298b517bea1SZach Brown }
299b517bea1SZach Brown 
300470decc6SDave Kleikamp /*
301f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
302470decc6SDave Kleikamp  *
303470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
304470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
305470decc6SDave Kleikamp  */
306f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
307470decc6SDave Kleikamp {
3088e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
309470decc6SDave Kleikamp 	transaction_t *commit_transaction;
310470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
311470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
312470decc6SDave Kleikamp 	int bufs;
313470decc6SDave Kleikamp 	int flags;
314470decc6SDave Kleikamp 	int err;
31518eba7aaSMingming Cao 	unsigned long long blocknr;
316e07f7183SJosef Bacik 	ktime_t start_time;
317e07f7183SJosef Bacik 	u64 commit_time;
318470decc6SDave Kleikamp 	char *tagp = NULL;
319470decc6SDave Kleikamp 	journal_header_t *header;
320470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
321470decc6SDave Kleikamp 	int space_left = 0;
322470decc6SDave Kleikamp 	int first_tag = 0;
323470decc6SDave Kleikamp 	int tag_flag;
324fb68407bSAneesh Kumar K.V 	int i, to_free = 0;
325b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
326818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
327818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
3287058548cSTheodore Ts'o 	int write_op = WRITE;
329470decc6SDave Kleikamp 
330470decc6SDave Kleikamp 	/*
331470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
332470decc6SDave Kleikamp 	 * all outstanding updates to complete.
333470decc6SDave Kleikamp 	 */
334470decc6SDave Kleikamp 
335470decc6SDave Kleikamp #ifdef COMMIT_STATS
336470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
337470decc6SDave Kleikamp 	summarise_journal_usage(journal);
338470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
339470decc6SDave Kleikamp #endif
340470decc6SDave Kleikamp 
341f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
342f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
343470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
344f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
345470decc6SDave Kleikamp 	} else {
346470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
347470decc6SDave Kleikamp 	}
348470decc6SDave Kleikamp 
349470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
350470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
351470decc6SDave Kleikamp 
352470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
353470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
354470decc6SDave Kleikamp 
355879c5e6bSTheodore Ts'o 	trace_jbd2_start_commit(journal, commit_transaction);
356470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
357470decc6SDave Kleikamp 			commit_transaction->t_tid);
358470decc6SDave Kleikamp 
359a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
360470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
361470decc6SDave Kleikamp 
3624194b1eaSJens Axboe 	/*
3634194b1eaSJens Axboe 	 * Use plugged writes here, since we want to submit several before
3644194b1eaSJens Axboe 	 * we unplug the device. We don't do explicit unplugging in here,
3654194b1eaSJens Axboe 	 * instead we rely on sync_buffer() doing the unplug for us.
3664194b1eaSJens Axboe 	 */
3677058548cSTheodore Ts'o 	if (commit_transaction->t_synchronous_commit)
3684194b1eaSJens Axboe 		write_op = WRITE_SYNC_PLUG;
369879c5e6bSTheodore Ts'o 	trace_jbd2_commit_locking(journal, commit_transaction);
370bf699327STheodore Ts'o 	stats.run.rs_wait = commit_transaction->t_max_wait;
371bf699327STheodore Ts'o 	stats.run.rs_locked = jiffies;
372bf699327STheodore Ts'o 	stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
373bf699327STheodore Ts'o 					      stats.run.rs_locked);
3748e85fb3fSJohann Lombardi 
375470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
376a51dca9cSTheodore Ts'o 	while (atomic_read(&commit_transaction->t_updates)) {
377470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
378470decc6SDave Kleikamp 
379470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
380470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
381a51dca9cSTheodore Ts'o 		if (atomic_read(&commit_transaction->t_updates)) {
382470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
383a931da6aSTheodore Ts'o 			write_unlock(&journal->j_state_lock);
384470decc6SDave Kleikamp 			schedule();
385a931da6aSTheodore Ts'o 			write_lock(&journal->j_state_lock);
386470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
387470decc6SDave Kleikamp 		}
388470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
389470decc6SDave Kleikamp 	}
390470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
391470decc6SDave Kleikamp 
392a51dca9cSTheodore Ts'o 	J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
393470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
394470decc6SDave Kleikamp 
395470decc6SDave Kleikamp 	/*
396470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
397470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
398470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
399470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
400f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
401470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
402470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
403470decc6SDave Kleikamp 	 *
404470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
405470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
406470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
407470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
408f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
409470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
410470decc6SDave Kleikamp 	 */
411470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
412470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
413470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
414470decc6SDave Kleikamp 		/*
415f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
416470decc6SDave Kleikamp 		 * leave undo-committed data.
417470decc6SDave Kleikamp 		 */
418470decc6SDave Kleikamp 		if (jh->b_committed_data) {
419470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
420470decc6SDave Kleikamp 
421470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
422af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
423470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
424470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
425470decc6SDave Kleikamp 		}
426f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
427470decc6SDave Kleikamp 	}
428470decc6SDave Kleikamp 
429470decc6SDave Kleikamp 	/*
430470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
431470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
432470decc6SDave Kleikamp 	 * frees some memory
433470decc6SDave Kleikamp 	 */
434470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
435f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
436470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
437470decc6SDave Kleikamp 
438470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
439470decc6SDave Kleikamp 
440470decc6SDave Kleikamp 	/*
441470decc6SDave Kleikamp 	 * Switch to a new revoke table.
442470decc6SDave Kleikamp 	 */
443f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
444470decc6SDave Kleikamp 
445879c5e6bSTheodore Ts'o 	trace_jbd2_commit_flushing(journal, commit_transaction);
446bf699327STheodore Ts'o 	stats.run.rs_flushing = jiffies;
447bf699327STheodore Ts'o 	stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
448bf699327STheodore Ts'o 					     stats.run.rs_flushing);
4498e85fb3fSJohann Lombardi 
450470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
451470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
452470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
453e07f7183SJosef Bacik 	start_time = ktime_get();
454470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
455470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
456a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
457470decc6SDave Kleikamp 
458470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
459470decc6SDave Kleikamp 
460470decc6SDave Kleikamp 	/*
461470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
462470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
463470decc6SDave Kleikamp 	 */
464cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
465c851ed54SJan Kara 	if (err)
466c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
467470decc6SDave Kleikamp 
46867c457a8STheodore Ts'o 	jbd2_journal_write_revoke_records(journal, commit_transaction,
46967c457a8STheodore Ts'o 					  write_op);
470470decc6SDave Kleikamp 
471470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
472470decc6SDave Kleikamp 
473470decc6SDave Kleikamp 	/*
474470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
475470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
476470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
477470decc6SDave Kleikamp 	 */
478a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
479470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
480a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
481470decc6SDave Kleikamp 
482879c5e6bSTheodore Ts'o 	trace_jbd2_commit_logging(journal, commit_transaction);
483bf699327STheodore Ts'o 	stats.run.rs_logging = jiffies;
484bf699327STheodore Ts'o 	stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
485bf699327STheodore Ts'o 					       stats.run.rs_logging);
486a51dca9cSTheodore Ts'o 	stats.run.rs_blocks =
487a51dca9cSTheodore Ts'o 		atomic_read(&commit_transaction->t_outstanding_credits);
488bf699327STheodore Ts'o 	stats.run.rs_blocks_logged = 0;
4898e85fb3fSJohann Lombardi 
4901dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
491a51dca9cSTheodore Ts'o 		 atomic_read(&commit_transaction->t_outstanding_credits));
4921dfc3220SJosef Bacik 
49387c89c23SJan Kara 	err = 0;
494470decc6SDave Kleikamp 	descriptor = NULL;
495470decc6SDave Kleikamp 	bufs = 0;
496470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
497470decc6SDave Kleikamp 
498470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
499470decc6SDave Kleikamp 
500470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
501470decc6SDave Kleikamp 
502470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
5037ad7445fSHidehiro Kawai 		   release it. */
504470decc6SDave Kleikamp 
505470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
5067ad7445fSHidehiro Kawai 			clear_buffer_jbddirty(jh2bh(jh));
507470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
508e06c8227SJoel Becker 			jbd2_buffer_abort_trigger(jh,
509e06c8227SJoel Becker 						  jh->b_frozen_data ?
510e06c8227SJoel Becker 						  jh->b_frozen_triggers :
511e06c8227SJoel Becker 						  jh->b_triggers);
512f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
513470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
514470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
515470decc6SDave Kleikamp 			 * already allocated, even if we are now
516470decc6SDave Kleikamp 			 * aborting. */
517470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
518470decc6SDave Kleikamp 				goto start_journal_io;
519470decc6SDave Kleikamp 			continue;
520470decc6SDave Kleikamp 		}
521470decc6SDave Kleikamp 
522470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
523470decc6SDave Kleikamp 		   record the metadata buffer. */
524470decc6SDave Kleikamp 
525470decc6SDave Kleikamp 		if (!descriptor) {
526470decc6SDave Kleikamp 			struct buffer_head *bh;
527470decc6SDave Kleikamp 
528470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
529470decc6SDave Kleikamp 
530470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
531470decc6SDave Kleikamp 
532f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
533470decc6SDave Kleikamp 			if (!descriptor) {
534a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
535470decc6SDave Kleikamp 				continue;
536470decc6SDave Kleikamp 			}
537470decc6SDave Kleikamp 
538470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
539470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
540470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
541470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
542f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
543f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
544470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
545470decc6SDave Kleikamp 
546470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
547470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
548470decc6SDave Kleikamp 			first_tag = 1;
549470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
550470decc6SDave Kleikamp 			set_buffer_dirty(bh);
551470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
552470decc6SDave Kleikamp 
553470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
554470decc6SDave Kleikamp                            completion later */
555470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
556f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
557470decc6SDave Kleikamp 					BJ_LogCtl);
558470decc6SDave Kleikamp 		}
559470decc6SDave Kleikamp 
560470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
561470decc6SDave Kleikamp 
562f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
563470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
564470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
565470decc6SDave Kleikamp 		   refile-on-abort condition above. */
566470decc6SDave Kleikamp 		if (err) {
567a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
568470decc6SDave Kleikamp 			continue;
569470decc6SDave Kleikamp 		}
570470decc6SDave Kleikamp 
571470decc6SDave Kleikamp 		/*
572470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
573470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
574f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
575470decc6SDave Kleikamp 		 */
576a51dca9cSTheodore Ts'o 		atomic_dec(&commit_transaction->t_outstanding_credits);
577470decc6SDave Kleikamp 
578470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
579470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
580470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
581470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
582470decc6SDave Kleikamp 
583470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
584470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
585470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
586470decc6SDave Kleikamp 
587470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
588470decc6SDave Kleikamp 		/*
589f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
590470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
591470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
592470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
593470decc6SDave Kleikamp 		 */
594470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
595f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
596470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
597e6ec116bSTheodore Ts'o 		if (flags < 0) {
598e6ec116bSTheodore Ts'o 			jbd2_journal_abort(journal, flags);
599e6ec116bSTheodore Ts'o 			continue;
600e6ec116bSTheodore Ts'o 		}
601470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
602470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
603470decc6SDave Kleikamp 
604470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
605470decc6SDave Kleikamp                    buffer */
606470decc6SDave Kleikamp 
607470decc6SDave Kleikamp 		tag_flag = 0;
608470decc6SDave Kleikamp 		if (flags & 1)
609f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
610470decc6SDave Kleikamp 		if (!first_tag)
611f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
612470decc6SDave Kleikamp 
613470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
614b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
615470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
616b517bea1SZach Brown 		tagp += tag_bytes;
617b517bea1SZach Brown 		space_left -= tag_bytes;
618470decc6SDave Kleikamp 
619470decc6SDave Kleikamp 		if (first_tag) {
620470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
621470decc6SDave Kleikamp 			tagp += 16;
622470decc6SDave Kleikamp 			space_left -= 16;
623470decc6SDave Kleikamp 			first_tag = 0;
624470decc6SDave Kleikamp 		}
625470decc6SDave Kleikamp 
626470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
627470decc6SDave Kleikamp 		   let the IO rip! */
628470decc6SDave Kleikamp 
629470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
630470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
631b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
632470decc6SDave Kleikamp 
633470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
634470decc6SDave Kleikamp 
635470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
636470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
637470decc6SDave Kleikamp                            the last tag we set up. */
638470decc6SDave Kleikamp 
639f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
640470decc6SDave Kleikamp 
641470decc6SDave Kleikamp start_journal_io:
642470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
643470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
644818d276cSGirish Shilamkar 				/*
645818d276cSGirish Shilamkar 				 * Compute checksum.
646818d276cSGirish Shilamkar 				 */
647818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
648818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
649818d276cSGirish Shilamkar 					crc32_sum =
650818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
651818d276cSGirish Shilamkar 				}
652818d276cSGirish Shilamkar 
653470decc6SDave Kleikamp 				lock_buffer(bh);
654470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
655470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
656470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
6577058548cSTheodore Ts'o 				submit_bh(write_op, bh);
658470decc6SDave Kleikamp 			}
659470decc6SDave Kleikamp 			cond_resched();
660bf699327STheodore Ts'o 			stats.run.rs_blocks_logged += bufs;
661470decc6SDave Kleikamp 
662470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
663470decc6SDave Kleikamp                            time round the loop. */
664470decc6SDave Kleikamp 			descriptor = NULL;
665470decc6SDave Kleikamp 			bufs = 0;
666470decc6SDave Kleikamp 		}
667470decc6SDave Kleikamp 	}
668470decc6SDave Kleikamp 
669f73bee49SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
670f73bee49SJan Kara 	if (err) {
671f73bee49SJan Kara 		printk(KERN_WARNING
672f73bee49SJan Kara 			"JBD2: Detected IO errors while flushing file data "
673f73bee49SJan Kara 		       "on %s\n", journal->j_devname);
674f73bee49SJan Kara 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
675f73bee49SJan Kara 			jbd2_journal_abort(journal, err);
676f73bee49SJan Kara 		err = 0;
677f73bee49SJan Kara 	}
678f73bee49SJan Kara 
679cc3e1beaSTheodore Ts'o 	/*
680cc3e1beaSTheodore Ts'o 	 * If the journal is not located on the file system device,
681cc3e1beaSTheodore Ts'o 	 * then we must flush the file system device before we issue
682cc3e1beaSTheodore Ts'o 	 * the commit record
683cc3e1beaSTheodore Ts'o 	 */
684cc3e1beaSTheodore Ts'o 	if (commit_transaction->t_flushed_data_blocks &&
685cc3e1beaSTheodore Ts'o 	    (journal->j_fs_dev != journal->j_dev) &&
686cc3e1beaSTheodore Ts'o 	    (journal->j_flags & JBD2_BARRIER))
687*dd3932edSChristoph Hellwig 		blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL);
688818d276cSGirish Shilamkar 
689cc3e1beaSTheodore Ts'o 	/* Done it all: now write the commit record asynchronously. */
690818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
691818d276cSGirish Shilamkar 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
692818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
693818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
694818d276cSGirish Shilamkar 		if (err)
695818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
696e9e34f4eSHidehiro Kawai 	}
697c851ed54SJan Kara 
698470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
699470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
700470decc6SDave Kleikamp            complete.  Control buffers being written are on the
701470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
702470decc6SDave Kleikamp            the t_iobuf_list queue.
703470decc6SDave Kleikamp 
704470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
705470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
706470decc6SDave Kleikamp 	   so we incur less scheduling load.
707470decc6SDave Kleikamp 	*/
708470decc6SDave Kleikamp 
70987c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
710470decc6SDave Kleikamp 
711470decc6SDave Kleikamp 	/*
712470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
713470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
714470decc6SDave Kleikamp 	 */
715470decc6SDave Kleikamp wait_for_iobuf:
716470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
717470decc6SDave Kleikamp 		struct buffer_head *bh;
718470decc6SDave Kleikamp 
719470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
720470decc6SDave Kleikamp 		bh = jh2bh(jh);
721470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
722470decc6SDave Kleikamp 			wait_on_buffer(bh);
723470decc6SDave Kleikamp 			goto wait_for_iobuf;
724470decc6SDave Kleikamp 		}
725470decc6SDave Kleikamp 		if (cond_resched())
726470decc6SDave Kleikamp 			goto wait_for_iobuf;
727470decc6SDave Kleikamp 
728470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
729470decc6SDave Kleikamp 			err = -EIO;
730470decc6SDave Kleikamp 
731470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
732470decc6SDave Kleikamp 
733470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
734f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
735470decc6SDave Kleikamp 
736470decc6SDave Kleikamp 		/*
737470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
738f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
739470decc6SDave Kleikamp 		 */
740470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
741f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
742470decc6SDave Kleikamp 		__brelse(bh);
743470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
744470decc6SDave Kleikamp 		free_buffer_head(bh);
745470decc6SDave Kleikamp 
746470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
747470decc6SDave Kleikamp                    shadowed buffer */
748470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
749470decc6SDave Kleikamp 		bh = jh2bh(jh);
750470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
751470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
752470decc6SDave Kleikamp 
753470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
754470decc6SDave Kleikamp                    to remember it against this transaction so that when
755470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
756470decc6SDave Kleikamp                    required. */
757470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
758f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
759470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
760470decc6SDave Kleikamp 		   IO to complete */
761470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
762470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
763470decc6SDave Kleikamp 		__brelse(bh);
764470decc6SDave Kleikamp 	}
765470decc6SDave Kleikamp 
766470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
767470decc6SDave Kleikamp 
76887c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
769470decc6SDave Kleikamp 
770470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
771470decc6SDave Kleikamp  wait_for_ctlbuf:
772470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
773470decc6SDave Kleikamp 		struct buffer_head *bh;
774470decc6SDave Kleikamp 
775470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
776470decc6SDave Kleikamp 		bh = jh2bh(jh);
777470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
778470decc6SDave Kleikamp 			wait_on_buffer(bh);
779470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
780470decc6SDave Kleikamp 		}
781470decc6SDave Kleikamp 		if (cond_resched())
782470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
783470decc6SDave Kleikamp 
784470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
785470decc6SDave Kleikamp 			err = -EIO;
786470decc6SDave Kleikamp 
787470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
788470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
789f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
790f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
791470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
792470decc6SDave Kleikamp 		/* AKPM: bforget here */
793470decc6SDave Kleikamp 	}
794470decc6SDave Kleikamp 
79577e841deSHidehiro Kawai 	if (err)
79677e841deSHidehiro Kawai 		jbd2_journal_abort(journal, err);
79777e841deSHidehiro Kawai 
79887c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
799470decc6SDave Kleikamp 
800818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
801818d276cSGirish Shilamkar 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
802818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
803818d276cSGirish Shilamkar 						&cbh, crc32_sum);
804818d276cSGirish Shilamkar 		if (err)
805818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
806818d276cSGirish Shilamkar 	}
807b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
808fd98496fSTheodore Ts'o 		err = journal_wait_on_commit_record(journal, cbh);
809f73bee49SJan Kara 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
810f73bee49SJan Kara 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT) &&
811f73bee49SJan Kara 	    journal->j_flags & JBD2_BARRIER) {
812*dd3932edSChristoph Hellwig 		blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL);
813f73bee49SJan Kara 	}
814470decc6SDave Kleikamp 
815470decc6SDave Kleikamp 	if (err)
816a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
817470decc6SDave Kleikamp 
818470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
819470decc6SDave Kleikamp            processing: any buffers committed as a result of this
820470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
821470decc6SDave Kleikamp            before. */
822470decc6SDave Kleikamp 
82387c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
824470decc6SDave Kleikamp 
825c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
826470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
827470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
828470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
829470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
830470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
831470decc6SDave Kleikamp 
832470decc6SDave Kleikamp restart_loop:
833470decc6SDave Kleikamp 	/*
834470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
835470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
836470decc6SDave Kleikamp 	 */
837470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
838470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
839470decc6SDave Kleikamp 		transaction_t *cp_transaction;
840470decc6SDave Kleikamp 		struct buffer_head *bh;
841470decc6SDave Kleikamp 
842470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
843470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
844470decc6SDave Kleikamp 		bh = jh2bh(jh);
845470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
84623e2af35Sdingdinghua 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
847470decc6SDave Kleikamp 
848470decc6SDave Kleikamp 		/*
849470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
850470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
851470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
852470decc6SDave Kleikamp 		 * field now points to a committed version of the
853470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
854470decc6SDave Kleikamp 		 * data.
855470decc6SDave Kleikamp 		 *
856470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
857e06c8227SJoel Becker 		 *
858e06c8227SJoel Becker 		 * We also know that the frozen data has already fired
859e06c8227SJoel Becker 		 * its triggers if they exist, so we can clear that too.
860470decc6SDave Kleikamp 		 */
861470decc6SDave Kleikamp 		if (jh->b_committed_data) {
862af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
863470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
864470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
865470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
866470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
867e06c8227SJoel Becker 				jh->b_frozen_triggers = NULL;
868470decc6SDave Kleikamp 			}
869470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
870af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
871470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
872e06c8227SJoel Becker 			jh->b_frozen_triggers = NULL;
873470decc6SDave Kleikamp 		}
874470decc6SDave Kleikamp 
875470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
876470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
877470decc6SDave Kleikamp 		if (cp_transaction) {
878470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
8798e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
880f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
881470decc6SDave Kleikamp 		}
882470decc6SDave Kleikamp 
883470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
884470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
885f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
886470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
887470decc6SDave Kleikamp 		 * it. */
888470decc6SDave Kleikamp 
889470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
890470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
891470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
892ba869023Sdingdinghua 		 * that buffer in the future after the "add to orphan"
893ba869023Sdingdinghua 		 * operation been committed,  That's not only a performance
894ba869023Sdingdinghua 		 * gain, it also stops aliasing problems if the buffer is
895ba869023Sdingdinghua 		 * left behind for writeback and gets reallocated for another
896470decc6SDave Kleikamp 		 * use in a different page. */
897ba869023Sdingdinghua 		if (buffer_freed(bh) && !jh->b_next_transaction) {
898470decc6SDave Kleikamp 			clear_buffer_freed(bh);
899470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
900470decc6SDave Kleikamp 		}
901470decc6SDave Kleikamp 
902470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
903470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
904f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
9057ad7445fSHidehiro Kawai 			if (is_journal_aborted(journal))
9067ad7445fSHidehiro Kawai 				clear_buffer_jbddirty(bh);
907470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
908f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
909470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
910470decc6SDave Kleikamp 		} else {
911470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
912470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
913470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
914470decc6SDave Kleikamp 			 * could not have been reallocated until this
915470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
916470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
917470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
918470decc6SDave Kleikamp 			 * list. */
919470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
920f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
921470decc6SDave Kleikamp 			if (!jh->b_transaction) {
922470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
923470decc6SDave Kleikamp 				 /* needs a brelse */
924f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
925470decc6SDave Kleikamp 				release_buffer_page(bh);
926470decc6SDave Kleikamp 			} else
927470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
928470decc6SDave Kleikamp 		}
929470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
930470decc6SDave Kleikamp 	}
931470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
932470decc6SDave Kleikamp 	/*
933f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
934f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
935f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
936f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
937470decc6SDave Kleikamp 	 */
938a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
939470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
940470decc6SDave Kleikamp 	/*
941470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
942470decc6SDave Kleikamp 	 * while the lock was dropped...
943470decc6SDave Kleikamp 	 */
944470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
945470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
946a931da6aSTheodore Ts'o 		write_unlock(&journal->j_state_lock);
947470decc6SDave Kleikamp 		goto restart_loop;
948470decc6SDave Kleikamp 	}
949470decc6SDave Kleikamp 
950470decc6SDave Kleikamp 	/* Done with this transaction! */
951470decc6SDave Kleikamp 
95287c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
953470decc6SDave Kleikamp 
954470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
955470decc6SDave Kleikamp 
9568e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
957bf699327STheodore Ts'o 	stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
9588e85fb3fSJohann Lombardi 					      commit_transaction->t_start);
9598e85fb3fSJohann Lombardi 
9608e85fb3fSJohann Lombardi 	/*
961bf699327STheodore Ts'o 	 * File the transaction statistics
9628e85fb3fSJohann Lombardi 	 */
9638e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9648dd42046STheodore Ts'o 	stats.run.rs_handle_count =
9658dd42046STheodore Ts'o 		atomic_read(&commit_transaction->t_handle_count);
966bf699327STheodore Ts'o 	trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
967bf699327STheodore Ts'o 			     commit_transaction->t_tid, &stats.run);
9688e85fb3fSJohann Lombardi 
9698e85fb3fSJohann Lombardi 	/*
9708e85fb3fSJohann Lombardi 	 * Calculate overall stats
9718e85fb3fSJohann Lombardi 	 */
972bf699327STheodore Ts'o 	spin_lock(&journal->j_history_lock);
9738e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
974bf699327STheodore Ts'o 	journal->j_stats.run.rs_wait += stats.run.rs_wait;
975bf699327STheodore Ts'o 	journal->j_stats.run.rs_running += stats.run.rs_running;
976bf699327STheodore Ts'o 	journal->j_stats.run.rs_locked += stats.run.rs_locked;
977bf699327STheodore Ts'o 	journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
978bf699327STheodore Ts'o 	journal->j_stats.run.rs_logging += stats.run.rs_logging;
979bf699327STheodore Ts'o 	journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
980bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
981bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
9828e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
9838e85fb3fSJohann Lombardi 
984470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
985470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
986470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
987470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
988e07f7183SJosef Bacik 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
989470decc6SDave Kleikamp 
990e07f7183SJosef Bacik 	/*
991e07f7183SJosef Bacik 	 * weight the commit time higher than the average time so we don't
992e07f7183SJosef Bacik 	 * react too strongly to vast changes in the commit time
993e07f7183SJosef Bacik 	 */
994e07f7183SJosef Bacik 	if (likely(journal->j_average_commit_time))
995e07f7183SJosef Bacik 		journal->j_average_commit_time = (commit_time +
996e07f7183SJosef Bacik 				journal->j_average_commit_time*3) / 4;
997e07f7183SJosef Bacik 	else
998e07f7183SJosef Bacik 		journal->j_average_commit_time = commit_time;
999a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
10006c20ec85STheodore Ts'o 
1001f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1002f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1003f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1004fb68407bSAneesh Kumar K.V 		to_free = 1;
1005470decc6SDave Kleikamp 	} else {
1006470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1007470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1008470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1009470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1010470decc6SDave Kleikamp 		} else {
1011470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1012470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1013470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1014470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1015470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1016470decc6SDave Kleikamp 				commit_transaction;
1017470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1018470decc6SDave Kleikamp 				commit_transaction;
1019470decc6SDave Kleikamp 		}
1020470decc6SDave Kleikamp 	}
1021470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1022470decc6SDave Kleikamp 
1023fb68407bSAneesh Kumar K.V 	if (journal->j_commit_callback)
1024fb68407bSAneesh Kumar K.V 		journal->j_commit_callback(journal, commit_transaction);
1025fb68407bSAneesh Kumar K.V 
1026879c5e6bSTheodore Ts'o 	trace_jbd2_end_commit(journal, commit_transaction);
1027470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1028470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1029fb68407bSAneesh Kumar K.V 	if (to_free)
1030fb68407bSAneesh Kumar K.V 		kfree(commit_transaction);
1031470decc6SDave Kleikamp 
1032470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1033470decc6SDave Kleikamp }
1034