xref: /linux-6.15/fs/jbd2/commit.c (revision 749ef9f8)
1470decc6SDave Kleikamp /*
2f7f4bccbSMingming Cao  * linux/fs/jbd2/commit.c
3470decc6SDave Kleikamp  *
4470decc6SDave Kleikamp  * Written by Stephen C. Tweedie <[email protected]>, 1998
5470decc6SDave Kleikamp  *
6470decc6SDave Kleikamp  * Copyright 1998 Red Hat corp --- All Rights Reserved
7470decc6SDave Kleikamp  *
8470decc6SDave Kleikamp  * This file is part of the Linux kernel and is made available under
9470decc6SDave Kleikamp  * the terms of the GNU General Public License, version 2, or at your
10470decc6SDave Kleikamp  * option, any later version, incorporated herein by reference.
11470decc6SDave Kleikamp  *
12470decc6SDave Kleikamp  * Journal commit routines for the generic filesystem journaling code;
13470decc6SDave Kleikamp  * part of the ext2fs journaling system.
14470decc6SDave Kleikamp  */
15470decc6SDave Kleikamp 
16470decc6SDave Kleikamp #include <linux/time.h>
17470decc6SDave Kleikamp #include <linux/fs.h>
18f7f4bccbSMingming Cao #include <linux/jbd2.h>
19470decc6SDave Kleikamp #include <linux/errno.h>
20470decc6SDave Kleikamp #include <linux/slab.h>
21470decc6SDave Kleikamp #include <linux/mm.h>
22470decc6SDave Kleikamp #include <linux/pagemap.h>
238e85fb3fSJohann Lombardi #include <linux/jiffies.h>
24818d276cSGirish Shilamkar #include <linux/crc32.h>
25cd1aac32SAneesh Kumar K.V #include <linux/writeback.h>
26cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h>
27fd98496fSTheodore Ts'o #include <linux/bio.h>
280e3d2a63STheodore Ts'o #include <linux/blkdev.h>
29879c5e6bSTheodore Ts'o #include <trace/events/jbd2.h>
30470decc6SDave Kleikamp 
31470decc6SDave Kleikamp /*
32470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
33470decc6SDave Kleikamp  */
34470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
35470decc6SDave Kleikamp {
36470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
37470decc6SDave Kleikamp 	if (uptodate)
38470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
39470decc6SDave Kleikamp 	else
40470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
41470decc6SDave Kleikamp 	unlock_buffer(bh);
42470decc6SDave Kleikamp }
43470decc6SDave Kleikamp 
44470decc6SDave Kleikamp /*
4587c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4687c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
47470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
48470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
49470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
50470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
51470decc6SDave Kleikamp  *
52470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
53470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
54470decc6SDave Kleikamp  *
55470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
56470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
57470decc6SDave Kleikamp  */
58470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
59470decc6SDave Kleikamp {
60470decc6SDave Kleikamp 	struct page *page;
61470decc6SDave Kleikamp 
62470decc6SDave Kleikamp 	if (buffer_dirty(bh))
63470decc6SDave Kleikamp 		goto nope;
64470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
65470decc6SDave Kleikamp 		goto nope;
66470decc6SDave Kleikamp 	page = bh->b_page;
67470decc6SDave Kleikamp 	if (!page)
68470decc6SDave Kleikamp 		goto nope;
69470decc6SDave Kleikamp 	if (page->mapping)
70470decc6SDave Kleikamp 		goto nope;
71470decc6SDave Kleikamp 
72470decc6SDave Kleikamp 	/* OK, it's a truncated page */
73529ae9aaSNick Piggin 	if (!trylock_page(page))
74470decc6SDave Kleikamp 		goto nope;
75470decc6SDave Kleikamp 
76470decc6SDave Kleikamp 	page_cache_get(page);
77470decc6SDave Kleikamp 	__brelse(bh);
78470decc6SDave Kleikamp 	try_to_free_buffers(page);
79470decc6SDave Kleikamp 	unlock_page(page);
80470decc6SDave Kleikamp 	page_cache_release(page);
81470decc6SDave Kleikamp 	return;
82470decc6SDave Kleikamp 
83470decc6SDave Kleikamp nope:
84470decc6SDave Kleikamp 	__brelse(bh);
85470decc6SDave Kleikamp }
86470decc6SDave Kleikamp 
87470decc6SDave Kleikamp /*
88818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
89470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
90470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
91470decc6SDave Kleikamp  * entirely.
92470decc6SDave Kleikamp  *
93470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
94470decc6SDave Kleikamp  */
95818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
96818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
97818d276cSGirish Shilamkar 					struct buffer_head **cbh,
98818d276cSGirish Shilamkar 					__u32 crc32_sum)
99470decc6SDave Kleikamp {
100470decc6SDave Kleikamp 	struct journal_head *descriptor;
101818d276cSGirish Shilamkar 	struct commit_header *tmp;
102470decc6SDave Kleikamp 	struct buffer_head *bh;
103818d276cSGirish Shilamkar 	int ret;
104736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
105470decc6SDave Kleikamp 
106470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
107470decc6SDave Kleikamp 		return 0;
108470decc6SDave Kleikamp 
109f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
110470decc6SDave Kleikamp 	if (!descriptor)
111470decc6SDave Kleikamp 		return 1;
112470decc6SDave Kleikamp 
113470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
114470decc6SDave Kleikamp 
115818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
116f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
117f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
118470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
119736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
120736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
121818d276cSGirish Shilamkar 
122818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
123818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
124818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
125818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
126818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
127470decc6SDave Kleikamp 	}
128470decc6SDave Kleikamp 
129818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
130818d276cSGirish Shilamkar 	lock_buffer(bh);
13145a90bfdSTheodore Ts'o 	clear_buffer_dirty(bh);
132818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
133818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
134818d276cSGirish Shilamkar 
135818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1364d605179SAneesh Kumar K.V 	    !JBD2_HAS_INCOMPAT_FEATURE(journal,
137818d276cSGirish Shilamkar 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
13887e99511SChristoph Hellwig 		ret = submit_bh(WRITE_SYNC_PLUG | WRITE_BARRIER, bh);
13987e99511SChristoph Hellwig 		if (ret == -EOPNOTSUPP) {
140470decc6SDave Kleikamp 			printk(KERN_WARNING
141cc937db7SEric Sandeen 			       "JBD2: Disabling barriers on %s, "
142cc937db7SEric Sandeen 			       "not supported by device\n", journal->j_devname);
143a931da6aSTheodore Ts'o 			write_lock(&journal->j_state_lock);
144f7f4bccbSMingming Cao 			journal->j_flags &= ~JBD2_BARRIER;
145a931da6aSTheodore Ts'o 			write_unlock(&journal->j_state_lock);
146470decc6SDave Kleikamp 
147470decc6SDave Kleikamp 			/* And try again, without the barrier */
148034772b0STheodore Ts'o 			lock_buffer(bh);
149470decc6SDave Kleikamp 			set_buffer_uptodate(bh);
15045a90bfdSTheodore Ts'o 			clear_buffer_dirty(bh);
1514194b1eaSJens Axboe 			ret = submit_bh(WRITE_SYNC_PLUG, bh);
152470decc6SDave Kleikamp 		}
15387e99511SChristoph Hellwig 	} else {
15487e99511SChristoph Hellwig 		ret = submit_bh(WRITE_SYNC_PLUG, bh);
15587e99511SChristoph Hellwig 	}
156818d276cSGirish Shilamkar 	*cbh = bh;
157818d276cSGirish Shilamkar 	return ret;
158818d276cSGirish Shilamkar }
159470decc6SDave Kleikamp 
160818d276cSGirish Shilamkar /*
161818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
162818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
163818d276cSGirish Shilamkar  */
164fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal,
165fd98496fSTheodore Ts'o 					 struct buffer_head *bh)
166818d276cSGirish Shilamkar {
167818d276cSGirish Shilamkar 	int ret = 0;
168818d276cSGirish Shilamkar 
169fd98496fSTheodore Ts'o retry:
170818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
171818d276cSGirish Shilamkar 	wait_on_buffer(bh);
172fd98496fSTheodore Ts'o 	if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
173fd98496fSTheodore Ts'o 		printk(KERN_WARNING
174cc937db7SEric Sandeen 		       "JBD2: %s: disabling barries on %s - not supported "
175cc937db7SEric Sandeen 		       "by device\n", __func__, journal->j_devname);
176a931da6aSTheodore Ts'o 		write_lock(&journal->j_state_lock);
177fd98496fSTheodore Ts'o 		journal->j_flags &= ~JBD2_BARRIER;
178a931da6aSTheodore Ts'o 		write_unlock(&journal->j_state_lock);
179fd98496fSTheodore Ts'o 
180fd98496fSTheodore Ts'o 		lock_buffer(bh);
181fd98496fSTheodore Ts'o 		clear_buffer_dirty(bh);
182fd98496fSTheodore Ts'o 		set_buffer_uptodate(bh);
183fd98496fSTheodore Ts'o 		bh->b_end_io = journal_end_buffer_io_sync;
184fd98496fSTheodore Ts'o 
1854194b1eaSJens Axboe 		ret = submit_bh(WRITE_SYNC_PLUG, bh);
186fd98496fSTheodore Ts'o 		if (ret) {
187fd98496fSTheodore Ts'o 			unlock_buffer(bh);
188fd98496fSTheodore Ts'o 			return ret;
189fd98496fSTheodore Ts'o 		}
190fd98496fSTheodore Ts'o 		goto retry;
191fd98496fSTheodore Ts'o 	}
192818d276cSGirish Shilamkar 
193818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
194818d276cSGirish Shilamkar 		ret = -EIO;
195818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
196818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
197818d276cSGirish Shilamkar 
198818d276cSGirish Shilamkar 	return ret;
199818d276cSGirish Shilamkar }
200818d276cSGirish Shilamkar 
201818d276cSGirish Shilamkar /*
202cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
203cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
204cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
205cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
206cd1aac32SAneesh Kumar K.V  */
207cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
208cd1aac32SAneesh Kumar K.V {
209cd1aac32SAneesh Kumar K.V 	int ret;
210cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
211cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
212cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
213cd1aac32SAneesh Kumar K.V 		.range_start = 0,
214cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
215cd1aac32SAneesh Kumar K.V 	};
216cd1aac32SAneesh Kumar K.V 
217cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
218cd1aac32SAneesh Kumar K.V 	return ret;
219cd1aac32SAneesh Kumar K.V }
220cd1aac32SAneesh Kumar K.V 
221cd1aac32SAneesh Kumar K.V /*
222c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
223c851ed54SJan Kara  * disk.
224c851ed54SJan Kara  *
225c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
226c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
227c851ed54SJan Kara  * operate on from being released while we write out pages.
228c851ed54SJan Kara  */
229cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
230c851ed54SJan Kara 		transaction_t *commit_transaction)
231c851ed54SJan Kara {
232c851ed54SJan Kara 	struct jbd2_inode *jinode;
233c851ed54SJan Kara 	int err, ret = 0;
234c851ed54SJan Kara 	struct address_space *mapping;
235c851ed54SJan Kara 
236c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
237c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
238c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
239c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
240c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
241cd1aac32SAneesh Kumar K.V 		/*
242cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
243cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
244cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
245cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
246cd1aac32SAneesh Kumar K.V 		 */
247879c5e6bSTheodore Ts'o 		trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
248cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
249c851ed54SJan Kara 		if (!ret)
250c851ed54SJan Kara 			ret = err;
251c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
252c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
253cc3e1beaSTheodore Ts'o 		commit_transaction->t_flushed_data_blocks = 1;
254c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
255c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
256c851ed54SJan Kara 	}
257c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
258c851ed54SJan Kara 	return ret;
259c851ed54SJan Kara }
260c851ed54SJan Kara 
261c851ed54SJan Kara /*
262c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
263c851ed54SJan Kara  * transaction if needed.
264c851ed54SJan Kara  *
265c851ed54SJan Kara  */
266c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
267c851ed54SJan Kara 		transaction_t *commit_transaction)
268c851ed54SJan Kara {
269c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
270c851ed54SJan Kara 	int err, ret = 0;
271c851ed54SJan Kara 
272cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
273c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
274c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
275c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
276c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
277c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
278e9e34f4eSHidehiro Kawai 		if (err) {
279e9e34f4eSHidehiro Kawai 			/*
280e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
28194004ed7SChristoph Hellwig 			 * filemap_fdatawait_range(), set it again so
282e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
283e9e34f4eSHidehiro Kawai 			 */
284e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
285e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
286e9e34f4eSHidehiro Kawai 
287c851ed54SJan Kara 			if (!ret)
288c851ed54SJan Kara 				ret = err;
289e9e34f4eSHidehiro Kawai 		}
290c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
291c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
292c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
293c851ed54SJan Kara 	}
294c851ed54SJan Kara 
295c851ed54SJan Kara 	/* Now refile inode to proper lists */
296c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
297c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
298c851ed54SJan Kara 		list_del(&jinode->i_list);
299c851ed54SJan Kara 		if (jinode->i_next_transaction) {
300c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
301c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
302c851ed54SJan Kara 			list_add(&jinode->i_list,
303c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
304c851ed54SJan Kara 		} else {
305c851ed54SJan Kara 			jinode->i_transaction = NULL;
306c851ed54SJan Kara 		}
307c851ed54SJan Kara 	}
308c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
309c851ed54SJan Kara 
310c851ed54SJan Kara 	return ret;
311c851ed54SJan Kara }
312c851ed54SJan Kara 
313818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
314818d276cSGirish Shilamkar {
315818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
316818d276cSGirish Shilamkar 	char *addr;
317818d276cSGirish Shilamkar 	__u32 checksum;
318818d276cSGirish Shilamkar 
319818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
320818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
321818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
322818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
323818d276cSGirish Shilamkar 
324818d276cSGirish Shilamkar 	return checksum;
325818d276cSGirish Shilamkar }
326818d276cSGirish Shilamkar 
327818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
32818eba7aaSMingming Cao 				   unsigned long long block)
329b517bea1SZach Brown {
330b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
331cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
332b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
333b517bea1SZach Brown }
334b517bea1SZach Brown 
335470decc6SDave Kleikamp /*
336f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
337470decc6SDave Kleikamp  *
338470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
339470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
340470decc6SDave Kleikamp  */
341f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
342470decc6SDave Kleikamp {
3438e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
344470decc6SDave Kleikamp 	transaction_t *commit_transaction;
345470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
346470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
347470decc6SDave Kleikamp 	int bufs;
348470decc6SDave Kleikamp 	int flags;
349470decc6SDave Kleikamp 	int err;
35018eba7aaSMingming Cao 	unsigned long long blocknr;
351e07f7183SJosef Bacik 	ktime_t start_time;
352e07f7183SJosef Bacik 	u64 commit_time;
353470decc6SDave Kleikamp 	char *tagp = NULL;
354470decc6SDave Kleikamp 	journal_header_t *header;
355470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
356470decc6SDave Kleikamp 	int space_left = 0;
357470decc6SDave Kleikamp 	int first_tag = 0;
358470decc6SDave Kleikamp 	int tag_flag;
359fb68407bSAneesh Kumar K.V 	int i, to_free = 0;
360b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
361818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
362818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
363*749ef9f8SCorrado Zoccolo 	int write_op = WRITE_SYNC;
364470decc6SDave Kleikamp 
365470decc6SDave Kleikamp 	/*
366470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
367470decc6SDave Kleikamp 	 * all outstanding updates to complete.
368470decc6SDave Kleikamp 	 */
369470decc6SDave Kleikamp 
370470decc6SDave Kleikamp #ifdef COMMIT_STATS
371470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
372470decc6SDave Kleikamp 	summarise_journal_usage(journal);
373470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
374470decc6SDave Kleikamp #endif
375470decc6SDave Kleikamp 
376f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
377f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
378470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
379f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
380470decc6SDave Kleikamp 	} else {
381470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
382470decc6SDave Kleikamp 	}
383470decc6SDave Kleikamp 
384470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
385470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
386470decc6SDave Kleikamp 
387470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
388470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
389470decc6SDave Kleikamp 
390879c5e6bSTheodore Ts'o 	trace_jbd2_start_commit(journal, commit_transaction);
391470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
392470decc6SDave Kleikamp 			commit_transaction->t_tid);
393470decc6SDave Kleikamp 
394a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
395470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
396470decc6SDave Kleikamp 
3974194b1eaSJens Axboe 	/*
3984194b1eaSJens Axboe 	 * Use plugged writes here, since we want to submit several before
3994194b1eaSJens Axboe 	 * we unplug the device. We don't do explicit unplugging in here,
4004194b1eaSJens Axboe 	 * instead we rely on sync_buffer() doing the unplug for us.
4014194b1eaSJens Axboe 	 */
4027058548cSTheodore Ts'o 	if (commit_transaction->t_synchronous_commit)
4034194b1eaSJens Axboe 		write_op = WRITE_SYNC_PLUG;
404879c5e6bSTheodore Ts'o 	trace_jbd2_commit_locking(journal, commit_transaction);
405bf699327STheodore Ts'o 	stats.run.rs_wait = commit_transaction->t_max_wait;
406bf699327STheodore Ts'o 	stats.run.rs_locked = jiffies;
407bf699327STheodore Ts'o 	stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
408bf699327STheodore Ts'o 					      stats.run.rs_locked);
4098e85fb3fSJohann Lombardi 
410470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
411a51dca9cSTheodore Ts'o 	while (atomic_read(&commit_transaction->t_updates)) {
412470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
413470decc6SDave Kleikamp 
414470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
415470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
416a51dca9cSTheodore Ts'o 		if (atomic_read(&commit_transaction->t_updates)) {
417470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
418a931da6aSTheodore Ts'o 			write_unlock(&journal->j_state_lock);
419470decc6SDave Kleikamp 			schedule();
420a931da6aSTheodore Ts'o 			write_lock(&journal->j_state_lock);
421470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
422470decc6SDave Kleikamp 		}
423470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
424470decc6SDave Kleikamp 	}
425470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
426470decc6SDave Kleikamp 
427a51dca9cSTheodore Ts'o 	J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
428470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
429470decc6SDave Kleikamp 
430470decc6SDave Kleikamp 	/*
431470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
432470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
433470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
434470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
435f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
436470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
437470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
438470decc6SDave Kleikamp 	 *
439470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
440470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
441470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
442470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
443f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
444470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
445470decc6SDave Kleikamp 	 */
446470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
447470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
448470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
449470decc6SDave Kleikamp 		/*
450f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
451470decc6SDave Kleikamp 		 * leave undo-committed data.
452470decc6SDave Kleikamp 		 */
453470decc6SDave Kleikamp 		if (jh->b_committed_data) {
454470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
455470decc6SDave Kleikamp 
456470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
457af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
458470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
459470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
460470decc6SDave Kleikamp 		}
461f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
462470decc6SDave Kleikamp 	}
463470decc6SDave Kleikamp 
464470decc6SDave Kleikamp 	/*
465470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
466470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
467470decc6SDave Kleikamp 	 * frees some memory
468470decc6SDave Kleikamp 	 */
469470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
470f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
471470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
472470decc6SDave Kleikamp 
473470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
474470decc6SDave Kleikamp 
475470decc6SDave Kleikamp 	/*
476470decc6SDave Kleikamp 	 * Switch to a new revoke table.
477470decc6SDave Kleikamp 	 */
478f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
479470decc6SDave Kleikamp 
480879c5e6bSTheodore Ts'o 	trace_jbd2_commit_flushing(journal, commit_transaction);
481bf699327STheodore Ts'o 	stats.run.rs_flushing = jiffies;
482bf699327STheodore Ts'o 	stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
483bf699327STheodore Ts'o 					     stats.run.rs_flushing);
4848e85fb3fSJohann Lombardi 
485470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
486470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
487470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
488e07f7183SJosef Bacik 	start_time = ktime_get();
489470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
490470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
491a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
492470decc6SDave Kleikamp 
493470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
494470decc6SDave Kleikamp 
495470decc6SDave Kleikamp 	/*
496470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
497470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
498470decc6SDave Kleikamp 	 */
499cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
500c851ed54SJan Kara 	if (err)
501c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
502470decc6SDave Kleikamp 
50367c457a8STheodore Ts'o 	jbd2_journal_write_revoke_records(journal, commit_transaction,
50467c457a8STheodore Ts'o 					  write_op);
505470decc6SDave Kleikamp 
506470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
507470decc6SDave Kleikamp 
508470decc6SDave Kleikamp 	/*
509470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
510470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
511470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
512470decc6SDave Kleikamp 	 */
513a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
514470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
515a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
516470decc6SDave Kleikamp 
517879c5e6bSTheodore Ts'o 	trace_jbd2_commit_logging(journal, commit_transaction);
518bf699327STheodore Ts'o 	stats.run.rs_logging = jiffies;
519bf699327STheodore Ts'o 	stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
520bf699327STheodore Ts'o 					       stats.run.rs_logging);
521a51dca9cSTheodore Ts'o 	stats.run.rs_blocks =
522a51dca9cSTheodore Ts'o 		atomic_read(&commit_transaction->t_outstanding_credits);
523bf699327STheodore Ts'o 	stats.run.rs_blocks_logged = 0;
5248e85fb3fSJohann Lombardi 
5251dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
526a51dca9cSTheodore Ts'o 		 atomic_read(&commit_transaction->t_outstanding_credits));
5271dfc3220SJosef Bacik 
52887c89c23SJan Kara 	err = 0;
529470decc6SDave Kleikamp 	descriptor = NULL;
530470decc6SDave Kleikamp 	bufs = 0;
531470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
532470decc6SDave Kleikamp 
533470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
534470decc6SDave Kleikamp 
535470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
536470decc6SDave Kleikamp 
537470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
5387ad7445fSHidehiro Kawai 		   release it. */
539470decc6SDave Kleikamp 
540470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
5417ad7445fSHidehiro Kawai 			clear_buffer_jbddirty(jh2bh(jh));
542470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
543e06c8227SJoel Becker 			jbd2_buffer_abort_trigger(jh,
544e06c8227SJoel Becker 						  jh->b_frozen_data ?
545e06c8227SJoel Becker 						  jh->b_frozen_triggers :
546e06c8227SJoel Becker 						  jh->b_triggers);
547f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
548470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
549470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
550470decc6SDave Kleikamp 			 * already allocated, even if we are now
551470decc6SDave Kleikamp 			 * aborting. */
552470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
553470decc6SDave Kleikamp 				goto start_journal_io;
554470decc6SDave Kleikamp 			continue;
555470decc6SDave Kleikamp 		}
556470decc6SDave Kleikamp 
557470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
558470decc6SDave Kleikamp 		   record the metadata buffer. */
559470decc6SDave Kleikamp 
560470decc6SDave Kleikamp 		if (!descriptor) {
561470decc6SDave Kleikamp 			struct buffer_head *bh;
562470decc6SDave Kleikamp 
563470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
564470decc6SDave Kleikamp 
565470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
566470decc6SDave Kleikamp 
567f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
568470decc6SDave Kleikamp 			if (!descriptor) {
569a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
570470decc6SDave Kleikamp 				continue;
571470decc6SDave Kleikamp 			}
572470decc6SDave Kleikamp 
573470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
574470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
575470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
576470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
577f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
578f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
579470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
580470decc6SDave Kleikamp 
581470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
582470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
583470decc6SDave Kleikamp 			first_tag = 1;
584470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
585470decc6SDave Kleikamp 			set_buffer_dirty(bh);
586470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
587470decc6SDave Kleikamp 
588470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
589470decc6SDave Kleikamp                            completion later */
590470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
591f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
592470decc6SDave Kleikamp 					BJ_LogCtl);
593470decc6SDave Kleikamp 		}
594470decc6SDave Kleikamp 
595470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
596470decc6SDave Kleikamp 
597f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
598470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
599470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
600470decc6SDave Kleikamp 		   refile-on-abort condition above. */
601470decc6SDave Kleikamp 		if (err) {
602a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
603470decc6SDave Kleikamp 			continue;
604470decc6SDave Kleikamp 		}
605470decc6SDave Kleikamp 
606470decc6SDave Kleikamp 		/*
607470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
608470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
609f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
610470decc6SDave Kleikamp 		 */
611a51dca9cSTheodore Ts'o 		atomic_dec(&commit_transaction->t_outstanding_credits);
612470decc6SDave Kleikamp 
613470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
614470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
615470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
616470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
617470decc6SDave Kleikamp 
618470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
619470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
620470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
621470decc6SDave Kleikamp 
622470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
623470decc6SDave Kleikamp 		/*
624f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
625470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
626470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
627470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
628470decc6SDave Kleikamp 		 */
629470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
630f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
631470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
632e6ec116bSTheodore Ts'o 		if (flags < 0) {
633e6ec116bSTheodore Ts'o 			jbd2_journal_abort(journal, flags);
634e6ec116bSTheodore Ts'o 			continue;
635e6ec116bSTheodore Ts'o 		}
636470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
637470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
638470decc6SDave Kleikamp 
639470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
640470decc6SDave Kleikamp                    buffer */
641470decc6SDave Kleikamp 
642470decc6SDave Kleikamp 		tag_flag = 0;
643470decc6SDave Kleikamp 		if (flags & 1)
644f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
645470decc6SDave Kleikamp 		if (!first_tag)
646f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
647470decc6SDave Kleikamp 
648470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
649b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
650470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
651b517bea1SZach Brown 		tagp += tag_bytes;
652b517bea1SZach Brown 		space_left -= tag_bytes;
653470decc6SDave Kleikamp 
654470decc6SDave Kleikamp 		if (first_tag) {
655470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
656470decc6SDave Kleikamp 			tagp += 16;
657470decc6SDave Kleikamp 			space_left -= 16;
658470decc6SDave Kleikamp 			first_tag = 0;
659470decc6SDave Kleikamp 		}
660470decc6SDave Kleikamp 
661470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
662470decc6SDave Kleikamp 		   let the IO rip! */
663470decc6SDave Kleikamp 
664470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
665470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
666b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
667470decc6SDave Kleikamp 
668470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
669470decc6SDave Kleikamp 
670470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
671470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
672470decc6SDave Kleikamp                            the last tag we set up. */
673470decc6SDave Kleikamp 
674f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
675470decc6SDave Kleikamp 
676470decc6SDave Kleikamp start_journal_io:
677470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
678470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
679818d276cSGirish Shilamkar 				/*
680818d276cSGirish Shilamkar 				 * Compute checksum.
681818d276cSGirish Shilamkar 				 */
682818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
683818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
684818d276cSGirish Shilamkar 					crc32_sum =
685818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
686818d276cSGirish Shilamkar 				}
687818d276cSGirish Shilamkar 
688470decc6SDave Kleikamp 				lock_buffer(bh);
689470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
690470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
691470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
6927058548cSTheodore Ts'o 				submit_bh(write_op, bh);
693470decc6SDave Kleikamp 			}
694470decc6SDave Kleikamp 			cond_resched();
695bf699327STheodore Ts'o 			stats.run.rs_blocks_logged += bufs;
696470decc6SDave Kleikamp 
697470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
698470decc6SDave Kleikamp                            time round the loop. */
699470decc6SDave Kleikamp 			descriptor = NULL;
700470decc6SDave Kleikamp 			bufs = 0;
701470decc6SDave Kleikamp 		}
702470decc6SDave Kleikamp 	}
703470decc6SDave Kleikamp 
704cc3e1beaSTheodore Ts'o 	/*
705cc3e1beaSTheodore Ts'o 	 * If the journal is not located on the file system device,
706cc3e1beaSTheodore Ts'o 	 * then we must flush the file system device before we issue
707cc3e1beaSTheodore Ts'o 	 * the commit record
708cc3e1beaSTheodore Ts'o 	 */
709cc3e1beaSTheodore Ts'o 	if (commit_transaction->t_flushed_data_blocks &&
710cc3e1beaSTheodore Ts'o 	    (journal->j_fs_dev != journal->j_dev) &&
711cc3e1beaSTheodore Ts'o 	    (journal->j_flags & JBD2_BARRIER))
712fbd9b09aSDmitry Monakhov 		blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL,
713fbd9b09aSDmitry Monakhov 			BLKDEV_IFL_WAIT);
714818d276cSGirish Shilamkar 
715cc3e1beaSTheodore Ts'o 	/* Done it all: now write the commit record asynchronously. */
716818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
717818d276cSGirish Shilamkar 				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
718818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
719818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
720818d276cSGirish Shilamkar 		if (err)
721818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
7220e3d2a63STheodore Ts'o 		if (journal->j_flags & JBD2_BARRIER)
723fbd9b09aSDmitry Monakhov 			blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL,
724fbd9b09aSDmitry Monakhov 				BLKDEV_IFL_WAIT);
725818d276cSGirish Shilamkar 	}
726818d276cSGirish Shilamkar 
727c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
728e9e34f4eSHidehiro Kawai 	if (err) {
729e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
730e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
73105496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
7325bf5683aSHidehiro Kawai 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
7335bf5683aSHidehiro Kawai 			jbd2_journal_abort(journal, err);
734e9e34f4eSHidehiro Kawai 		err = 0;
735e9e34f4eSHidehiro Kawai 	}
736c851ed54SJan Kara 
737470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
738470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
739470decc6SDave Kleikamp            complete.  Control buffers being written are on the
740470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
741470decc6SDave Kleikamp            the t_iobuf_list queue.
742470decc6SDave Kleikamp 
743470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
744470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
745470decc6SDave Kleikamp 	   so we incur less scheduling load.
746470decc6SDave Kleikamp 	*/
747470decc6SDave Kleikamp 
74887c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
749470decc6SDave Kleikamp 
750470decc6SDave Kleikamp 	/*
751470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
752470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
753470decc6SDave Kleikamp 	 */
754470decc6SDave Kleikamp wait_for_iobuf:
755470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
756470decc6SDave Kleikamp 		struct buffer_head *bh;
757470decc6SDave Kleikamp 
758470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
759470decc6SDave Kleikamp 		bh = jh2bh(jh);
760470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
761470decc6SDave Kleikamp 			wait_on_buffer(bh);
762470decc6SDave Kleikamp 			goto wait_for_iobuf;
763470decc6SDave Kleikamp 		}
764470decc6SDave Kleikamp 		if (cond_resched())
765470decc6SDave Kleikamp 			goto wait_for_iobuf;
766470decc6SDave Kleikamp 
767470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
768470decc6SDave Kleikamp 			err = -EIO;
769470decc6SDave Kleikamp 
770470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
771470decc6SDave Kleikamp 
772470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
773f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
774470decc6SDave Kleikamp 
775470decc6SDave Kleikamp 		/*
776470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
777f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
778470decc6SDave Kleikamp 		 */
779470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
780f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
781470decc6SDave Kleikamp 		__brelse(bh);
782470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
783470decc6SDave Kleikamp 		free_buffer_head(bh);
784470decc6SDave Kleikamp 
785470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
786470decc6SDave Kleikamp                    shadowed buffer */
787470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
788470decc6SDave Kleikamp 		bh = jh2bh(jh);
789470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
790470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
791470decc6SDave Kleikamp 
792470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
793470decc6SDave Kleikamp                    to remember it against this transaction so that when
794470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
795470decc6SDave Kleikamp                    required. */
796470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
797f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
798470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
799470decc6SDave Kleikamp 		   IO to complete */
800470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
801470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
802470decc6SDave Kleikamp 		__brelse(bh);
803470decc6SDave Kleikamp 	}
804470decc6SDave Kleikamp 
805470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
806470decc6SDave Kleikamp 
80787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
808470decc6SDave Kleikamp 
809470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
810470decc6SDave Kleikamp  wait_for_ctlbuf:
811470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
812470decc6SDave Kleikamp 		struct buffer_head *bh;
813470decc6SDave Kleikamp 
814470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
815470decc6SDave Kleikamp 		bh = jh2bh(jh);
816470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
817470decc6SDave Kleikamp 			wait_on_buffer(bh);
818470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
819470decc6SDave Kleikamp 		}
820470decc6SDave Kleikamp 		if (cond_resched())
821470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
822470decc6SDave Kleikamp 
823470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
824470decc6SDave Kleikamp 			err = -EIO;
825470decc6SDave Kleikamp 
826470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
827470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
828f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
829f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
830470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
831470decc6SDave Kleikamp 		/* AKPM: bforget here */
832470decc6SDave Kleikamp 	}
833470decc6SDave Kleikamp 
83477e841deSHidehiro Kawai 	if (err)
83577e841deSHidehiro Kawai 		jbd2_journal_abort(journal, err);
83677e841deSHidehiro Kawai 
83787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
838470decc6SDave Kleikamp 
839818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
840818d276cSGirish Shilamkar 				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
841818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
842818d276cSGirish Shilamkar 						&cbh, crc32_sum);
843818d276cSGirish Shilamkar 		if (err)
844818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
845818d276cSGirish Shilamkar 	}
846b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
847fd98496fSTheodore Ts'o 		err = journal_wait_on_commit_record(journal, cbh);
848470decc6SDave Kleikamp 
849470decc6SDave Kleikamp 	if (err)
850a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
851470decc6SDave Kleikamp 
852470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
853470decc6SDave Kleikamp            processing: any buffers committed as a result of this
854470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
855470decc6SDave Kleikamp            before. */
856470decc6SDave Kleikamp 
85787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
858470decc6SDave Kleikamp 
859c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
860470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
861470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
862470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
863470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
864470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
865470decc6SDave Kleikamp 
866470decc6SDave Kleikamp restart_loop:
867470decc6SDave Kleikamp 	/*
868470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
869470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
870470decc6SDave Kleikamp 	 */
871470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
872470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
873470decc6SDave Kleikamp 		transaction_t *cp_transaction;
874470decc6SDave Kleikamp 		struct buffer_head *bh;
875470decc6SDave Kleikamp 
876470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
877470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
878470decc6SDave Kleikamp 		bh = jh2bh(jh);
879470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
88023e2af35Sdingdinghua 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
881470decc6SDave Kleikamp 
882470decc6SDave Kleikamp 		/*
883470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
884470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
885470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
886470decc6SDave Kleikamp 		 * field now points to a committed version of the
887470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
888470decc6SDave Kleikamp 		 * data.
889470decc6SDave Kleikamp 		 *
890470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
891e06c8227SJoel Becker 		 *
892e06c8227SJoel Becker 		 * We also know that the frozen data has already fired
893e06c8227SJoel Becker 		 * its triggers if they exist, so we can clear that too.
894470decc6SDave Kleikamp 		 */
895470decc6SDave Kleikamp 		if (jh->b_committed_data) {
896af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
897470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
898470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
899470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
900470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
901e06c8227SJoel Becker 				jh->b_frozen_triggers = NULL;
902470decc6SDave Kleikamp 			}
903470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
904af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
905470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
906e06c8227SJoel Becker 			jh->b_frozen_triggers = NULL;
907470decc6SDave Kleikamp 		}
908470decc6SDave Kleikamp 
909470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
910470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
911470decc6SDave Kleikamp 		if (cp_transaction) {
912470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
9138e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
914f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
915470decc6SDave Kleikamp 		}
916470decc6SDave Kleikamp 
917470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
918470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
919f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
920470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
921470decc6SDave Kleikamp 		 * it. */
922470decc6SDave Kleikamp 
923470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
924470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
925470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
926ba869023Sdingdinghua 		 * that buffer in the future after the "add to orphan"
927ba869023Sdingdinghua 		 * operation been committed,  That's not only a performance
928ba869023Sdingdinghua 		 * gain, it also stops aliasing problems if the buffer is
929ba869023Sdingdinghua 		 * left behind for writeback and gets reallocated for another
930470decc6SDave Kleikamp 		 * use in a different page. */
931ba869023Sdingdinghua 		if (buffer_freed(bh) && !jh->b_next_transaction) {
932470decc6SDave Kleikamp 			clear_buffer_freed(bh);
933470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
934470decc6SDave Kleikamp 		}
935470decc6SDave Kleikamp 
936470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
937470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
938f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
9397ad7445fSHidehiro Kawai 			if (is_journal_aborted(journal))
9407ad7445fSHidehiro Kawai 				clear_buffer_jbddirty(bh);
941470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
942f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
943470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
944470decc6SDave Kleikamp 		} else {
945470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
946470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
947470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
948470decc6SDave Kleikamp 			 * could not have been reallocated until this
949470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
950470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
951470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
952470decc6SDave Kleikamp 			 * list. */
953470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
954f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
955470decc6SDave Kleikamp 			if (!jh->b_transaction) {
956470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
957470decc6SDave Kleikamp 				 /* needs a brelse */
958f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
959470decc6SDave Kleikamp 				release_buffer_page(bh);
960470decc6SDave Kleikamp 			} else
961470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
962470decc6SDave Kleikamp 		}
963470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
964470decc6SDave Kleikamp 	}
965470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
966470decc6SDave Kleikamp 	/*
967f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
968f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
969f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
970f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
971470decc6SDave Kleikamp 	 */
972a931da6aSTheodore Ts'o 	write_lock(&journal->j_state_lock);
973470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
974470decc6SDave Kleikamp 	/*
975470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
976470decc6SDave Kleikamp 	 * while the lock was dropped...
977470decc6SDave Kleikamp 	 */
978470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
979470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
980a931da6aSTheodore Ts'o 		write_unlock(&journal->j_state_lock);
981470decc6SDave Kleikamp 		goto restart_loop;
982470decc6SDave Kleikamp 	}
983470decc6SDave Kleikamp 
984470decc6SDave Kleikamp 	/* Done with this transaction! */
985470decc6SDave Kleikamp 
98687c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
987470decc6SDave Kleikamp 
988470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
989470decc6SDave Kleikamp 
9908e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
991bf699327STheodore Ts'o 	stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
9928e85fb3fSJohann Lombardi 					      commit_transaction->t_start);
9938e85fb3fSJohann Lombardi 
9948e85fb3fSJohann Lombardi 	/*
995bf699327STheodore Ts'o 	 * File the transaction statistics
9968e85fb3fSJohann Lombardi 	 */
9978e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9988dd42046STheodore Ts'o 	stats.run.rs_handle_count =
9998dd42046STheodore Ts'o 		atomic_read(&commit_transaction->t_handle_count);
1000bf699327STheodore Ts'o 	trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
1001bf699327STheodore Ts'o 			     commit_transaction->t_tid, &stats.run);
10028e85fb3fSJohann Lombardi 
10038e85fb3fSJohann Lombardi 	/*
10048e85fb3fSJohann Lombardi 	 * Calculate overall stats
10058e85fb3fSJohann Lombardi 	 */
1006bf699327STheodore Ts'o 	spin_lock(&journal->j_history_lock);
10078e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
1008bf699327STheodore Ts'o 	journal->j_stats.run.rs_wait += stats.run.rs_wait;
1009bf699327STheodore Ts'o 	journal->j_stats.run.rs_running += stats.run.rs_running;
1010bf699327STheodore Ts'o 	journal->j_stats.run.rs_locked += stats.run.rs_locked;
1011bf699327STheodore Ts'o 	journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
1012bf699327STheodore Ts'o 	journal->j_stats.run.rs_logging += stats.run.rs_logging;
1013bf699327STheodore Ts'o 	journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
1014bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
1015bf699327STheodore Ts'o 	journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
10168e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
10178e85fb3fSJohann Lombardi 
1018470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
1019470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
1020470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
1021470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
1022e07f7183SJosef Bacik 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
1023470decc6SDave Kleikamp 
1024e07f7183SJosef Bacik 	/*
1025e07f7183SJosef Bacik 	 * weight the commit time higher than the average time so we don't
1026e07f7183SJosef Bacik 	 * react too strongly to vast changes in the commit time
1027e07f7183SJosef Bacik 	 */
1028e07f7183SJosef Bacik 	if (likely(journal->j_average_commit_time))
1029e07f7183SJosef Bacik 		journal->j_average_commit_time = (commit_time +
1030e07f7183SJosef Bacik 				journal->j_average_commit_time*3) / 4;
1031e07f7183SJosef Bacik 	else
1032e07f7183SJosef Bacik 		journal->j_average_commit_time = commit_time;
1033a931da6aSTheodore Ts'o 	write_unlock(&journal->j_state_lock);
10346c20ec85STheodore Ts'o 
1035f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1036f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1037f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1038fb68407bSAneesh Kumar K.V 		to_free = 1;
1039470decc6SDave Kleikamp 	} else {
1040470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1041470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1042470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1043470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1044470decc6SDave Kleikamp 		} else {
1045470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1046470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1047470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1048470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1049470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1050470decc6SDave Kleikamp 				commit_transaction;
1051470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1052470decc6SDave Kleikamp 				commit_transaction;
1053470decc6SDave Kleikamp 		}
1054470decc6SDave Kleikamp 	}
1055470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1056470decc6SDave Kleikamp 
1057fb68407bSAneesh Kumar K.V 	if (journal->j_commit_callback)
1058fb68407bSAneesh Kumar K.V 		journal->j_commit_callback(journal, commit_transaction);
1059fb68407bSAneesh Kumar K.V 
1060879c5e6bSTheodore Ts'o 	trace_jbd2_end_commit(journal, commit_transaction);
1061470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1062470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1063fb68407bSAneesh Kumar K.V 	if (to_free)
1064fb68407bSAneesh Kumar K.V 		kfree(commit_transaction);
1065470decc6SDave Kleikamp 
1066470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1067470decc6SDave Kleikamp }
1068