xref: /linux-6.15/fs/jbd2/commit.c (revision 721a9602)
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>
2939e3ac25SBrian King #include <linux/bitops.h>
30879c5e6bSTheodore Ts'o #include <trace/events/jbd2.h>
3139e3ac25SBrian King #include <asm/system.h>
32470decc6SDave Kleikamp 
33470decc6SDave Kleikamp /*
34470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
35470decc6SDave Kleikamp  */
36470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
37470decc6SDave Kleikamp {
38470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
39470decc6SDave Kleikamp 	if (uptodate)
40470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
41470decc6SDave Kleikamp 	else
42470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
43470decc6SDave Kleikamp 	unlock_buffer(bh);
44470decc6SDave Kleikamp }
45470decc6SDave Kleikamp 
46470decc6SDave Kleikamp /*
4787c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4887c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
49470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
50470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
51470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
52470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
53470decc6SDave Kleikamp  *
54470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
55470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
56470decc6SDave Kleikamp  *
57470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
58470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
59470decc6SDave Kleikamp  */
60470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
61470decc6SDave Kleikamp {
62470decc6SDave Kleikamp 	struct page *page;
63470decc6SDave Kleikamp 
64470decc6SDave Kleikamp 	if (buffer_dirty(bh))
65470decc6SDave Kleikamp 		goto nope;
66470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
67470decc6SDave Kleikamp 		goto nope;
68470decc6SDave Kleikamp 	page = bh->b_page;
69470decc6SDave Kleikamp 	if (!page)
70470decc6SDave Kleikamp 		goto nope;
71470decc6SDave Kleikamp 	if (page->mapping)
72470decc6SDave Kleikamp 		goto nope;
73470decc6SDave Kleikamp 
74470decc6SDave Kleikamp 	/* OK, it's a truncated page */
75529ae9aaSNick Piggin 	if (!trylock_page(page))
76470decc6SDave Kleikamp 		goto nope;
77470decc6SDave Kleikamp 
78470decc6SDave Kleikamp 	page_cache_get(page);
79470decc6SDave Kleikamp 	__brelse(bh);
80470decc6SDave Kleikamp 	try_to_free_buffers(page);
81470decc6SDave Kleikamp 	unlock_page(page);
82470decc6SDave Kleikamp 	page_cache_release(page);
83470decc6SDave Kleikamp 	return;
84470decc6SDave Kleikamp 
85470decc6SDave Kleikamp nope:
86470decc6SDave Kleikamp 	__brelse(bh);
87470decc6SDave Kleikamp }
88470decc6SDave Kleikamp 
89470decc6SDave Kleikamp /*
90818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
91470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
92470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
93470decc6SDave Kleikamp  * entirely.
94470decc6SDave Kleikamp  *
95470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
96470decc6SDave Kleikamp  */
97818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
98818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
99818d276cSGirish Shilamkar 					struct buffer_head **cbh,
100818d276cSGirish Shilamkar 					__u32 crc32_sum)
101470decc6SDave Kleikamp {
102470decc6SDave Kleikamp 	struct journal_head *descriptor;
103818d276cSGirish Shilamkar 	struct commit_header *tmp;
104470decc6SDave Kleikamp 	struct buffer_head *bh;
105818d276cSGirish Shilamkar 	int ret;
106736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
107470decc6SDave Kleikamp 
108470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
109470decc6SDave Kleikamp 		return 0;
110470decc6SDave Kleikamp 
111f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
112470decc6SDave Kleikamp 	if (!descriptor)
113470decc6SDave Kleikamp 		return 1;
114470decc6SDave Kleikamp 
115470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
116470decc6SDave Kleikamp 
117818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
118f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
119f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
120470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
121736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
122736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
123818d276cSGirish Shilamkar 
124818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
125818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
126818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
127818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
128818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
129470decc6SDave Kleikamp 	}
130470decc6SDave Kleikamp 
131818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
132818d276cSGirish Shilamkar 	lock_buffer(bh);
13345a90bfdSTheodore Ts'o 	clear_buffer_dirty(bh);
134818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
135818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
136818d276cSGirish Shilamkar 
137818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1384d605179SAneesh Kumar K.V 	    !JBD2_HAS_INCOMPAT_FEATURE(journal,
1399c35575bSChristoph Hellwig 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT))
140*721a9602SJens Axboe 		ret = submit_bh(WRITE_SYNC | WRITE_FLUSH_FUA, bh);
1419c35575bSChristoph Hellwig 	else
142*721a9602SJens Axboe 		ret = submit_bh(WRITE_SYNC, bh);
143470decc6SDave Kleikamp 
144818d276cSGirish Shilamkar 	*cbh = bh;
145818d276cSGirish Shilamkar 	return ret;
146818d276cSGirish Shilamkar }
147470decc6SDave Kleikamp 
148818d276cSGirish Shilamkar /*
149818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
150818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
151818d276cSGirish Shilamkar  */
152fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal,
153fd98496fSTheodore Ts'o 					 struct buffer_head *bh)
154818d276cSGirish Shilamkar {
155818d276cSGirish Shilamkar 	int ret = 0;
156818d276cSGirish Shilamkar 
157818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
158818d276cSGirish Shilamkar 	wait_on_buffer(bh);
159818d276cSGirish Shilamkar 
160818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
161818d276cSGirish Shilamkar 		ret = -EIO;
162818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
163818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
164818d276cSGirish Shilamkar 
165818d276cSGirish Shilamkar 	return ret;
166818d276cSGirish Shilamkar }
167818d276cSGirish Shilamkar 
168818d276cSGirish Shilamkar /*
169cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
170cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
171cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
172cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
173cd1aac32SAneesh Kumar K.V  */
174cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
175cd1aac32SAneesh Kumar K.V {
176cd1aac32SAneesh Kumar K.V 	int ret;
177cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
178cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
179cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
180cd1aac32SAneesh Kumar K.V 		.range_start = 0,
181cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
182cd1aac32SAneesh Kumar K.V 	};
183cd1aac32SAneesh Kumar K.V 
184cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
185cd1aac32SAneesh Kumar K.V 	return ret;
186cd1aac32SAneesh Kumar K.V }
187cd1aac32SAneesh Kumar K.V 
188cd1aac32SAneesh Kumar K.V /*
189c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
190c851ed54SJan Kara  * disk.
191c851ed54SJan Kara  *
192c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
193c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
194c851ed54SJan Kara  * operate on from being released while we write out pages.
195c851ed54SJan Kara  */
196cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
197c851ed54SJan Kara 		transaction_t *commit_transaction)
198c851ed54SJan Kara {
199c851ed54SJan Kara 	struct jbd2_inode *jinode;
200c851ed54SJan Kara 	int err, ret = 0;
201c851ed54SJan Kara 	struct address_space *mapping;
202c851ed54SJan Kara 
203c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
204c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
205c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
20639e3ac25SBrian King 		set_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
207c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
208cd1aac32SAneesh Kumar K.V 		/*
209cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
210cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
211cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
212cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
213cd1aac32SAneesh Kumar K.V 		 */
214879c5e6bSTheodore Ts'o 		trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
215cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
216c851ed54SJan Kara 		if (!ret)
217c851ed54SJan Kara 			ret = err;
218c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
219c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
220cc3e1beaSTheodore Ts'o 		commit_transaction->t_flushed_data_blocks = 1;
22139e3ac25SBrian King 		clear_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
22239e3ac25SBrian King 		smp_mb__after_clear_bit();
223c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
224c851ed54SJan Kara 	}
225c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
226c851ed54SJan Kara 	return ret;
227c851ed54SJan Kara }
228c851ed54SJan Kara 
229c851ed54SJan Kara /*
230c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
231c851ed54SJan Kara  * transaction if needed.
232c851ed54SJan Kara  *
233c851ed54SJan Kara  */
234c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
235c851ed54SJan Kara 		transaction_t *commit_transaction)
236c851ed54SJan Kara {
237c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
238c851ed54SJan Kara 	int err, ret = 0;
239c851ed54SJan Kara 
240cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
241c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
242c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
24339e3ac25SBrian King 		set_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
244c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
245c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
246e9e34f4eSHidehiro Kawai 		if (err) {
247e9e34f4eSHidehiro Kawai 			/*
248e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
24994004ed7SChristoph Hellwig 			 * filemap_fdatawait_range(), set it again so
250e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
251e9e34f4eSHidehiro Kawai 			 */
252e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
253e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
254e9e34f4eSHidehiro Kawai 
255c851ed54SJan Kara 			if (!ret)
256c851ed54SJan Kara 				ret = err;
257e9e34f4eSHidehiro Kawai 		}
258c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
25939e3ac25SBrian King 		clear_bit(__JI_COMMIT_RUNNING, &jinode->i_flags);
26039e3ac25SBrian King 		smp_mb__after_clear_bit();
261c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
262c851ed54SJan Kara 	}
263c851ed54SJan Kara 
264c851ed54SJan Kara 	/* Now refile inode to proper lists */
265c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
266c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
267c851ed54SJan Kara 		list_del(&jinode->i_list);
268c851ed54SJan Kara 		if (jinode->i_next_transaction) {
269c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
270c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
271c851ed54SJan Kara 			list_add(&jinode->i_list,
272c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
273c851ed54SJan Kara 		} else {
274c851ed54SJan Kara 			jinode->i_transaction = NULL;
275c851ed54SJan Kara 		}
276c851ed54SJan Kara 	}
277c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
278c851ed54SJan Kara 
279c851ed54SJan Kara 	return ret;
280c851ed54SJan Kara }
281c851ed54SJan Kara 
282818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
283818d276cSGirish Shilamkar {
284818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
285818d276cSGirish Shilamkar 	char *addr;
286818d276cSGirish Shilamkar 	__u32 checksum;
287818d276cSGirish Shilamkar 
288818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
289818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
290818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
291818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
292818d276cSGirish Shilamkar 
293818d276cSGirish Shilamkar 	return checksum;
294818d276cSGirish Shilamkar }
295818d276cSGirish Shilamkar 
296818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
29718eba7aaSMingming Cao 				   unsigned long long block)
298b517bea1SZach Brown {
299b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
300cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
301b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
302b517bea1SZach Brown }
303b517bea1SZach Brown 
304470decc6SDave Kleikamp /*
305f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
306470decc6SDave Kleikamp  *
307470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
308470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
309470decc6SDave Kleikamp  */
310f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
311470decc6SDave Kleikamp {
3128e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
313470decc6SDave Kleikamp 	transaction_t *commit_transaction;
314470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
315470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
316470decc6SDave Kleikamp 	int bufs;
317470decc6SDave Kleikamp 	int flags;
318470decc6SDave Kleikamp 	int err;
31918eba7aaSMingming Cao 	unsigned long long blocknr;
320e07f7183SJosef Bacik 	ktime_t start_time;
321e07f7183SJosef Bacik 	u64 commit_time;
322470decc6SDave Kleikamp 	char *tagp = NULL;
323470decc6SDave Kleikamp 	journal_header_t *header;
324470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
325470decc6SDave Kleikamp 	int space_left = 0;
326470decc6SDave Kleikamp 	int first_tag = 0;
327470decc6SDave Kleikamp 	int tag_flag;
328fb68407bSAneesh Kumar K.V 	int i, to_free = 0;
329b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
330818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
331818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
332749ef9f8SCorrado Zoccolo 	int write_op = WRITE_SYNC;
333470decc6SDave Kleikamp 
334470decc6SDave Kleikamp 	/*
335470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
336470decc6SDave Kleikamp 	 * all outstanding updates to complete.
337470decc6SDave Kleikamp 	 */
338470decc6SDave Kleikamp 
339470decc6SDave Kleikamp #ifdef COMMIT_STATS
340470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
341470decc6SDave Kleikamp 	summarise_journal_usage(journal);
342470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
343470decc6SDave Kleikamp #endif
344470decc6SDave Kleikamp 
345f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
346f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
347470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
348f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
349470decc6SDave Kleikamp 	} else {
350470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
351470decc6SDave Kleikamp 	}
352470decc6SDave Kleikamp 
353470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
354470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
355470decc6SDave Kleikamp 
356470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
357470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
358470decc6SDave Kleikamp 
359879c5e6bSTheodore Ts'o 	trace_jbd2_start_commit(journal, commit_transaction);
360470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
361470decc6SDave Kleikamp 			commit_transaction->t_tid);
362470decc6SDave Kleikamp 
363a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
364470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
365470decc6SDave Kleikamp 
3664194b1eaSJens Axboe 	/*
3674194b1eaSJens Axboe 	 * Use plugged writes here, since we want to submit several before
3684194b1eaSJens Axboe 	 * we unplug the device. We don't do explicit unplugging in here,
3694194b1eaSJens Axboe 	 * instead we rely on sync_buffer() doing the unplug for us.
3704194b1eaSJens Axboe 	 */
3717058548cSTheodore Ts'o 	if (commit_transaction->t_synchronous_commit)
372*721a9602SJens Axboe 		write_op = WRITE_SYNC;
373879c5e6bSTheodore Ts'o 	trace_jbd2_commit_locking(journal, commit_transaction);
374bf699327STheodore Ts'o 	stats.run.rs_wait = commit_transaction->t_max_wait;
375bf699327STheodore Ts'o 	stats.run.rs_locked = jiffies;
376bf699327STheodore Ts'o 	stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
377bf699327STheodore Ts'o 					      stats.run.rs_locked);
3788e85fb3fSJohann Lombardi 
379470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
380a51dca9cSTheodore Ts'o 	while (atomic_read(&commit_transaction->t_updates)) {
381470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
382470decc6SDave Kleikamp 
383470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
384470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
385a51dca9cSTheodore Ts'o 		if (atomic_read(&commit_transaction->t_updates)) {
386470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
387a931da6aSTheodore Ts'o 			write_unlock(&journal->j_state_lock);
388470decc6SDave Kleikamp 			schedule();
389a931da6aSTheodore Ts'o 			write_lock(&journal->j_state_lock);
390470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
391470decc6SDave Kleikamp 		}
392470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
393470decc6SDave Kleikamp 	}
394470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
395470decc6SDave Kleikamp 
396a51dca9cSTheodore Ts'o 	J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
397470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
398470decc6SDave Kleikamp 
399470decc6SDave Kleikamp 	/*
400470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
401470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
402470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
403470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
404f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
405470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
406470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
407470decc6SDave Kleikamp 	 *
408470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
409470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
410470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
411470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
412f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
413470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
414470decc6SDave Kleikamp 	 */
415470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
416470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
417470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
418470decc6SDave Kleikamp 		/*
419f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
420470decc6SDave Kleikamp 		 * leave undo-committed data.
421470decc6SDave Kleikamp 		 */
422470decc6SDave Kleikamp 		if (jh->b_committed_data) {
423470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
424470decc6SDave Kleikamp 
425470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
426af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
427470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
428470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
429470decc6SDave Kleikamp 		}
430f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
431470decc6SDave Kleikamp 	}
432470decc6SDave Kleikamp 
433470decc6SDave Kleikamp 	/*
434470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
435470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
436470decc6SDave Kleikamp 	 * frees some memory
437470decc6SDave Kleikamp 	 */
438470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
439f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
440470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
441470decc6SDave Kleikamp 
442470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
443470decc6SDave Kleikamp 
444470decc6SDave Kleikamp 	/*
445470decc6SDave Kleikamp 	 * Switch to a new revoke table.
446470decc6SDave Kleikamp 	 */
447f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
448470decc6SDave Kleikamp 
449879c5e6bSTheodore Ts'o 	trace_jbd2_commit_flushing(journal, commit_transaction);
450bf699327STheodore Ts'o 	stats.run.rs_flushing = jiffies;
451bf699327STheodore Ts'o 	stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
452bf699327STheodore Ts'o 					     stats.run.rs_flushing);
4538e85fb3fSJohann Lombardi 
454470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
455470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
456470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
457e07f7183SJosef Bacik 	start_time = ktime_get();
458470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
459470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
460a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
461470decc6SDave Kleikamp 
462470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
463470decc6SDave Kleikamp 
464470decc6SDave Kleikamp 	/*
465470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
466470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
467470decc6SDave Kleikamp 	 */
468cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
469c851ed54SJan Kara 	if (err)
470c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
471470decc6SDave Kleikamp 
47267c457a8STheodore Ts'o 	jbd2_journal_write_revoke_records(journal, commit_transaction,
47367c457a8STheodore Ts'o 					  write_op);
474470decc6SDave Kleikamp 
475470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
476470decc6SDave Kleikamp 
477470decc6SDave Kleikamp 	/*
478470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
479470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
480470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
481470decc6SDave Kleikamp 	 */
482a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
483470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
484a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
485470decc6SDave Kleikamp 
486879c5e6bSTheodore Ts'o 	trace_jbd2_commit_logging(journal, commit_transaction);
487bf699327STheodore Ts'o 	stats.run.rs_logging = jiffies;
488bf699327STheodore Ts'o 	stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
489bf699327STheodore Ts'o 					       stats.run.rs_logging);
490a51dca9cSTheodore Ts'o 	stats.run.rs_blocks =
491a51dca9cSTheodore Ts'o 		atomic_read(&commit_transaction->t_outstanding_credits);
492bf699327STheodore Ts'o 	stats.run.rs_blocks_logged = 0;
4938e85fb3fSJohann Lombardi 
4941dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
495a51dca9cSTheodore Ts'o 		 atomic_read(&commit_transaction->t_outstanding_credits));
4961dfc3220SJosef Bacik 
49787c89c23SJan Kara 	err = 0;
498470decc6SDave Kleikamp 	descriptor = NULL;
499470decc6SDave Kleikamp 	bufs = 0;
500470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
501470decc6SDave Kleikamp 
502470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
503470decc6SDave Kleikamp 
504470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
505470decc6SDave Kleikamp 
506470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
5077ad7445fSHidehiro Kawai 		   release it. */
508470decc6SDave Kleikamp 
509470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
5107ad7445fSHidehiro Kawai 			clear_buffer_jbddirty(jh2bh(jh));
511470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
512e06c8227SJoel Becker 			jbd2_buffer_abort_trigger(jh,
513e06c8227SJoel Becker 						  jh->b_frozen_data ?
514e06c8227SJoel Becker 						  jh->b_frozen_triggers :
515e06c8227SJoel Becker 						  jh->b_triggers);
516f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
517470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
518470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
519470decc6SDave Kleikamp 			 * already allocated, even if we are now
520470decc6SDave Kleikamp 			 * aborting. */
521470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
522470decc6SDave Kleikamp 				goto start_journal_io;
523470decc6SDave Kleikamp 			continue;
524470decc6SDave Kleikamp 		}
525470decc6SDave Kleikamp 
526470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
527470decc6SDave Kleikamp 		   record the metadata buffer. */
528470decc6SDave Kleikamp 
529470decc6SDave Kleikamp 		if (!descriptor) {
530470decc6SDave Kleikamp 			struct buffer_head *bh;
531470decc6SDave Kleikamp 
532470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
533470decc6SDave Kleikamp 
534470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
535470decc6SDave Kleikamp 
536f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
537470decc6SDave Kleikamp 			if (!descriptor) {
538a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
539470decc6SDave Kleikamp 				continue;
540470decc6SDave Kleikamp 			}
541470decc6SDave Kleikamp 
542470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
543470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
544470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
545470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
546f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
547f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
548470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
549470decc6SDave Kleikamp 
550470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
551470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
552470decc6SDave Kleikamp 			first_tag = 1;
553470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
554470decc6SDave Kleikamp 			set_buffer_dirty(bh);
555470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
556470decc6SDave Kleikamp 
557470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
558470decc6SDave Kleikamp                            completion later */
559470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
560f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
561470decc6SDave Kleikamp 					BJ_LogCtl);
562470decc6SDave Kleikamp 		}
563470decc6SDave Kleikamp 
564470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
565470decc6SDave Kleikamp 
566f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
567470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
568470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
569470decc6SDave Kleikamp 		   refile-on-abort condition above. */
570470decc6SDave Kleikamp 		if (err) {
571a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
572470decc6SDave Kleikamp 			continue;
573470decc6SDave Kleikamp 		}
574470decc6SDave Kleikamp 
575470decc6SDave Kleikamp 		/*
576470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
577470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
578f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
579470decc6SDave Kleikamp 		 */
580a51dca9cSTheodore Ts'o 		atomic_dec(&commit_transaction->t_outstanding_credits);
581470decc6SDave Kleikamp 
582470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
583470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
584470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
585470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
586470decc6SDave Kleikamp 
587470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
588470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
589470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
590470decc6SDave Kleikamp 
591470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
592470decc6SDave Kleikamp 		/*
593f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
594470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
595470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
596470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
597470decc6SDave Kleikamp 		 */
598470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
599f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
600470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
601e6ec116bSTheodore Ts'o 		if (flags < 0) {
602e6ec116bSTheodore Ts'o 			jbd2_journal_abort(journal, flags);
603e6ec116bSTheodore Ts'o 			continue;
604e6ec116bSTheodore Ts'o 		}
605470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
606470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
607470decc6SDave Kleikamp 
608470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
609470decc6SDave Kleikamp                    buffer */
610470decc6SDave Kleikamp 
611470decc6SDave Kleikamp 		tag_flag = 0;
612470decc6SDave Kleikamp 		if (flags & 1)
613f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
614470decc6SDave Kleikamp 		if (!first_tag)
615f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
616470decc6SDave Kleikamp 
617470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
618b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
619470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
620b517bea1SZach Brown 		tagp += tag_bytes;
621b517bea1SZach Brown 		space_left -= tag_bytes;
622470decc6SDave Kleikamp 
623470decc6SDave Kleikamp 		if (first_tag) {
624470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
625470decc6SDave Kleikamp 			tagp += 16;
626470decc6SDave Kleikamp 			space_left -= 16;
627470decc6SDave Kleikamp 			first_tag = 0;
628470decc6SDave Kleikamp 		}
629470decc6SDave Kleikamp 
630470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
631470decc6SDave Kleikamp 		   let the IO rip! */
632470decc6SDave Kleikamp 
633470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
634470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
635b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
636470decc6SDave Kleikamp 
637470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
638470decc6SDave Kleikamp 
639470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
640470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
641470decc6SDave Kleikamp                            the last tag we set up. */
642470decc6SDave Kleikamp 
643f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
644470decc6SDave Kleikamp 
645470decc6SDave Kleikamp start_journal_io:
646470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
647470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
648818d276cSGirish Shilamkar 				/*
649818d276cSGirish Shilamkar 				 * Compute checksum.
650818d276cSGirish Shilamkar 				 */
651818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
652818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
653818d276cSGirish Shilamkar 					crc32_sum =
654818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
655818d276cSGirish Shilamkar 				}
656818d276cSGirish Shilamkar 
657470decc6SDave Kleikamp 				lock_buffer(bh);
658470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
659470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
660470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
6617058548cSTheodore Ts'o 				submit_bh(write_op, bh);
662470decc6SDave Kleikamp 			}
663470decc6SDave Kleikamp 			cond_resched();
664bf699327STheodore Ts'o 			stats.run.rs_blocks_logged += bufs;
665470decc6SDave Kleikamp 
666470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
667470decc6SDave Kleikamp                            time round the loop. */
668470decc6SDave Kleikamp 			descriptor = NULL;
669470decc6SDave Kleikamp 			bufs = 0;
670470decc6SDave Kleikamp 		}
671470decc6SDave Kleikamp 	}
672470decc6SDave Kleikamp 
673c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
674e9e34f4eSHidehiro Kawai 	if (err) {
675e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
676e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
67705496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
6785bf5683aSHidehiro Kawai 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
6795bf5683aSHidehiro Kawai 			jbd2_journal_abort(journal, err);
680e9e34f4eSHidehiro Kawai 		err = 0;
681e9e34f4eSHidehiro Kawai 	}
682c851ed54SJan Kara 
683818d276cSGirish Shilamkar 	/*
684818d276cSGirish Shilamkar 	 * If the journal is not located on the file system device,
685818d276cSGirish Shilamkar 	 * then we must flush the file system device before we issue
686818d276cSGirish Shilamkar 	 * the commit record
687818d276cSGirish Shilamkar 	 */
688818d276cSGirish Shilamkar 	if (commit_transaction->t_flushed_data_blocks &&
689818d276cSGirish Shilamkar 	    (journal->j_fs_dev != journal->j_dev) &&
690818d276cSGirish Shilamkar 	    (journal->j_flags & JBD2_BARRIER))
691dd3932edSChristoph Hellwig 		blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL);
692818d276cSGirish Shilamkar 
693818d276cSGirish Shilamkar 	/* Done it all: now write the commit record asynchronously. */
694818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
695818d276cSGirish Shilamkar 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
696818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
697470decc6SDave Kleikamp 						 &cbh, crc32_sum);
698470decc6SDave Kleikamp 		if (err)
699470decc6SDave Kleikamp 			__jbd2_journal_abort_hard(journal);
700470decc6SDave Kleikamp 	}
701470decc6SDave Kleikamp 
702470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
703470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
704470decc6SDave Kleikamp            complete.  Control buffers being written are on the
705470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
706470decc6SDave Kleikamp            the t_iobuf_list queue.
707470decc6SDave Kleikamp 
708470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
709470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
710470decc6SDave Kleikamp 	   so we incur less scheduling load.
711470decc6SDave Kleikamp 	*/
712470decc6SDave Kleikamp 
713470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 3\n");
714470decc6SDave Kleikamp 
715470decc6SDave Kleikamp 	/*
716470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
717470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
718470decc6SDave Kleikamp 	 */
719470decc6SDave Kleikamp wait_for_iobuf:
720470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
721470decc6SDave Kleikamp 		struct buffer_head *bh;
722f7f4bccbSMingming Cao 
723470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
724470decc6SDave Kleikamp 		bh = jh2bh(jh);
725470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
726f7f4bccbSMingming Cao 			wait_on_buffer(bh);
727470decc6SDave Kleikamp 			goto wait_for_iobuf;
728470decc6SDave Kleikamp 		}
729f7f4bccbSMingming Cao 		if (cond_resched())
730470decc6SDave Kleikamp 			goto wait_for_iobuf;
731470decc6SDave Kleikamp 
732470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
733470decc6SDave Kleikamp 			err = -EIO;
734470decc6SDave Kleikamp 
735470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
736470decc6SDave Kleikamp 
737470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
738470decc6SDave Kleikamp 		jbd2_journal_unfile_buffer(journal, jh);
739470decc6SDave Kleikamp 
740470decc6SDave Kleikamp 		/*
741470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
742470decc6SDave Kleikamp 		 * which were created by jbd2_journal_write_metadata_buffer().
743470decc6SDave Kleikamp 		 */
744470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
745470decc6SDave Kleikamp 		jbd2_journal_put_journal_head(jh);
746f7f4bccbSMingming Cao 		__brelse(bh);
747470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
748470decc6SDave Kleikamp 		free_buffer_head(bh);
749470decc6SDave Kleikamp 
750470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
751470decc6SDave Kleikamp                    shadowed buffer */
752470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
753470decc6SDave Kleikamp 		bh = jh2bh(jh);
754470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
755470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
75687c89c23SJan Kara 
757470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
758470decc6SDave Kleikamp                    to remember it against this transaction so that when
759470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
760470decc6SDave Kleikamp                    required. */
761470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
762470decc6SDave Kleikamp 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
763470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
764470decc6SDave Kleikamp 		   IO to complete */
765470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
766470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
767470decc6SDave Kleikamp 		__brelse(bh);
768470decc6SDave Kleikamp 	}
769470decc6SDave Kleikamp 
770470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
771470decc6SDave Kleikamp 
772470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 4\n");
773470decc6SDave Kleikamp 
774470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
775470decc6SDave Kleikamp  wait_for_ctlbuf:
776470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
777f7f4bccbSMingming Cao 		struct buffer_head *bh;
778f7f4bccbSMingming Cao 
779470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
780470decc6SDave Kleikamp 		bh = jh2bh(jh);
781470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
782470decc6SDave Kleikamp 			wait_on_buffer(bh);
78387c89c23SJan Kara 			goto wait_for_ctlbuf;
784470decc6SDave Kleikamp 		}
785818d276cSGirish Shilamkar 		if (cond_resched())
786818d276cSGirish Shilamkar 			goto wait_for_ctlbuf;
787818d276cSGirish Shilamkar 
788818d276cSGirish Shilamkar 		if (unlikely(!buffer_uptodate(bh)))
789818d276cSGirish Shilamkar 			err = -EIO;
790818d276cSGirish Shilamkar 
791818d276cSGirish Shilamkar 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
792b048d846SMingming Cao 		clear_buffer_jwrite(bh);
793818d276cSGirish Shilamkar 		jbd2_journal_unfile_buffer(journal, jh);
794470decc6SDave Kleikamp 		jbd2_journal_put_journal_head(jh);
795470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
796a7fa2bafSJan Kara 		/* AKPM: bforget here */
797470decc6SDave Kleikamp 	}
798470decc6SDave Kleikamp 
79977e841deSHidehiro Kawai 	if (err)
80077e841deSHidehiro Kawai 		jbd2_journal_abort(journal, err);
80177e841deSHidehiro Kawai 
802470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 5\n");
803470decc6SDave Kleikamp 
804470decc6SDave Kleikamp 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
805470decc6SDave Kleikamp 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
806470decc6SDave Kleikamp 		err = journal_submit_commit_record(journal, commit_transaction,
807470decc6SDave Kleikamp 						&cbh, crc32_sum);
808470decc6SDave Kleikamp 		if (err)
809470decc6SDave Kleikamp 			__jbd2_journal_abort_hard(journal);
810470decc6SDave Kleikamp 	}
811470decc6SDave Kleikamp 	if (!err && !is_journal_aborted(journal))
812fd98496fSTheodore Ts'o 		err = journal_wait_on_commit_record(journal, cbh);
813f73bee49SJan Kara 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
814f73bee49SJan Kara 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT) &&
815f73bee49SJan Kara 	    journal->j_flags & JBD2_BARRIER) {
816dd3932edSChristoph Hellwig 		blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL);
817f73bee49SJan Kara 	}
818470decc6SDave Kleikamp 
819470decc6SDave Kleikamp 	if (err)
820470decc6SDave Kleikamp 		jbd2_journal_abort(journal, err);
821470decc6SDave Kleikamp 
822470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
823470decc6SDave Kleikamp            processing: any buffers committed as a result of this
824470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
825470decc6SDave Kleikamp            before. */
826470decc6SDave Kleikamp 
82787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
828470decc6SDave Kleikamp 
829c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
830470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
831470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
832470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
833470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
834470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
835470decc6SDave Kleikamp 
836470decc6SDave Kleikamp restart_loop:
837470decc6SDave Kleikamp 	/*
838470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
839470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
840470decc6SDave Kleikamp 	 */
841470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
842470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
843470decc6SDave Kleikamp 		transaction_t *cp_transaction;
844470decc6SDave Kleikamp 		struct buffer_head *bh;
845470decc6SDave Kleikamp 
846470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
847470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
848470decc6SDave Kleikamp 		bh = jh2bh(jh);
849470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
85023e2af35Sdingdinghua 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
851470decc6SDave Kleikamp 
852470decc6SDave Kleikamp 		/*
853470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
854470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
855470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
856470decc6SDave Kleikamp 		 * field now points to a committed version of the
857470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
858470decc6SDave Kleikamp 		 * data.
859470decc6SDave Kleikamp 		 *
860470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
861e06c8227SJoel Becker 		 *
862e06c8227SJoel Becker 		 * We also know that the frozen data has already fired
863e06c8227SJoel Becker 		 * its triggers if they exist, so we can clear that too.
864470decc6SDave Kleikamp 		 */
865470decc6SDave Kleikamp 		if (jh->b_committed_data) {
866470decc6SDave Kleikamp 			jbd2_free(jh->b_committed_data, bh->b_size);
867470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
868470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
869470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
870470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
871e06c8227SJoel Becker 				jh->b_frozen_triggers = NULL;
872470decc6SDave Kleikamp 			}
873470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
874470decc6SDave Kleikamp 			jbd2_free(jh->b_frozen_data, bh->b_size);
875470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
876e06c8227SJoel Becker 			jh->b_frozen_triggers = NULL;
877470decc6SDave Kleikamp 		}
878470decc6SDave Kleikamp 
879470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
880470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
881470decc6SDave Kleikamp 		if (cp_transaction) {
882470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
883470decc6SDave Kleikamp 			cp_transaction->t_chp_stats.cs_dropped++;
884470decc6SDave Kleikamp 			__jbd2_journal_remove_checkpoint(jh);
885470decc6SDave Kleikamp 		}
886470decc6SDave Kleikamp 
887470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
888470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
889470decc6SDave Kleikamp 		 * by jbd2_journal_forget, it may no longer be dirty and
890470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
891470decc6SDave Kleikamp 		 * it. */
892470decc6SDave Kleikamp 
893470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
894470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
895470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
896ba869023Sdingdinghua 		 * that buffer in the future after the "add to orphan"
897ba869023Sdingdinghua 		 * operation been committed,  That's not only a performance
898ba869023Sdingdinghua 		 * gain, it also stops aliasing problems if the buffer is
899ba869023Sdingdinghua 		 * left behind for writeback and gets reallocated for another
900470decc6SDave Kleikamp 		 * use in a different page. */
901ba869023Sdingdinghua 		if (buffer_freed(bh) && !jh->b_next_transaction) {
902470decc6SDave Kleikamp 			clear_buffer_freed(bh);
903470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
904470decc6SDave Kleikamp 		}
905470decc6SDave Kleikamp 
906470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
907470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
908470decc6SDave Kleikamp 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
9097ad7445fSHidehiro Kawai 			if (is_journal_aborted(journal))
9107ad7445fSHidehiro Kawai 				clear_buffer_jbddirty(bh);
911470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
912470decc6SDave Kleikamp 			__jbd2_journal_refile_buffer(jh);
913470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
914470decc6SDave Kleikamp 		} else {
915470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
916470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
917470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
918470decc6SDave Kleikamp 			 * could not have been reallocated until this
919470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
920470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
921470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
922470decc6SDave Kleikamp 			 * list. */
923470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
924f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
925470decc6SDave Kleikamp 			if (!jh->b_transaction) {
926470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
927470decc6SDave Kleikamp 				 /* needs a brelse */
928f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
929470decc6SDave Kleikamp 				release_buffer_page(bh);
930470decc6SDave Kleikamp 			} else
931470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
932470decc6SDave Kleikamp 		}
933470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
934470decc6SDave Kleikamp 	}
935470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
936470decc6SDave Kleikamp 	/*
937f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
938f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
939f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
940f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
941470decc6SDave Kleikamp 	 */
942a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
943470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
944470decc6SDave Kleikamp 	/*
945470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
946470decc6SDave Kleikamp 	 * while the lock was dropped...
947470decc6SDave Kleikamp 	 */
948470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
949470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
950a931da6aSTheodore Ts'o 		write_unlock(&journal->j_state_lock);
951470decc6SDave Kleikamp 		goto restart_loop;
952470decc6SDave Kleikamp 	}
953470decc6SDave Kleikamp 
954470decc6SDave Kleikamp 	/* Done with this transaction! */
955470decc6SDave Kleikamp 
95687c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
957470decc6SDave Kleikamp 
958470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
959470decc6SDave Kleikamp 
9608e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
961bf699327STheodore Ts'o 	stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
9628e85fb3fSJohann Lombardi 					      commit_transaction->t_start);
9638e85fb3fSJohann Lombardi 
9648e85fb3fSJohann Lombardi 	/*
965bf699327STheodore Ts'o 	 * File the transaction statistics
9668e85fb3fSJohann Lombardi 	 */
9678e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9688dd42046STheodore Ts'o 	stats.run.rs_handle_count =
9698dd42046STheodore Ts'o 		atomic_read(&commit_transaction->t_handle_count);
970bf699327STheodore Ts'o 	trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
971bf699327STheodore Ts'o 			     commit_transaction->t_tid, &stats.run);
9728e85fb3fSJohann Lombardi 
9738e85fb3fSJohann Lombardi 	/*
9748e85fb3fSJohann Lombardi 	 * Calculate overall stats
9758e85fb3fSJohann Lombardi 	 */
976bf699327STheodore Ts'o 	spin_lock(&journal->j_history_lock);
9778e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
978bf699327STheodore Ts'o 	journal->j_stats.run.rs_wait += stats.run.rs_wait;
979bf699327STheodore Ts'o 	journal->j_stats.run.rs_running += stats.run.rs_running;
980bf699327STheodore Ts'o 	journal->j_stats.run.rs_locked += stats.run.rs_locked;
981bf699327STheodore Ts'o 	journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
982bf699327STheodore Ts'o 	journal->j_stats.run.rs_logging += stats.run.rs_logging;
983bf699327STheodore Ts'o 	journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
984bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
985bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
9868e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
9878e85fb3fSJohann Lombardi 
988470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
989470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
990470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
991470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
992e07f7183SJosef Bacik 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
993470decc6SDave Kleikamp 
994e07f7183SJosef Bacik 	/*
995e07f7183SJosef Bacik 	 * weight the commit time higher than the average time so we don't
996e07f7183SJosef Bacik 	 * react too strongly to vast changes in the commit time
997e07f7183SJosef Bacik 	 */
998e07f7183SJosef Bacik 	if (likely(journal->j_average_commit_time))
999e07f7183SJosef Bacik 		journal->j_average_commit_time = (commit_time +
1000e07f7183SJosef Bacik 				journal->j_average_commit_time*3) / 4;
1001e07f7183SJosef Bacik 	else
1002e07f7183SJosef Bacik 		journal->j_average_commit_time = commit_time;
1003a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
10046c20ec85STheodore Ts'o 
1005f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1006f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1007f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1008fb68407bSAneesh Kumar K.V 		to_free = 1;
1009470decc6SDave Kleikamp 	} else {
1010470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1011470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1012470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1013470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1014470decc6SDave Kleikamp 		} else {
1015470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1016470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1017470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1018470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1019470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1020470decc6SDave Kleikamp 				commit_transaction;
1021470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1022470decc6SDave Kleikamp 				commit_transaction;
1023470decc6SDave Kleikamp 		}
1024470decc6SDave Kleikamp 	}
1025470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1026470decc6SDave Kleikamp 
1027fb68407bSAneesh Kumar K.V 	if (journal->j_commit_callback)
1028fb68407bSAneesh Kumar K.V 		journal->j_commit_callback(journal, commit_transaction);
1029fb68407bSAneesh Kumar K.V 
1030879c5e6bSTheodore Ts'o 	trace_jbd2_end_commit(journal, commit_transaction);
1031470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1032470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1033fb68407bSAneesh Kumar K.V 	if (to_free)
1034fb68407bSAneesh Kumar K.V 		kfree(commit_transaction);
1035470decc6SDave Kleikamp 
1036470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1037470decc6SDave Kleikamp }
1038