xref: /linux-6.15/fs/jbd2/commit.c (revision 7058548c)
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>
19ede86cc4STheodore Ts'o #include <linux/marker.h>
20470decc6SDave Kleikamp #include <linux/errno.h>
21470decc6SDave Kleikamp #include <linux/slab.h>
22470decc6SDave Kleikamp #include <linux/mm.h>
23470decc6SDave Kleikamp #include <linux/pagemap.h>
248e85fb3fSJohann Lombardi #include <linux/jiffies.h>
25818d276cSGirish Shilamkar #include <linux/crc32.h>
26cd1aac32SAneesh Kumar K.V #include <linux/writeback.h>
27cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h>
28fd98496fSTheodore Ts'o #include <linux/bio.h>
29470decc6SDave Kleikamp 
30470decc6SDave Kleikamp /*
31470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
32470decc6SDave Kleikamp  */
33470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
34470decc6SDave Kleikamp {
35470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
36470decc6SDave Kleikamp 	if (uptodate)
37470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
38470decc6SDave Kleikamp 	else
39470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
40470decc6SDave Kleikamp 	unlock_buffer(bh);
41470decc6SDave Kleikamp }
42470decc6SDave Kleikamp 
43470decc6SDave Kleikamp /*
4487c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4587c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
46470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
47470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
48470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
49470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
50470decc6SDave Kleikamp  *
51470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
52470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
53470decc6SDave Kleikamp  *
54470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
55470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
56470decc6SDave Kleikamp  */
57470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
58470decc6SDave Kleikamp {
59470decc6SDave Kleikamp 	struct page *page;
60470decc6SDave Kleikamp 
61470decc6SDave Kleikamp 	if (buffer_dirty(bh))
62470decc6SDave Kleikamp 		goto nope;
63470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
64470decc6SDave Kleikamp 		goto nope;
65470decc6SDave Kleikamp 	page = bh->b_page;
66470decc6SDave Kleikamp 	if (!page)
67470decc6SDave Kleikamp 		goto nope;
68470decc6SDave Kleikamp 	if (page->mapping)
69470decc6SDave Kleikamp 		goto nope;
70470decc6SDave Kleikamp 
71470decc6SDave Kleikamp 	/* OK, it's a truncated page */
72529ae9aaSNick Piggin 	if (!trylock_page(page))
73470decc6SDave Kleikamp 		goto nope;
74470decc6SDave Kleikamp 
75470decc6SDave Kleikamp 	page_cache_get(page);
76470decc6SDave Kleikamp 	__brelse(bh);
77470decc6SDave Kleikamp 	try_to_free_buffers(page);
78470decc6SDave Kleikamp 	unlock_page(page);
79470decc6SDave Kleikamp 	page_cache_release(page);
80470decc6SDave Kleikamp 	return;
81470decc6SDave Kleikamp 
82470decc6SDave Kleikamp nope:
83470decc6SDave Kleikamp 	__brelse(bh);
84470decc6SDave Kleikamp }
85470decc6SDave Kleikamp 
86470decc6SDave Kleikamp /*
87818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
88470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
89470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
90470decc6SDave Kleikamp  * entirely.
91470decc6SDave Kleikamp  *
92470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
93470decc6SDave Kleikamp  */
94818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
95818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
96818d276cSGirish Shilamkar 					struct buffer_head **cbh,
97818d276cSGirish Shilamkar 					__u32 crc32_sum)
98470decc6SDave Kleikamp {
99470decc6SDave Kleikamp 	struct journal_head *descriptor;
100818d276cSGirish Shilamkar 	struct commit_header *tmp;
101470decc6SDave Kleikamp 	struct buffer_head *bh;
102818d276cSGirish Shilamkar 	int ret;
103470decc6SDave Kleikamp 	int barrier_done = 0;
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)) {
138470decc6SDave Kleikamp 		set_buffer_ordered(bh);
139470decc6SDave Kleikamp 		barrier_done = 1;
140470decc6SDave Kleikamp 	}
14140a1984dSTheodore Ts'o 	ret = submit_bh(WRITE_SYNC, bh);
142c4e35e07SDave Kleikamp 	if (barrier_done)
143c4e35e07SDave Kleikamp 		clear_buffer_ordered(bh);
144818d276cSGirish Shilamkar 
145470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
146470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
147470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
148470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
149470decc6SDave Kleikamp 	 */
150470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
151470decc6SDave Kleikamp 		printk(KERN_WARNING
152470decc6SDave Kleikamp 		       "JBD: barrier-based sync failed on %s - "
15305496769STheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
154470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
155f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
156470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
157470decc6SDave Kleikamp 
158470decc6SDave Kleikamp 		/* And try again, without the barrier */
159034772b0STheodore Ts'o 		lock_buffer(bh);
160470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
16145a90bfdSTheodore Ts'o 		clear_buffer_dirty(bh);
16240a1984dSTheodore Ts'o 		ret = submit_bh(WRITE_SYNC, bh);
163470decc6SDave Kleikamp 	}
164818d276cSGirish Shilamkar 	*cbh = bh;
165818d276cSGirish Shilamkar 	return ret;
166818d276cSGirish Shilamkar }
167470decc6SDave Kleikamp 
168818d276cSGirish Shilamkar /*
169818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
170818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
171818d276cSGirish Shilamkar  */
172fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal,
173fd98496fSTheodore Ts'o 					 struct buffer_head *bh)
174818d276cSGirish Shilamkar {
175818d276cSGirish Shilamkar 	int ret = 0;
176818d276cSGirish Shilamkar 
177fd98496fSTheodore Ts'o retry:
178818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
179818d276cSGirish Shilamkar 	wait_on_buffer(bh);
180fd98496fSTheodore Ts'o 	if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
181fd98496fSTheodore Ts'o 		printk(KERN_WARNING
182fd98496fSTheodore Ts'o 		       "JBD2: wait_on_commit_record: sync failed on %s - "
183fd98496fSTheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
184fd98496fSTheodore Ts'o 		spin_lock(&journal->j_state_lock);
185fd98496fSTheodore Ts'o 		journal->j_flags &= ~JBD2_BARRIER;
186fd98496fSTheodore Ts'o 		spin_unlock(&journal->j_state_lock);
187fd98496fSTheodore Ts'o 
188fd98496fSTheodore Ts'o 		lock_buffer(bh);
189fd98496fSTheodore Ts'o 		clear_buffer_dirty(bh);
190fd98496fSTheodore Ts'o 		set_buffer_uptodate(bh);
191fd98496fSTheodore Ts'o 		bh->b_end_io = journal_end_buffer_io_sync;
192fd98496fSTheodore Ts'o 
193fd98496fSTheodore Ts'o 		ret = submit_bh(WRITE_SYNC, bh);
194fd98496fSTheodore Ts'o 		if (ret) {
195fd98496fSTheodore Ts'o 			unlock_buffer(bh);
196fd98496fSTheodore Ts'o 			return ret;
197fd98496fSTheodore Ts'o 		}
198fd98496fSTheodore Ts'o 		goto retry;
199fd98496fSTheodore Ts'o 	}
200818d276cSGirish Shilamkar 
201818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
202818d276cSGirish Shilamkar 		ret = -EIO;
203818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
204818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
205818d276cSGirish Shilamkar 
206818d276cSGirish Shilamkar 	return ret;
207818d276cSGirish Shilamkar }
208818d276cSGirish Shilamkar 
209818d276cSGirish Shilamkar /*
210cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
211cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
212cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
213cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
214cd1aac32SAneesh Kumar K.V  */
215cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
216cd1aac32SAneesh Kumar K.V {
217cd1aac32SAneesh Kumar K.V 	int ret;
218cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
219cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
220cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
221cd1aac32SAneesh Kumar K.V 		.range_start = 0,
222cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
223cd1aac32SAneesh Kumar K.V 		.for_writepages = 1,
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 		 */
256cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
257c851ed54SJan Kara 		if (!ret)
258c851ed54SJan Kara 			ret = err;
259c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
260c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
261c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
262c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
263c851ed54SJan Kara 	}
264c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
265c851ed54SJan Kara 	return ret;
266c851ed54SJan Kara }
267c851ed54SJan Kara 
268c851ed54SJan Kara /*
269c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
270c851ed54SJan Kara  * transaction if needed.
271c851ed54SJan Kara  *
272c851ed54SJan Kara  */
273c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
274c851ed54SJan Kara 		transaction_t *commit_transaction)
275c851ed54SJan Kara {
276c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
277c851ed54SJan Kara 	int err, ret = 0;
278c851ed54SJan Kara 
279cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
280c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
281c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
282c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
283c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
284c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
285e9e34f4eSHidehiro Kawai 		if (err) {
286e9e34f4eSHidehiro Kawai 			/*
287e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
288e9e34f4eSHidehiro Kawai 			 * wait_on_page_writeback_range(), set it again so
289e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
290e9e34f4eSHidehiro Kawai 			 */
291e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
292e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
293e9e34f4eSHidehiro Kawai 
294c851ed54SJan Kara 			if (!ret)
295c851ed54SJan Kara 				ret = err;
296e9e34f4eSHidehiro Kawai 		}
297c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
298c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
299c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
300c851ed54SJan Kara 	}
301c851ed54SJan Kara 
302c851ed54SJan Kara 	/* Now refile inode to proper lists */
303c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
304c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
305c851ed54SJan Kara 		list_del(&jinode->i_list);
306c851ed54SJan Kara 		if (jinode->i_next_transaction) {
307c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
308c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
309c851ed54SJan Kara 			list_add(&jinode->i_list,
310c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
311c851ed54SJan Kara 		} else {
312c851ed54SJan Kara 			jinode->i_transaction = NULL;
313c851ed54SJan Kara 		}
314c851ed54SJan Kara 	}
315c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
316c851ed54SJan Kara 
317c851ed54SJan Kara 	return ret;
318c851ed54SJan Kara }
319c851ed54SJan Kara 
320818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
321818d276cSGirish Shilamkar {
322818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
323818d276cSGirish Shilamkar 	char *addr;
324818d276cSGirish Shilamkar 	__u32 checksum;
325818d276cSGirish Shilamkar 
326818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
327818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
328818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
329818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
330818d276cSGirish Shilamkar 
331818d276cSGirish Shilamkar 	return checksum;
332818d276cSGirish Shilamkar }
333818d276cSGirish Shilamkar 
334818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
33518eba7aaSMingming Cao 				   unsigned long long block)
336b517bea1SZach Brown {
337b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
338cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
339b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
340b517bea1SZach Brown }
341b517bea1SZach Brown 
342470decc6SDave Kleikamp /*
343f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
344470decc6SDave Kleikamp  *
345470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
346470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
347470decc6SDave Kleikamp  */
348f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
349470decc6SDave Kleikamp {
3508e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
351470decc6SDave Kleikamp 	transaction_t *commit_transaction;
352470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
353470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
354470decc6SDave Kleikamp 	int bufs;
355470decc6SDave Kleikamp 	int flags;
356470decc6SDave Kleikamp 	int err;
35718eba7aaSMingming Cao 	unsigned long long blocknr;
358e07f7183SJosef Bacik 	ktime_t start_time;
359e07f7183SJosef Bacik 	u64 commit_time;
360470decc6SDave Kleikamp 	char *tagp = NULL;
361470decc6SDave Kleikamp 	journal_header_t *header;
362470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
363470decc6SDave Kleikamp 	int space_left = 0;
364470decc6SDave Kleikamp 	int first_tag = 0;
365470decc6SDave Kleikamp 	int tag_flag;
366fb68407bSAneesh Kumar K.V 	int i, to_free = 0;
367b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
368818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
369818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
370*7058548cSTheodore Ts'o 	int write_op = WRITE;
371470decc6SDave Kleikamp 
372470decc6SDave Kleikamp 	/*
373470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
374470decc6SDave Kleikamp 	 * all outstanding updates to complete.
375470decc6SDave Kleikamp 	 */
376470decc6SDave Kleikamp 
377470decc6SDave Kleikamp #ifdef COMMIT_STATS
378470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
379470decc6SDave Kleikamp 	summarise_journal_usage(journal);
380470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
381470decc6SDave Kleikamp #endif
382470decc6SDave Kleikamp 
383f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
384f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
385470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
386f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
387470decc6SDave Kleikamp 	} else {
388470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
389470decc6SDave Kleikamp 	}
390470decc6SDave Kleikamp 
391470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
392470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
393470decc6SDave Kleikamp 
394470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
395470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
396470decc6SDave Kleikamp 
397ede86cc4STheodore Ts'o 	trace_mark(jbd2_start_commit, "dev %s transaction %d",
398ede86cc4STheodore Ts'o 		   journal->j_devname, commit_transaction->t_tid);
399470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
400470decc6SDave Kleikamp 			commit_transaction->t_tid);
401470decc6SDave Kleikamp 
402470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
403470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
404470decc6SDave Kleikamp 
405*7058548cSTheodore Ts'o 	if (commit_transaction->t_synchronous_commit)
406*7058548cSTheodore Ts'o 		write_op = WRITE_SYNC;
4078e85fb3fSJohann Lombardi 	stats.u.run.rs_wait = commit_transaction->t_max_wait;
4088e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jiffies;
4098e85fb3fSJohann Lombardi 	stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
4108e85fb3fSJohann Lombardi 						stats.u.run.rs_locked);
4118e85fb3fSJohann Lombardi 
412470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
413470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
414470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
415470decc6SDave Kleikamp 
416470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
417470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
418470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
419470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
420470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
421470decc6SDave Kleikamp 			schedule();
422470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
423470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
424470decc6SDave Kleikamp 		}
425470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
426470decc6SDave Kleikamp 	}
427470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
428470decc6SDave Kleikamp 
429470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
430470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
431470decc6SDave Kleikamp 
432470decc6SDave Kleikamp 	/*
433470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
434470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
435470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
436470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
437f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
438470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
439470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
440470decc6SDave Kleikamp 	 *
441470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
442470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
443470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
444470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
445f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
446470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
447470decc6SDave Kleikamp 	 */
448470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
449470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
450470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
451470decc6SDave Kleikamp 		/*
452f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
453470decc6SDave Kleikamp 		 * leave undo-committed data.
454470decc6SDave Kleikamp 		 */
455470decc6SDave Kleikamp 		if (jh->b_committed_data) {
456470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
457470decc6SDave Kleikamp 
458470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
459af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
460470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
461470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
462470decc6SDave Kleikamp 		}
463f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
464470decc6SDave Kleikamp 	}
465470decc6SDave Kleikamp 
466470decc6SDave Kleikamp 	/*
467470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
468470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
469470decc6SDave Kleikamp 	 * frees some memory
470470decc6SDave Kleikamp 	 */
471470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
472f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
473470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
474470decc6SDave Kleikamp 
475470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
476470decc6SDave Kleikamp 
477470decc6SDave Kleikamp 	/*
478470decc6SDave Kleikamp 	 * Switch to a new revoke table.
479470decc6SDave Kleikamp 	 */
480f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
481470decc6SDave Kleikamp 
4828e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jiffies;
4838e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
4848e85fb3fSJohann Lombardi 					       stats.u.run.rs_flushing);
4858e85fb3fSJohann Lombardi 
486470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
487470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
488470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
489e07f7183SJosef Bacik 	start_time = ktime_get();
490470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
491470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
492470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
493470decc6SDave Kleikamp 
494470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
495470decc6SDave Kleikamp 
496470decc6SDave Kleikamp 	/*
497470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
498470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
499470decc6SDave Kleikamp 	 */
500cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
501c851ed54SJan Kara 	if (err)
502c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
503470decc6SDave Kleikamp 
504f7f4bccbSMingming Cao 	jbd2_journal_write_revoke_records(journal, commit_transaction);
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 	 */
51302c471cbSMingming Cao 	spin_lock(&journal->j_state_lock);
514470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
51502c471cbSMingming Cao 	spin_unlock(&journal->j_state_lock);
516470decc6SDave Kleikamp 
5178e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jiffies;
5188e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
5198e85fb3fSJohann Lombardi 						 stats.u.run.rs_logging);
5208e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
5218e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks_logged = 0;
5228e85fb3fSJohann Lombardi 
5231dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
5241dfc3220SJosef Bacik 		 commit_transaction->t_outstanding_credits);
5251dfc3220SJosef Bacik 
52687c89c23SJan Kara 	err = 0;
527470decc6SDave Kleikamp 	descriptor = NULL;
528470decc6SDave Kleikamp 	bufs = 0;
529470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
530470decc6SDave Kleikamp 
531470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
532470decc6SDave Kleikamp 
533470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
534470decc6SDave Kleikamp 
535470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
5367ad7445fSHidehiro Kawai 		   release it. */
537470decc6SDave Kleikamp 
538470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
5397ad7445fSHidehiro Kawai 			clear_buffer_jbddirty(jh2bh(jh));
540470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
541e06c8227SJoel Becker 			jbd2_buffer_abort_trigger(jh,
542e06c8227SJoel Becker 						  jh->b_frozen_data ?
543e06c8227SJoel Becker 						  jh->b_frozen_triggers :
544e06c8227SJoel Becker 						  jh->b_triggers);
545f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
546470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
547470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
548470decc6SDave Kleikamp 			 * already allocated, even if we are now
549470decc6SDave Kleikamp 			 * aborting. */
550470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
551470decc6SDave Kleikamp 				goto start_journal_io;
552470decc6SDave Kleikamp 			continue;
553470decc6SDave Kleikamp 		}
554470decc6SDave Kleikamp 
555470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
556470decc6SDave Kleikamp 		   record the metadata buffer. */
557470decc6SDave Kleikamp 
558470decc6SDave Kleikamp 		if (!descriptor) {
559470decc6SDave Kleikamp 			struct buffer_head *bh;
560470decc6SDave Kleikamp 
561470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
562470decc6SDave Kleikamp 
563470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
564470decc6SDave Kleikamp 
565f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
566470decc6SDave Kleikamp 			if (!descriptor) {
567a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
568470decc6SDave Kleikamp 				continue;
569470decc6SDave Kleikamp 			}
570470decc6SDave Kleikamp 
571470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
572470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
573470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
574470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
575f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
576f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
577470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
578470decc6SDave Kleikamp 
579470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
580470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
581470decc6SDave Kleikamp 			first_tag = 1;
582470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
583470decc6SDave Kleikamp 			set_buffer_dirty(bh);
584470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
585470decc6SDave Kleikamp 
586470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
587470decc6SDave Kleikamp                            completion later */
588470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
589f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
590470decc6SDave Kleikamp 					BJ_LogCtl);
591470decc6SDave Kleikamp 		}
592470decc6SDave Kleikamp 
593470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
594470decc6SDave Kleikamp 
595f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
596470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
597470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
598470decc6SDave Kleikamp 		   refile-on-abort condition above. */
599470decc6SDave Kleikamp 		if (err) {
600a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
601470decc6SDave Kleikamp 			continue;
602470decc6SDave Kleikamp 		}
603470decc6SDave Kleikamp 
604470decc6SDave Kleikamp 		/*
605470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
606470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
607f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
608470decc6SDave Kleikamp 		 */
609470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
610470decc6SDave Kleikamp 
611470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
612470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
613470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
614470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
615470decc6SDave Kleikamp 
616470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
617470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
618470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
619470decc6SDave Kleikamp 
620470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
621470decc6SDave Kleikamp 		/*
622f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
623470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
624470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
625470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
626470decc6SDave Kleikamp 		 */
627470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
628f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
629470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
630470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
631470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
632470decc6SDave Kleikamp 
633470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
634470decc6SDave Kleikamp                    buffer */
635470decc6SDave Kleikamp 
636470decc6SDave Kleikamp 		tag_flag = 0;
637470decc6SDave Kleikamp 		if (flags & 1)
638f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
639470decc6SDave Kleikamp 		if (!first_tag)
640f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
641470decc6SDave Kleikamp 
642470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
643b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
644470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
645b517bea1SZach Brown 		tagp += tag_bytes;
646b517bea1SZach Brown 		space_left -= tag_bytes;
647470decc6SDave Kleikamp 
648470decc6SDave Kleikamp 		if (first_tag) {
649470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
650470decc6SDave Kleikamp 			tagp += 16;
651470decc6SDave Kleikamp 			space_left -= 16;
652470decc6SDave Kleikamp 			first_tag = 0;
653470decc6SDave Kleikamp 		}
654470decc6SDave Kleikamp 
655470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
656470decc6SDave Kleikamp 		   let the IO rip! */
657470decc6SDave Kleikamp 
658470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
659470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
660b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
661470decc6SDave Kleikamp 
662470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
663470decc6SDave Kleikamp 
664470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
665470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
666470decc6SDave Kleikamp                            the last tag we set up. */
667470decc6SDave Kleikamp 
668f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
669470decc6SDave Kleikamp 
670470decc6SDave Kleikamp start_journal_io:
671470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
672470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
673818d276cSGirish Shilamkar 				/*
674818d276cSGirish Shilamkar 				 * Compute checksum.
675818d276cSGirish Shilamkar 				 */
676818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
677818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
678818d276cSGirish Shilamkar 					crc32_sum =
679818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
680818d276cSGirish Shilamkar 				}
681818d276cSGirish Shilamkar 
682470decc6SDave Kleikamp 				lock_buffer(bh);
683470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
684470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
685470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
686*7058548cSTheodore Ts'o 				submit_bh(write_op, bh);
687470decc6SDave Kleikamp 			}
688470decc6SDave Kleikamp 			cond_resched();
6898e85fb3fSJohann Lombardi 			stats.u.run.rs_blocks_logged += bufs;
690470decc6SDave Kleikamp 
691470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
692470decc6SDave Kleikamp                            time round the loop. */
693470decc6SDave Kleikamp 			descriptor = NULL;
694470decc6SDave Kleikamp 			bufs = 0;
695470decc6SDave Kleikamp 		}
696470decc6SDave Kleikamp 	}
697470decc6SDave Kleikamp 
698818d276cSGirish Shilamkar 	/* Done it all: now write the commit record asynchronously. */
699818d276cSGirish Shilamkar 
700818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
701818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
702818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
703818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
704818d276cSGirish Shilamkar 		if (err)
705818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
706818d276cSGirish Shilamkar 	}
707818d276cSGirish Shilamkar 
708c851ed54SJan Kara 	/*
709c851ed54SJan Kara 	 * This is the right place to wait for data buffers both for ASYNC
710c851ed54SJan Kara 	 * and !ASYNC commit. If commit is ASYNC, we need to wait only after
711c851ed54SJan Kara 	 * the commit block went to disk (which happens above). If commit is
712c851ed54SJan Kara 	 * SYNC, we need to wait for data buffers before we start writing
713c851ed54SJan Kara 	 * commit block, which happens below in such setting.
714c851ed54SJan Kara 	 */
715c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
716e9e34f4eSHidehiro Kawai 	if (err) {
717e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
718e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
71905496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
7205bf5683aSHidehiro Kawai 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
7215bf5683aSHidehiro Kawai 			jbd2_journal_abort(journal, err);
722e9e34f4eSHidehiro Kawai 		err = 0;
723e9e34f4eSHidehiro Kawai 	}
724c851ed54SJan Kara 
725470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
726470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
727470decc6SDave Kleikamp            complete.  Control buffers being written are on the
728470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
729470decc6SDave Kleikamp            the t_iobuf_list queue.
730470decc6SDave Kleikamp 
731470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
732470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
733470decc6SDave Kleikamp 	   so we incur less scheduling load.
734470decc6SDave Kleikamp 	*/
735470decc6SDave Kleikamp 
73687c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
737470decc6SDave Kleikamp 
738470decc6SDave Kleikamp 	/*
739470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
740470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
741470decc6SDave Kleikamp 	 */
742470decc6SDave Kleikamp wait_for_iobuf:
743470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
744470decc6SDave Kleikamp 		struct buffer_head *bh;
745470decc6SDave Kleikamp 
746470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
747470decc6SDave Kleikamp 		bh = jh2bh(jh);
748470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
749470decc6SDave Kleikamp 			wait_on_buffer(bh);
750470decc6SDave Kleikamp 			goto wait_for_iobuf;
751470decc6SDave Kleikamp 		}
752470decc6SDave Kleikamp 		if (cond_resched())
753470decc6SDave Kleikamp 			goto wait_for_iobuf;
754470decc6SDave Kleikamp 
755470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
756470decc6SDave Kleikamp 			err = -EIO;
757470decc6SDave Kleikamp 
758470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
759470decc6SDave Kleikamp 
760470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
761f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
762470decc6SDave Kleikamp 
763470decc6SDave Kleikamp 		/*
764470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
765f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
766470decc6SDave Kleikamp 		 */
767470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
768f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
769470decc6SDave Kleikamp 		__brelse(bh);
770470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
771470decc6SDave Kleikamp 		free_buffer_head(bh);
772470decc6SDave Kleikamp 
773470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
774470decc6SDave Kleikamp                    shadowed buffer */
775470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
776470decc6SDave Kleikamp 		bh = jh2bh(jh);
777470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
778470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
779470decc6SDave Kleikamp 
780470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
781470decc6SDave Kleikamp                    to remember it against this transaction so that when
782470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
783470decc6SDave Kleikamp                    required. */
784470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
785f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
786470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
787470decc6SDave Kleikamp 		   IO to complete */
788470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
789470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
790470decc6SDave Kleikamp 		__brelse(bh);
791470decc6SDave Kleikamp 	}
792470decc6SDave Kleikamp 
793470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
794470decc6SDave Kleikamp 
79587c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
796470decc6SDave Kleikamp 
797470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
798470decc6SDave Kleikamp  wait_for_ctlbuf:
799470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
800470decc6SDave Kleikamp 		struct buffer_head *bh;
801470decc6SDave Kleikamp 
802470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
803470decc6SDave Kleikamp 		bh = jh2bh(jh);
804470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
805470decc6SDave Kleikamp 			wait_on_buffer(bh);
806470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
807470decc6SDave Kleikamp 		}
808470decc6SDave Kleikamp 		if (cond_resched())
809470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
810470decc6SDave Kleikamp 
811470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
812470decc6SDave Kleikamp 			err = -EIO;
813470decc6SDave Kleikamp 
814470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
815470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
816f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
817f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
818470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
819470decc6SDave Kleikamp 		/* AKPM: bforget here */
820470decc6SDave Kleikamp 	}
821470decc6SDave Kleikamp 
82277e841deSHidehiro Kawai 	if (err)
82377e841deSHidehiro Kawai 		jbd2_journal_abort(journal, err);
82477e841deSHidehiro Kawai 
82587c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
826470decc6SDave Kleikamp 
827818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
828818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
829818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
830818d276cSGirish Shilamkar 						&cbh, crc32_sum);
831818d276cSGirish Shilamkar 		if (err)
832818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
833818d276cSGirish Shilamkar 	}
834b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
835fd98496fSTheodore Ts'o 		err = journal_wait_on_commit_record(journal, cbh);
836470decc6SDave Kleikamp 
837470decc6SDave Kleikamp 	if (err)
838a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
839470decc6SDave Kleikamp 
840470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
841470decc6SDave Kleikamp            processing: any buffers committed as a result of this
842470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
843470decc6SDave Kleikamp            before. */
844470decc6SDave Kleikamp 
84587c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
846470decc6SDave Kleikamp 
847c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
848470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
849470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
850470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
851470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
852470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
853470decc6SDave Kleikamp 
854470decc6SDave Kleikamp restart_loop:
855470decc6SDave Kleikamp 	/*
856470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
857470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
858470decc6SDave Kleikamp 	 */
859470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
860470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
861470decc6SDave Kleikamp 		transaction_t *cp_transaction;
862470decc6SDave Kleikamp 		struct buffer_head *bh;
863470decc6SDave Kleikamp 
864470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
865470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
866470decc6SDave Kleikamp 		bh = jh2bh(jh);
867470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
868470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
869470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
870470decc6SDave Kleikamp 
871470decc6SDave Kleikamp 		/*
872470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
873470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
874470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
875470decc6SDave Kleikamp 		 * field now points to a committed version of the
876470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
877470decc6SDave Kleikamp 		 * data.
878470decc6SDave Kleikamp 		 *
879470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
880e06c8227SJoel Becker 		 *
881e06c8227SJoel Becker 		 * We also know that the frozen data has already fired
882e06c8227SJoel Becker 		 * its triggers if they exist, so we can clear that too.
883470decc6SDave Kleikamp 		 */
884470decc6SDave Kleikamp 		if (jh->b_committed_data) {
885af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
886470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
887470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
888470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
889470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
890e06c8227SJoel Becker 				jh->b_frozen_triggers = NULL;
891470decc6SDave Kleikamp 			}
892470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
893af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
894470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
895e06c8227SJoel Becker 			jh->b_frozen_triggers = NULL;
896470decc6SDave Kleikamp 		}
897470decc6SDave Kleikamp 
898470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
899470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
900470decc6SDave Kleikamp 		if (cp_transaction) {
901470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
9028e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
903f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
904470decc6SDave Kleikamp 		}
905470decc6SDave Kleikamp 
906470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
907470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
908f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
909470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
910470decc6SDave Kleikamp 		 * it. */
911470decc6SDave Kleikamp 
912470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
913470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
914470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
915470decc6SDave Kleikamp 		 * that buffer in the future now that the last use has
916470decc6SDave Kleikamp 		 * been committed.  That's not only a performance gain,
917470decc6SDave Kleikamp 		 * it also stops aliasing problems if the buffer is left
918470decc6SDave Kleikamp 		 * behind for writeback and gets reallocated for another
919470decc6SDave Kleikamp 		 * use in a different page. */
920470decc6SDave Kleikamp 		if (buffer_freed(bh)) {
921470decc6SDave Kleikamp 			clear_buffer_freed(bh);
922470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
923470decc6SDave Kleikamp 		}
924470decc6SDave Kleikamp 
925470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
926470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
927f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
9287ad7445fSHidehiro Kawai 			if (is_journal_aborted(journal))
9297ad7445fSHidehiro Kawai 				clear_buffer_jbddirty(bh);
930470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
931f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
932470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
933470decc6SDave Kleikamp 		} else {
934470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
935470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
936470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
937470decc6SDave Kleikamp 			 * could not have been reallocated until this
938470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
939470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
940470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
941470decc6SDave Kleikamp 			 * list. */
942470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
943f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
944470decc6SDave Kleikamp 			if (!jh->b_transaction) {
945470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
946470decc6SDave Kleikamp 				 /* needs a brelse */
947f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
948470decc6SDave Kleikamp 				release_buffer_page(bh);
949470decc6SDave Kleikamp 			} else
950470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
951470decc6SDave Kleikamp 		}
952470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
953470decc6SDave Kleikamp 	}
954470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
955470decc6SDave Kleikamp 	/*
956f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
957f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
958f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
959f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
960470decc6SDave Kleikamp 	 */
961470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
962470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
963470decc6SDave Kleikamp 	/*
964470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
965470decc6SDave Kleikamp 	 * while the lock was dropped...
966470decc6SDave Kleikamp 	 */
967470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
968470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
969470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
970470decc6SDave Kleikamp 		goto restart_loop;
971470decc6SDave Kleikamp 	}
972470decc6SDave Kleikamp 
973470decc6SDave Kleikamp 	/* Done with this transaction! */
974470decc6SDave Kleikamp 
97587c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
976470decc6SDave Kleikamp 
977470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
978470decc6SDave Kleikamp 
9798e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
9808e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
9818e85fb3fSJohann Lombardi 						commit_transaction->t_start);
9828e85fb3fSJohann Lombardi 
9838e85fb3fSJohann Lombardi 	/*
9848e85fb3fSJohann Lombardi 	 * File the transaction for history
9858e85fb3fSJohann Lombardi 	 */
9868e85fb3fSJohann Lombardi 	stats.ts_type = JBD2_STATS_RUN;
9878e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9888e85fb3fSJohann Lombardi 	stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
9898e85fb3fSJohann Lombardi 	spin_lock(&journal->j_history_lock);
9908e85fb3fSJohann Lombardi 	memcpy(journal->j_history + journal->j_history_cur, &stats,
9918e85fb3fSJohann Lombardi 			sizeof(stats));
9928e85fb3fSJohann Lombardi 	if (++journal->j_history_cur == journal->j_history_max)
9938e85fb3fSJohann Lombardi 		journal->j_history_cur = 0;
9948e85fb3fSJohann Lombardi 
9958e85fb3fSJohann Lombardi 	/*
9968e85fb3fSJohann Lombardi 	 * Calculate overall stats
9978e85fb3fSJohann Lombardi 	 */
9988e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
9998e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
10008e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
10018e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
10028e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
10038e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
10048e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
10058e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
10068e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
10078e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
10088e85fb3fSJohann Lombardi 
1009470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
1010470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
1011470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
1012470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
1013e07f7183SJosef Bacik 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
1014470decc6SDave Kleikamp 
1015e07f7183SJosef Bacik 	/*
1016e07f7183SJosef Bacik 	 * weight the commit time higher than the average time so we don't
1017e07f7183SJosef Bacik 	 * react too strongly to vast changes in the commit time
1018e07f7183SJosef Bacik 	 */
1019e07f7183SJosef Bacik 	if (likely(journal->j_average_commit_time))
1020e07f7183SJosef Bacik 		journal->j_average_commit_time = (commit_time +
1021e07f7183SJosef Bacik 				journal->j_average_commit_time*3) / 4;
1022e07f7183SJosef Bacik 	else
1023e07f7183SJosef Bacik 		journal->j_average_commit_time = commit_time;
1024470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
10256c20ec85STheodore Ts'o 
1026f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1027f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1028f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1029fb68407bSAneesh Kumar K.V 		to_free = 1;
1030470decc6SDave Kleikamp 	} else {
1031470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1032470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1033470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1034470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1035470decc6SDave Kleikamp 		} else {
1036470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1037470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1038470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1039470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1040470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1041470decc6SDave Kleikamp 				commit_transaction;
1042470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1043470decc6SDave Kleikamp 				commit_transaction;
1044470decc6SDave Kleikamp 		}
1045470decc6SDave Kleikamp 	}
1046470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1047470decc6SDave Kleikamp 
1048fb68407bSAneesh Kumar K.V 	if (journal->j_commit_callback)
1049fb68407bSAneesh Kumar K.V 		journal->j_commit_callback(journal, commit_transaction);
1050fb68407bSAneesh Kumar K.V 
1051ede86cc4STheodore Ts'o 	trace_mark(jbd2_end_commit, "dev %s transaction %d head %d",
1052fb68407bSAneesh Kumar K.V 		   journal->j_devname, commit_transaction->t_tid,
1053ede86cc4STheodore Ts'o 		   journal->j_tail_sequence);
1054470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1055470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1056fb68407bSAneesh Kumar K.V 	if (to_free)
1057fb68407bSAneesh Kumar K.V 		kfree(commit_transaction);
1058470decc6SDave Kleikamp 
1059470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1060470decc6SDave Kleikamp }
1061