xref: /linux-6.15/fs/jbd2/commit.c (revision ba869023)
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;
104470decc6SDave Kleikamp 	int barrier_done = 0;
105736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
106470decc6SDave Kleikamp 
107470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
108470decc6SDave Kleikamp 		return 0;
109470decc6SDave Kleikamp 
110f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
111470decc6SDave Kleikamp 	if (!descriptor)
112470decc6SDave Kleikamp 		return 1;
113470decc6SDave Kleikamp 
114470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
115470decc6SDave Kleikamp 
116818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
117f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
118f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
119470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
120736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
121736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
122818d276cSGirish Shilamkar 
123818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
124818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
125818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
126818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
127818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
128470decc6SDave Kleikamp 	}
129470decc6SDave Kleikamp 
130818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
131818d276cSGirish Shilamkar 	lock_buffer(bh);
13245a90bfdSTheodore Ts'o 	clear_buffer_dirty(bh);
133818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
134818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
135818d276cSGirish Shilamkar 
136818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1374d605179SAneesh Kumar K.V 	    !JBD2_HAS_INCOMPAT_FEATURE(journal,
138818d276cSGirish Shilamkar 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
139470decc6SDave Kleikamp 		set_buffer_ordered(bh);
140470decc6SDave Kleikamp 		barrier_done = 1;
141470decc6SDave Kleikamp 	}
1424194b1eaSJens Axboe 	ret = submit_bh(WRITE_SYNC_PLUG, bh);
143c4e35e07SDave Kleikamp 	if (barrier_done)
144c4e35e07SDave Kleikamp 		clear_buffer_ordered(bh);
145818d276cSGirish Shilamkar 
146470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
147470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
148470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
149470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
150470decc6SDave Kleikamp 	 */
151470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
152470decc6SDave Kleikamp 		printk(KERN_WARNING
153470decc6SDave Kleikamp 		       "JBD: barrier-based sync failed on %s - "
15405496769STheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
155470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
156f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
157470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
158470decc6SDave Kleikamp 
159470decc6SDave Kleikamp 		/* And try again, without the barrier */
160034772b0STheodore Ts'o 		lock_buffer(bh);
161470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
16245a90bfdSTheodore Ts'o 		clear_buffer_dirty(bh);
1634194b1eaSJens Axboe 		ret = submit_bh(WRITE_SYNC_PLUG, bh);
164470decc6SDave Kleikamp 	}
165818d276cSGirish Shilamkar 	*cbh = bh;
166818d276cSGirish Shilamkar 	return ret;
167818d276cSGirish Shilamkar }
168470decc6SDave Kleikamp 
169818d276cSGirish Shilamkar /*
170818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
171818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
172818d276cSGirish Shilamkar  */
173fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal,
174fd98496fSTheodore Ts'o 					 struct buffer_head *bh)
175818d276cSGirish Shilamkar {
176818d276cSGirish Shilamkar 	int ret = 0;
177818d276cSGirish Shilamkar 
178fd98496fSTheodore Ts'o retry:
179818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
180818d276cSGirish Shilamkar 	wait_on_buffer(bh);
181fd98496fSTheodore Ts'o 	if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
182fd98496fSTheodore Ts'o 		printk(KERN_WARNING
183fd98496fSTheodore Ts'o 		       "JBD2: wait_on_commit_record: sync failed on %s - "
184fd98496fSTheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
185fd98496fSTheodore Ts'o 		spin_lock(&journal->j_state_lock);
186fd98496fSTheodore Ts'o 		journal->j_flags &= ~JBD2_BARRIER;
187fd98496fSTheodore Ts'o 		spin_unlock(&journal->j_state_lock);
188fd98496fSTheodore Ts'o 
189fd98496fSTheodore Ts'o 		lock_buffer(bh);
190fd98496fSTheodore Ts'o 		clear_buffer_dirty(bh);
191fd98496fSTheodore Ts'o 		set_buffer_uptodate(bh);
192fd98496fSTheodore Ts'o 		bh->b_end_io = journal_end_buffer_io_sync;
193fd98496fSTheodore Ts'o 
1944194b1eaSJens Axboe 		ret = submit_bh(WRITE_SYNC_PLUG, bh);
195fd98496fSTheodore Ts'o 		if (ret) {
196fd98496fSTheodore Ts'o 			unlock_buffer(bh);
197fd98496fSTheodore Ts'o 			return ret;
198fd98496fSTheodore Ts'o 		}
199fd98496fSTheodore Ts'o 		goto retry;
200fd98496fSTheodore Ts'o 	}
201818d276cSGirish Shilamkar 
202818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
203818d276cSGirish Shilamkar 		ret = -EIO;
204818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
205818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
206818d276cSGirish Shilamkar 
207818d276cSGirish Shilamkar 	return ret;
208818d276cSGirish Shilamkar }
209818d276cSGirish Shilamkar 
210818d276cSGirish Shilamkar /*
211cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
212cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
213cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
214cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
215cd1aac32SAneesh Kumar K.V  */
216cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
217cd1aac32SAneesh Kumar K.V {
218cd1aac32SAneesh Kumar K.V 	int ret;
219cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
220cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
221cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
222cd1aac32SAneesh Kumar K.V 		.range_start = 0,
223cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
224cd1aac32SAneesh Kumar K.V 	};
225cd1aac32SAneesh Kumar K.V 
226cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
227cd1aac32SAneesh Kumar K.V 	return ret;
228cd1aac32SAneesh Kumar K.V }
229cd1aac32SAneesh Kumar K.V 
230cd1aac32SAneesh Kumar K.V /*
231c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
232c851ed54SJan Kara  * disk.
233c851ed54SJan Kara  *
234c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
235c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
236c851ed54SJan Kara  * operate on from being released while we write out pages.
237c851ed54SJan Kara  */
238cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
239c851ed54SJan Kara 		transaction_t *commit_transaction)
240c851ed54SJan Kara {
241c851ed54SJan Kara 	struct jbd2_inode *jinode;
242c851ed54SJan Kara 	int err, ret = 0;
243c851ed54SJan Kara 	struct address_space *mapping;
244c851ed54SJan Kara 
245c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
246c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
247c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
248c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
249c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
250cd1aac32SAneesh Kumar K.V 		/*
251cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
252cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
253cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
254cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
255cd1aac32SAneesh Kumar K.V 		 */
256879c5e6bSTheodore Ts'o 		trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
257cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
258c851ed54SJan Kara 		if (!ret)
259c851ed54SJan Kara 			ret = err;
260c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
261c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
262cc3e1beaSTheodore Ts'o 		commit_transaction->t_flushed_data_blocks = 1;
263c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
264c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
265c851ed54SJan Kara 	}
266c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
267c851ed54SJan Kara 	return ret;
268c851ed54SJan Kara }
269c851ed54SJan Kara 
270c851ed54SJan Kara /*
271c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
272c851ed54SJan Kara  * transaction if needed.
273c851ed54SJan Kara  *
274c851ed54SJan Kara  */
275c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
276c851ed54SJan Kara 		transaction_t *commit_transaction)
277c851ed54SJan Kara {
278c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
279c851ed54SJan Kara 	int err, ret = 0;
280c851ed54SJan Kara 
281cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
282c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
283c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
284c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
285c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
286c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
287e9e34f4eSHidehiro Kawai 		if (err) {
288e9e34f4eSHidehiro Kawai 			/*
289e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
29094004ed7SChristoph Hellwig 			 * filemap_fdatawait_range(), set it again so
291e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
292e9e34f4eSHidehiro Kawai 			 */
293e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
294e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
295e9e34f4eSHidehiro Kawai 
296c851ed54SJan Kara 			if (!ret)
297c851ed54SJan Kara 				ret = err;
298e9e34f4eSHidehiro Kawai 		}
299c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
300c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
301c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
302c851ed54SJan Kara 	}
303c851ed54SJan Kara 
304c851ed54SJan Kara 	/* Now refile inode to proper lists */
305c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
306c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
307c851ed54SJan Kara 		list_del(&jinode->i_list);
308c851ed54SJan Kara 		if (jinode->i_next_transaction) {
309c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
310c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
311c851ed54SJan Kara 			list_add(&jinode->i_list,
312c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
313c851ed54SJan Kara 		} else {
314c851ed54SJan Kara 			jinode->i_transaction = NULL;
315c851ed54SJan Kara 		}
316c851ed54SJan Kara 	}
317c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
318c851ed54SJan Kara 
319c851ed54SJan Kara 	return ret;
320c851ed54SJan Kara }
321c851ed54SJan Kara 
322818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
323818d276cSGirish Shilamkar {
324818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
325818d276cSGirish Shilamkar 	char *addr;
326818d276cSGirish Shilamkar 	__u32 checksum;
327818d276cSGirish Shilamkar 
328818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
329818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
330818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
331818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
332818d276cSGirish Shilamkar 
333818d276cSGirish Shilamkar 	return checksum;
334818d276cSGirish Shilamkar }
335818d276cSGirish Shilamkar 
336818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
33718eba7aaSMingming Cao 				   unsigned long long block)
338b517bea1SZach Brown {
339b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
340cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
341b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
342b517bea1SZach Brown }
343b517bea1SZach Brown 
344470decc6SDave Kleikamp /*
345f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
346470decc6SDave Kleikamp  *
347470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
348470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
349470decc6SDave Kleikamp  */
350f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
351470decc6SDave Kleikamp {
3528e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
353470decc6SDave Kleikamp 	transaction_t *commit_transaction;
354470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
355470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
356470decc6SDave Kleikamp 	int bufs;
357470decc6SDave Kleikamp 	int flags;
358470decc6SDave Kleikamp 	int err;
35918eba7aaSMingming Cao 	unsigned long long blocknr;
360e07f7183SJosef Bacik 	ktime_t start_time;
361e07f7183SJosef Bacik 	u64 commit_time;
362470decc6SDave Kleikamp 	char *tagp = NULL;
363470decc6SDave Kleikamp 	journal_header_t *header;
364470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
365470decc6SDave Kleikamp 	int space_left = 0;
366470decc6SDave Kleikamp 	int first_tag = 0;
367470decc6SDave Kleikamp 	int tag_flag;
368fb68407bSAneesh Kumar K.V 	int i, to_free = 0;
369b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
370818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
371818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
3727058548cSTheodore Ts'o 	int write_op = WRITE;
373470decc6SDave Kleikamp 
374470decc6SDave Kleikamp 	/*
375470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
376470decc6SDave Kleikamp 	 * all outstanding updates to complete.
377470decc6SDave Kleikamp 	 */
378470decc6SDave Kleikamp 
379470decc6SDave Kleikamp #ifdef COMMIT_STATS
380470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
381470decc6SDave Kleikamp 	summarise_journal_usage(journal);
382470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
383470decc6SDave Kleikamp #endif
384470decc6SDave Kleikamp 
385f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
386f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
387470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
388f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
389470decc6SDave Kleikamp 	} else {
390470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
391470decc6SDave Kleikamp 	}
392470decc6SDave Kleikamp 
393470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
394470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
395470decc6SDave Kleikamp 
396470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
397470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
398470decc6SDave Kleikamp 
399879c5e6bSTheodore Ts'o 	trace_jbd2_start_commit(journal, commit_transaction);
400470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
401470decc6SDave Kleikamp 			commit_transaction->t_tid);
402470decc6SDave Kleikamp 
403470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
404470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
405470decc6SDave Kleikamp 
4064194b1eaSJens Axboe 	/*
4074194b1eaSJens Axboe 	 * Use plugged writes here, since we want to submit several before
4084194b1eaSJens Axboe 	 * we unplug the device. We don't do explicit unplugging in here,
4094194b1eaSJens Axboe 	 * instead we rely on sync_buffer() doing the unplug for us.
4104194b1eaSJens Axboe 	 */
4117058548cSTheodore Ts'o 	if (commit_transaction->t_synchronous_commit)
4124194b1eaSJens Axboe 		write_op = WRITE_SYNC_PLUG;
413879c5e6bSTheodore Ts'o 	trace_jbd2_commit_locking(journal, commit_transaction);
414bf699327STheodore Ts'o 	stats.run.rs_wait = commit_transaction->t_max_wait;
415bf699327STheodore Ts'o 	stats.run.rs_locked = jiffies;
416bf699327STheodore Ts'o 	stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
417bf699327STheodore Ts'o 					      stats.run.rs_locked);
4188e85fb3fSJohann Lombardi 
419470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
420470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
421470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
422470decc6SDave Kleikamp 
423470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
424470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
425470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
426470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
427470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
428470decc6SDave Kleikamp 			schedule();
429470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
430470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
431470decc6SDave Kleikamp 		}
432470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
433470decc6SDave Kleikamp 	}
434470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
435470decc6SDave Kleikamp 
436470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
437470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
438470decc6SDave Kleikamp 
439470decc6SDave Kleikamp 	/*
440470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
441470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
442470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
443470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
444f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
445470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
446470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
447470decc6SDave Kleikamp 	 *
448470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
449470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
450470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
451470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
452f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
453470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
454470decc6SDave Kleikamp 	 */
455470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
456470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
457470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
458470decc6SDave Kleikamp 		/*
459f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
460470decc6SDave Kleikamp 		 * leave undo-committed data.
461470decc6SDave Kleikamp 		 */
462470decc6SDave Kleikamp 		if (jh->b_committed_data) {
463470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
464470decc6SDave Kleikamp 
465470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
466af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
467470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
468470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
469470decc6SDave Kleikamp 		}
470f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
471470decc6SDave Kleikamp 	}
472470decc6SDave Kleikamp 
473470decc6SDave Kleikamp 	/*
474470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
475470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
476470decc6SDave Kleikamp 	 * frees some memory
477470decc6SDave Kleikamp 	 */
478470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
479f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
480470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
481470decc6SDave Kleikamp 
482470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
483470decc6SDave Kleikamp 
484470decc6SDave Kleikamp 	/*
485470decc6SDave Kleikamp 	 * Switch to a new revoke table.
486470decc6SDave Kleikamp 	 */
487f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
488470decc6SDave Kleikamp 
489879c5e6bSTheodore Ts'o 	trace_jbd2_commit_flushing(journal, commit_transaction);
490bf699327STheodore Ts'o 	stats.run.rs_flushing = jiffies;
491bf699327STheodore Ts'o 	stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
492bf699327STheodore Ts'o 					     stats.run.rs_flushing);
4938e85fb3fSJohann Lombardi 
494470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
495470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
496470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
497e07f7183SJosef Bacik 	start_time = ktime_get();
498470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
499470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
500470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
501470decc6SDave Kleikamp 
502470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
503470decc6SDave Kleikamp 
504470decc6SDave Kleikamp 	/*
505470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
506470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
507470decc6SDave Kleikamp 	 */
508cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
509c851ed54SJan Kara 	if (err)
510c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
511470decc6SDave Kleikamp 
51267c457a8STheodore Ts'o 	jbd2_journal_write_revoke_records(journal, commit_transaction,
51367c457a8STheodore Ts'o 					  write_op);
514470decc6SDave Kleikamp 
515470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
516470decc6SDave Kleikamp 
517470decc6SDave Kleikamp 	/*
518470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
519470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
520470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
521470decc6SDave Kleikamp 	 */
52202c471cbSMingming Cao 	spin_lock(&journal->j_state_lock);
523470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
52402c471cbSMingming Cao 	spin_unlock(&journal->j_state_lock);
525470decc6SDave Kleikamp 
526879c5e6bSTheodore Ts'o 	trace_jbd2_commit_logging(journal, commit_transaction);
527bf699327STheodore Ts'o 	stats.run.rs_logging = jiffies;
528bf699327STheodore Ts'o 	stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
529bf699327STheodore Ts'o 					       stats.run.rs_logging);
530bf699327STheodore Ts'o 	stats.run.rs_blocks = commit_transaction->t_outstanding_credits;
531bf699327STheodore Ts'o 	stats.run.rs_blocks_logged = 0;
5328e85fb3fSJohann Lombardi 
5331dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
5341dfc3220SJosef Bacik 		 commit_transaction->t_outstanding_credits);
5351dfc3220SJosef Bacik 
53687c89c23SJan Kara 	err = 0;
537470decc6SDave Kleikamp 	descriptor = NULL;
538470decc6SDave Kleikamp 	bufs = 0;
539470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
540470decc6SDave Kleikamp 
541470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
542470decc6SDave Kleikamp 
543470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
544470decc6SDave Kleikamp 
545470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
5467ad7445fSHidehiro Kawai 		   release it. */
547470decc6SDave Kleikamp 
548470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
5497ad7445fSHidehiro Kawai 			clear_buffer_jbddirty(jh2bh(jh));
550470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
551e06c8227SJoel Becker 			jbd2_buffer_abort_trigger(jh,
552e06c8227SJoel Becker 						  jh->b_frozen_data ?
553e06c8227SJoel Becker 						  jh->b_frozen_triggers :
554e06c8227SJoel Becker 						  jh->b_triggers);
555f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
556470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
557470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
558470decc6SDave Kleikamp 			 * already allocated, even if we are now
559470decc6SDave Kleikamp 			 * aborting. */
560470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
561470decc6SDave Kleikamp 				goto start_journal_io;
562470decc6SDave Kleikamp 			continue;
563470decc6SDave Kleikamp 		}
564470decc6SDave Kleikamp 
565470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
566470decc6SDave Kleikamp 		   record the metadata buffer. */
567470decc6SDave Kleikamp 
568470decc6SDave Kleikamp 		if (!descriptor) {
569470decc6SDave Kleikamp 			struct buffer_head *bh;
570470decc6SDave Kleikamp 
571470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
572470decc6SDave Kleikamp 
573470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
574470decc6SDave Kleikamp 
575f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
576470decc6SDave Kleikamp 			if (!descriptor) {
577a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
578470decc6SDave Kleikamp 				continue;
579470decc6SDave Kleikamp 			}
580470decc6SDave Kleikamp 
581470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
582470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
583470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
584470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
585f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
586f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
587470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
588470decc6SDave Kleikamp 
589470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
590470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
591470decc6SDave Kleikamp 			first_tag = 1;
592470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
593470decc6SDave Kleikamp 			set_buffer_dirty(bh);
594470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
595470decc6SDave Kleikamp 
596470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
597470decc6SDave Kleikamp                            completion later */
598470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
599f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
600470decc6SDave Kleikamp 					BJ_LogCtl);
601470decc6SDave Kleikamp 		}
602470decc6SDave Kleikamp 
603470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
604470decc6SDave Kleikamp 
605f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
606470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
607470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
608470decc6SDave Kleikamp 		   refile-on-abort condition above. */
609470decc6SDave Kleikamp 		if (err) {
610a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
611470decc6SDave Kleikamp 			continue;
612470decc6SDave Kleikamp 		}
613470decc6SDave Kleikamp 
614470decc6SDave Kleikamp 		/*
615470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
616470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
617f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
618470decc6SDave Kleikamp 		 */
619470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
620470decc6SDave Kleikamp 
621470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
622470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
623470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
624470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
625470decc6SDave Kleikamp 
626470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
627470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
628470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
629470decc6SDave Kleikamp 
630470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
631470decc6SDave Kleikamp 		/*
632f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
633470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
634470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
635470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
636470decc6SDave Kleikamp 		 */
637470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
638f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
639470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
640e6ec116bSTheodore Ts'o 		if (flags < 0) {
641e6ec116bSTheodore Ts'o 			jbd2_journal_abort(journal, flags);
642e6ec116bSTheodore Ts'o 			continue;
643e6ec116bSTheodore Ts'o 		}
644470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
645470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
646470decc6SDave Kleikamp 
647470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
648470decc6SDave Kleikamp                    buffer */
649470decc6SDave Kleikamp 
650470decc6SDave Kleikamp 		tag_flag = 0;
651470decc6SDave Kleikamp 		if (flags & 1)
652f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
653470decc6SDave Kleikamp 		if (!first_tag)
654f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
655470decc6SDave Kleikamp 
656470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
657b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
658470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
659b517bea1SZach Brown 		tagp += tag_bytes;
660b517bea1SZach Brown 		space_left -= tag_bytes;
661470decc6SDave Kleikamp 
662470decc6SDave Kleikamp 		if (first_tag) {
663470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
664470decc6SDave Kleikamp 			tagp += 16;
665470decc6SDave Kleikamp 			space_left -= 16;
666470decc6SDave Kleikamp 			first_tag = 0;
667470decc6SDave Kleikamp 		}
668470decc6SDave Kleikamp 
669470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
670470decc6SDave Kleikamp 		   let the IO rip! */
671470decc6SDave Kleikamp 
672470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
673470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
674b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
675470decc6SDave Kleikamp 
676470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
677470decc6SDave Kleikamp 
678470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
679470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
680470decc6SDave Kleikamp                            the last tag we set up. */
681470decc6SDave Kleikamp 
682f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
683470decc6SDave Kleikamp 
684470decc6SDave Kleikamp start_journal_io:
685470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
686470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
687818d276cSGirish Shilamkar 				/*
688818d276cSGirish Shilamkar 				 * Compute checksum.
689818d276cSGirish Shilamkar 				 */
690818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
691818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
692818d276cSGirish Shilamkar 					crc32_sum =
693818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
694818d276cSGirish Shilamkar 				}
695818d276cSGirish Shilamkar 
696470decc6SDave Kleikamp 				lock_buffer(bh);
697470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
698470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
699470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
7007058548cSTheodore Ts'o 				submit_bh(write_op, bh);
701470decc6SDave Kleikamp 			}
702470decc6SDave Kleikamp 			cond_resched();
703bf699327STheodore Ts'o 			stats.run.rs_blocks_logged += bufs;
704470decc6SDave Kleikamp 
705470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
706470decc6SDave Kleikamp                            time round the loop. */
707470decc6SDave Kleikamp 			descriptor = NULL;
708470decc6SDave Kleikamp 			bufs = 0;
709470decc6SDave Kleikamp 		}
710470decc6SDave Kleikamp 	}
711470decc6SDave Kleikamp 
712cc3e1beaSTheodore Ts'o 	/*
713cc3e1beaSTheodore Ts'o 	 * If the journal is not located on the file system device,
714cc3e1beaSTheodore Ts'o 	 * then we must flush the file system device before we issue
715cc3e1beaSTheodore Ts'o 	 * the commit record
716cc3e1beaSTheodore Ts'o 	 */
717cc3e1beaSTheodore Ts'o 	if (commit_transaction->t_flushed_data_blocks &&
718cc3e1beaSTheodore Ts'o 	    (journal->j_fs_dev != journal->j_dev) &&
719cc3e1beaSTheodore Ts'o 	    (journal->j_flags & JBD2_BARRIER))
720cc3e1beaSTheodore Ts'o 		blkdev_issue_flush(journal->j_fs_dev, NULL);
721818d276cSGirish Shilamkar 
722cc3e1beaSTheodore Ts'o 	/* Done it all: now write the commit record asynchronously. */
723818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
724818d276cSGirish Shilamkar 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
725818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
726818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
727818d276cSGirish Shilamkar 		if (err)
728818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
7290e3d2a63STheodore Ts'o 		if (journal->j_flags & JBD2_BARRIER)
7300e3d2a63STheodore Ts'o 			blkdev_issue_flush(journal->j_dev, NULL);
731818d276cSGirish Shilamkar 	}
732818d276cSGirish Shilamkar 
733c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
734e9e34f4eSHidehiro Kawai 	if (err) {
735e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
736e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
73705496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
7385bf5683aSHidehiro Kawai 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
7395bf5683aSHidehiro Kawai 			jbd2_journal_abort(journal, err);
740e9e34f4eSHidehiro Kawai 		err = 0;
741e9e34f4eSHidehiro Kawai 	}
742c851ed54SJan Kara 
743470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
744470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
745470decc6SDave Kleikamp            complete.  Control buffers being written are on the
746470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
747470decc6SDave Kleikamp            the t_iobuf_list queue.
748470decc6SDave Kleikamp 
749470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
750470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
751470decc6SDave Kleikamp 	   so we incur less scheduling load.
752470decc6SDave Kleikamp 	*/
753470decc6SDave Kleikamp 
75487c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
755470decc6SDave Kleikamp 
756470decc6SDave Kleikamp 	/*
757470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
758470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
759470decc6SDave Kleikamp 	 */
760470decc6SDave Kleikamp wait_for_iobuf:
761470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
762470decc6SDave Kleikamp 		struct buffer_head *bh;
763470decc6SDave Kleikamp 
764470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
765470decc6SDave Kleikamp 		bh = jh2bh(jh);
766470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
767470decc6SDave Kleikamp 			wait_on_buffer(bh);
768470decc6SDave Kleikamp 			goto wait_for_iobuf;
769470decc6SDave Kleikamp 		}
770470decc6SDave Kleikamp 		if (cond_resched())
771470decc6SDave Kleikamp 			goto wait_for_iobuf;
772470decc6SDave Kleikamp 
773470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
774470decc6SDave Kleikamp 			err = -EIO;
775470decc6SDave Kleikamp 
776470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
777470decc6SDave Kleikamp 
778470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
779f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
780470decc6SDave Kleikamp 
781470decc6SDave Kleikamp 		/*
782470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
783f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
784470decc6SDave Kleikamp 		 */
785470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
786f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
787470decc6SDave Kleikamp 		__brelse(bh);
788470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
789470decc6SDave Kleikamp 		free_buffer_head(bh);
790470decc6SDave Kleikamp 
791470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
792470decc6SDave Kleikamp                    shadowed buffer */
793470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
794470decc6SDave Kleikamp 		bh = jh2bh(jh);
795470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
796470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
797470decc6SDave Kleikamp 
798470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
799470decc6SDave Kleikamp                    to remember it against this transaction so that when
800470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
801470decc6SDave Kleikamp                    required. */
802470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
803f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
804470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
805470decc6SDave Kleikamp 		   IO to complete */
806470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
807470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
808470decc6SDave Kleikamp 		__brelse(bh);
809470decc6SDave Kleikamp 	}
810470decc6SDave Kleikamp 
811470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
812470decc6SDave Kleikamp 
81387c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
814470decc6SDave Kleikamp 
815470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
816470decc6SDave Kleikamp  wait_for_ctlbuf:
817470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
818470decc6SDave Kleikamp 		struct buffer_head *bh;
819470decc6SDave Kleikamp 
820470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
821470decc6SDave Kleikamp 		bh = jh2bh(jh);
822470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
823470decc6SDave Kleikamp 			wait_on_buffer(bh);
824470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
825470decc6SDave Kleikamp 		}
826470decc6SDave Kleikamp 		if (cond_resched())
827470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
828470decc6SDave Kleikamp 
829470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
830470decc6SDave Kleikamp 			err = -EIO;
831470decc6SDave Kleikamp 
832470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
833470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
834f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
835f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
836470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
837470decc6SDave Kleikamp 		/* AKPM: bforget here */
838470decc6SDave Kleikamp 	}
839470decc6SDave Kleikamp 
84077e841deSHidehiro Kawai 	if (err)
84177e841deSHidehiro Kawai 		jbd2_journal_abort(journal, err);
84277e841deSHidehiro Kawai 
84387c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
844470decc6SDave Kleikamp 
845818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
846818d276cSGirish Shilamkar 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
847818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
848818d276cSGirish Shilamkar 						&cbh, crc32_sum);
849818d276cSGirish Shilamkar 		if (err)
850818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
851818d276cSGirish Shilamkar 	}
852b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
853fd98496fSTheodore Ts'o 		err = journal_wait_on_commit_record(journal, cbh);
854470decc6SDave Kleikamp 
855470decc6SDave Kleikamp 	if (err)
856a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
857470decc6SDave Kleikamp 
858470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
859470decc6SDave Kleikamp            processing: any buffers committed as a result of this
860470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
861470decc6SDave Kleikamp            before. */
862470decc6SDave Kleikamp 
86387c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
864470decc6SDave Kleikamp 
865c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
866470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
867470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
868470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
869470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
870470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
871470decc6SDave Kleikamp 
872470decc6SDave Kleikamp restart_loop:
873470decc6SDave Kleikamp 	/*
874470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
875470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
876470decc6SDave Kleikamp 	 */
877470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
878470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
879470decc6SDave Kleikamp 		transaction_t *cp_transaction;
880470decc6SDave Kleikamp 		struct buffer_head *bh;
881470decc6SDave Kleikamp 
882470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
883470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
884470decc6SDave Kleikamp 		bh = jh2bh(jh);
885470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
886470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
887470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
888470decc6SDave Kleikamp 
889470decc6SDave Kleikamp 		/*
890470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
891470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
892470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
893470decc6SDave Kleikamp 		 * field now points to a committed version of the
894470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
895470decc6SDave Kleikamp 		 * data.
896470decc6SDave Kleikamp 		 *
897470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
898e06c8227SJoel Becker 		 *
899e06c8227SJoel Becker 		 * We also know that the frozen data has already fired
900e06c8227SJoel Becker 		 * its triggers if they exist, so we can clear that too.
901470decc6SDave Kleikamp 		 */
902470decc6SDave Kleikamp 		if (jh->b_committed_data) {
903af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
904470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
905470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
906470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
907470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
908e06c8227SJoel Becker 				jh->b_frozen_triggers = NULL;
909470decc6SDave Kleikamp 			}
910470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
911af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
912470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
913e06c8227SJoel Becker 			jh->b_frozen_triggers = NULL;
914470decc6SDave Kleikamp 		}
915470decc6SDave Kleikamp 
916470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
917470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
918470decc6SDave Kleikamp 		if (cp_transaction) {
919470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
9208e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
921f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
922470decc6SDave Kleikamp 		}
923470decc6SDave Kleikamp 
924470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
925470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
926f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
927470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
928470decc6SDave Kleikamp 		 * it. */
929470decc6SDave Kleikamp 
930470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
931470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
932470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
933*ba869023Sdingdinghua 		 * that buffer in the future after the "add to orphan"
934*ba869023Sdingdinghua 		 * operation been committed,  That's not only a performance
935*ba869023Sdingdinghua 		 * gain, it also stops aliasing problems if the buffer is
936*ba869023Sdingdinghua 		 * left behind for writeback and gets reallocated for another
937470decc6SDave Kleikamp 		 * use in a different page. */
938*ba869023Sdingdinghua 		if (buffer_freed(bh) && !jh->b_next_transaction) {
939470decc6SDave Kleikamp 			clear_buffer_freed(bh);
940470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
941470decc6SDave Kleikamp 		}
942470decc6SDave Kleikamp 
943470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
944470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
945f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
9467ad7445fSHidehiro Kawai 			if (is_journal_aborted(journal))
9477ad7445fSHidehiro Kawai 				clear_buffer_jbddirty(bh);
948470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
949f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
950470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
951470decc6SDave Kleikamp 		} else {
952470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
953470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
954470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
955470decc6SDave Kleikamp 			 * could not have been reallocated until this
956470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
957470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
958470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
959470decc6SDave Kleikamp 			 * list. */
960470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
961f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
962470decc6SDave Kleikamp 			if (!jh->b_transaction) {
963470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
964470decc6SDave Kleikamp 				 /* needs a brelse */
965f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
966470decc6SDave Kleikamp 				release_buffer_page(bh);
967470decc6SDave Kleikamp 			} else
968470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
969470decc6SDave Kleikamp 		}
970470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
971470decc6SDave Kleikamp 	}
972470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
973470decc6SDave Kleikamp 	/*
974f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
975f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
976f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
977f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
978470decc6SDave Kleikamp 	 */
979470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
980470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
981470decc6SDave Kleikamp 	/*
982470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
983470decc6SDave Kleikamp 	 * while the lock was dropped...
984470decc6SDave Kleikamp 	 */
985470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
986470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
987470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
988470decc6SDave Kleikamp 		goto restart_loop;
989470decc6SDave Kleikamp 	}
990470decc6SDave Kleikamp 
991470decc6SDave Kleikamp 	/* Done with this transaction! */
992470decc6SDave Kleikamp 
99387c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
994470decc6SDave Kleikamp 
995470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
996470decc6SDave Kleikamp 
9978e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
998bf699327STheodore Ts'o 	stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
9998e85fb3fSJohann Lombardi 					      commit_transaction->t_start);
10008e85fb3fSJohann Lombardi 
10018e85fb3fSJohann Lombardi 	/*
1002bf699327STheodore Ts'o 	 * File the transaction statistics
10038e85fb3fSJohann Lombardi 	 */
10048e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
1005bf699327STheodore Ts'o 	stats.run.rs_handle_count = commit_transaction->t_handle_count;
1006bf699327STheodore Ts'o 	trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
1007bf699327STheodore Ts'o 			     commit_transaction->t_tid, &stats.run);
10088e85fb3fSJohann Lombardi 
10098e85fb3fSJohann Lombardi 	/*
10108e85fb3fSJohann Lombardi 	 * Calculate overall stats
10118e85fb3fSJohann Lombardi 	 */
1012bf699327STheodore Ts'o 	spin_lock(&journal->j_history_lock);
10138e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
1014bf699327STheodore Ts'o 	journal->j_stats.run.rs_wait += stats.run.rs_wait;
1015bf699327STheodore Ts'o 	journal->j_stats.run.rs_running += stats.run.rs_running;
1016bf699327STheodore Ts'o 	journal->j_stats.run.rs_locked += stats.run.rs_locked;
1017bf699327STheodore Ts'o 	journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
1018bf699327STheodore Ts'o 	journal->j_stats.run.rs_logging += stats.run.rs_logging;
1019bf699327STheodore Ts'o 	journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
1020bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
1021bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
10228e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
10238e85fb3fSJohann Lombardi 
1024470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
1025470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
1026470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
1027470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
1028e07f7183SJosef Bacik 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
1029470decc6SDave Kleikamp 
1030e07f7183SJosef Bacik 	/*
1031e07f7183SJosef Bacik 	 * weight the commit time higher than the average time so we don't
1032e07f7183SJosef Bacik 	 * react too strongly to vast changes in the commit time
1033e07f7183SJosef Bacik 	 */
1034e07f7183SJosef Bacik 	if (likely(journal->j_average_commit_time))
1035e07f7183SJosef Bacik 		journal->j_average_commit_time = (commit_time +
1036e07f7183SJosef Bacik 				journal->j_average_commit_time*3) / 4;
1037e07f7183SJosef Bacik 	else
1038e07f7183SJosef Bacik 		journal->j_average_commit_time = commit_time;
1039470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
10406c20ec85STheodore Ts'o 
1041f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1042f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1043f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1044fb68407bSAneesh Kumar K.V 		to_free = 1;
1045470decc6SDave Kleikamp 	} else {
1046470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1047470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1048470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1049470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1050470decc6SDave Kleikamp 		} else {
1051470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1052470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1053470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1054470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1055470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1056470decc6SDave Kleikamp 				commit_transaction;
1057470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1058470decc6SDave Kleikamp 				commit_transaction;
1059470decc6SDave Kleikamp 		}
1060470decc6SDave Kleikamp 	}
1061470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1062470decc6SDave Kleikamp 
1063fb68407bSAneesh Kumar K.V 	if (journal->j_commit_callback)
1064fb68407bSAneesh Kumar K.V 		journal->j_commit_callback(journal, commit_transaction);
1065fb68407bSAneesh Kumar K.V 
1066879c5e6bSTheodore Ts'o 	trace_jbd2_end_commit(journal, commit_transaction);
1067470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1068470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1069fb68407bSAneesh Kumar K.V 	if (to_free)
1070fb68407bSAneesh Kumar K.V 		kfree(commit_transaction);
1071470decc6SDave Kleikamp 
1072470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1073470decc6SDave Kleikamp }
1074