xref: /linux-6.15/fs/jbd2/commit.c (revision 4d605179)
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>
25470decc6SDave Kleikamp 
26470decc6SDave Kleikamp /*
27470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
28470decc6SDave Kleikamp  */
29470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
30470decc6SDave Kleikamp {
31470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
32470decc6SDave Kleikamp 	if (uptodate)
33470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
34470decc6SDave Kleikamp 	else
35470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
36470decc6SDave Kleikamp 	unlock_buffer(bh);
37470decc6SDave Kleikamp }
38470decc6SDave Kleikamp 
39470decc6SDave Kleikamp /*
40470decc6SDave Kleikamp  * When an ext3-ordered file is truncated, it is possible that many pages are
41470decc6SDave Kleikamp  * not sucessfully freed, because they are attached to a committing transaction.
42470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
43470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
44470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
45470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
46470decc6SDave Kleikamp  *
47470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
48470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
49470decc6SDave Kleikamp  *
50470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
51470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
52470decc6SDave Kleikamp  */
53470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
54470decc6SDave Kleikamp {
55470decc6SDave Kleikamp 	struct page *page;
56470decc6SDave Kleikamp 
57470decc6SDave Kleikamp 	if (buffer_dirty(bh))
58470decc6SDave Kleikamp 		goto nope;
59470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
60470decc6SDave Kleikamp 		goto nope;
61470decc6SDave Kleikamp 	page = bh->b_page;
62470decc6SDave Kleikamp 	if (!page)
63470decc6SDave Kleikamp 		goto nope;
64470decc6SDave Kleikamp 	if (page->mapping)
65470decc6SDave Kleikamp 		goto nope;
66470decc6SDave Kleikamp 
67470decc6SDave Kleikamp 	/* OK, it's a truncated page */
68470decc6SDave Kleikamp 	if (TestSetPageLocked(page))
69470decc6SDave Kleikamp 		goto nope;
70470decc6SDave Kleikamp 
71470decc6SDave Kleikamp 	page_cache_get(page);
72470decc6SDave Kleikamp 	__brelse(bh);
73470decc6SDave Kleikamp 	try_to_free_buffers(page);
74470decc6SDave Kleikamp 	unlock_page(page);
75470decc6SDave Kleikamp 	page_cache_release(page);
76470decc6SDave Kleikamp 	return;
77470decc6SDave Kleikamp 
78470decc6SDave Kleikamp nope:
79470decc6SDave Kleikamp 	__brelse(bh);
80470decc6SDave Kleikamp }
81470decc6SDave Kleikamp 
82470decc6SDave Kleikamp /*
83470decc6SDave Kleikamp  * Try to acquire jbd_lock_bh_state() against the buffer, when j_list_lock is
84470decc6SDave Kleikamp  * held.  For ranking reasons we must trylock.  If we lose, schedule away and
85470decc6SDave Kleikamp  * return 0.  j_list_lock is dropped in this case.
86470decc6SDave Kleikamp  */
87470decc6SDave Kleikamp static int inverted_lock(journal_t *journal, struct buffer_head *bh)
88470decc6SDave Kleikamp {
89470decc6SDave Kleikamp 	if (!jbd_trylock_bh_state(bh)) {
90470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
91470decc6SDave Kleikamp 		schedule();
92470decc6SDave Kleikamp 		return 0;
93470decc6SDave Kleikamp 	}
94470decc6SDave Kleikamp 	return 1;
95470decc6SDave Kleikamp }
96470decc6SDave Kleikamp 
97818d276cSGirish Shilamkar /*
98818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
99470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
100470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
101470decc6SDave Kleikamp  * entirely.
102470decc6SDave Kleikamp  *
103470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
104470decc6SDave Kleikamp  */
105818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
106818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
107818d276cSGirish Shilamkar 					struct buffer_head **cbh,
108818d276cSGirish Shilamkar 					__u32 crc32_sum)
109470decc6SDave Kleikamp {
110470decc6SDave Kleikamp 	struct journal_head *descriptor;
111818d276cSGirish Shilamkar 	struct commit_header *tmp;
112470decc6SDave Kleikamp 	struct buffer_head *bh;
113818d276cSGirish Shilamkar 	int ret;
114470decc6SDave Kleikamp 	int barrier_done = 0;
115470decc6SDave Kleikamp 
116470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
117470decc6SDave Kleikamp 		return 0;
118470decc6SDave Kleikamp 
119f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
120470decc6SDave Kleikamp 	if (!descriptor)
121470decc6SDave Kleikamp 		return 1;
122470decc6SDave Kleikamp 
123470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
124470decc6SDave Kleikamp 
125818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
126f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
127f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
128470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
129818d276cSGirish Shilamkar 
130818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
131818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
132818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
133818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
134818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
135470decc6SDave Kleikamp 	}
136470decc6SDave Kleikamp 
137818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
138818d276cSGirish Shilamkar 	lock_buffer(bh);
139c4b8e635SAneesh Kumar K.V 	get_bh(bh);
140470decc6SDave Kleikamp 	set_buffer_dirty(bh);
141818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
142818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
143818d276cSGirish Shilamkar 
144818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
145*4d605179SAneesh Kumar K.V 		!JBD2_HAS_INCOMPAT_FEATURE(journal,
146818d276cSGirish Shilamkar 					 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
147470decc6SDave Kleikamp 		set_buffer_ordered(bh);
148470decc6SDave Kleikamp 		barrier_done = 1;
149470decc6SDave Kleikamp 	}
150818d276cSGirish Shilamkar 	ret = submit_bh(WRITE, bh);
151818d276cSGirish Shilamkar 
152470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
153470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
154470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
155470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
156470decc6SDave Kleikamp 	 */
157470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
158470decc6SDave Kleikamp 		char b[BDEVNAME_SIZE];
159470decc6SDave Kleikamp 
160470decc6SDave Kleikamp 		printk(KERN_WARNING
161470decc6SDave Kleikamp 			"JBD: barrier-based sync failed on %s - "
162470decc6SDave Kleikamp 			"disabling barriers\n",
163470decc6SDave Kleikamp 			bdevname(journal->j_dev, b));
164470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
165f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
166470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
167470decc6SDave Kleikamp 
168470decc6SDave Kleikamp 		/* And try again, without the barrier */
169470decc6SDave Kleikamp 		clear_buffer_ordered(bh);
170470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
171470decc6SDave Kleikamp 		set_buffer_dirty(bh);
172818d276cSGirish Shilamkar 		ret = submit_bh(WRITE, bh);
173470decc6SDave Kleikamp 	}
174818d276cSGirish Shilamkar 	*cbh = bh;
175818d276cSGirish Shilamkar 	return ret;
176818d276cSGirish Shilamkar }
177470decc6SDave Kleikamp 
178818d276cSGirish Shilamkar /*
179818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
180818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
181818d276cSGirish Shilamkar  */
182818d276cSGirish Shilamkar static int journal_wait_on_commit_record(struct buffer_head *bh)
183818d276cSGirish Shilamkar {
184818d276cSGirish Shilamkar 	int ret = 0;
185818d276cSGirish Shilamkar 
186818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
187818d276cSGirish Shilamkar 	wait_on_buffer(bh);
188818d276cSGirish Shilamkar 
189818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
190818d276cSGirish Shilamkar 		ret = -EIO;
191818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
192818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
193818d276cSGirish Shilamkar 
194818d276cSGirish Shilamkar 	return ret;
195818d276cSGirish Shilamkar }
196818d276cSGirish Shilamkar 
197818d276cSGirish Shilamkar /*
198818d276cSGirish Shilamkar  * Wait for all submitted IO to complete.
199818d276cSGirish Shilamkar  */
200818d276cSGirish Shilamkar static int journal_wait_on_locked_list(journal_t *journal,
201818d276cSGirish Shilamkar 				       transaction_t *commit_transaction)
202818d276cSGirish Shilamkar {
203818d276cSGirish Shilamkar 	int ret = 0;
204818d276cSGirish Shilamkar 	struct journal_head *jh;
205818d276cSGirish Shilamkar 
206818d276cSGirish Shilamkar 	while (commit_transaction->t_locked_list) {
207818d276cSGirish Shilamkar 		struct buffer_head *bh;
208818d276cSGirish Shilamkar 
209818d276cSGirish Shilamkar 		jh = commit_transaction->t_locked_list->b_tprev;
210818d276cSGirish Shilamkar 		bh = jh2bh(jh);
211818d276cSGirish Shilamkar 		get_bh(bh);
212818d276cSGirish Shilamkar 		if (buffer_locked(bh)) {
213818d276cSGirish Shilamkar 			spin_unlock(&journal->j_list_lock);
214818d276cSGirish Shilamkar 			wait_on_buffer(bh);
215818d276cSGirish Shilamkar 			if (unlikely(!buffer_uptodate(bh)))
216818d276cSGirish Shilamkar 				ret = -EIO;
217818d276cSGirish Shilamkar 			spin_lock(&journal->j_list_lock);
218818d276cSGirish Shilamkar 		}
219818d276cSGirish Shilamkar 		if (!inverted_lock(journal, bh)) {
220818d276cSGirish Shilamkar 			put_bh(bh);
221818d276cSGirish Shilamkar 			spin_lock(&journal->j_list_lock);
222818d276cSGirish Shilamkar 			continue;
223818d276cSGirish Shilamkar 		}
224818d276cSGirish Shilamkar 		if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) {
225818d276cSGirish Shilamkar 			__jbd2_journal_unfile_buffer(jh);
226818d276cSGirish Shilamkar 			jbd_unlock_bh_state(bh);
227818d276cSGirish Shilamkar 			jbd2_journal_remove_journal_head(bh);
228818d276cSGirish Shilamkar 			put_bh(bh);
229818d276cSGirish Shilamkar 		} else {
230818d276cSGirish Shilamkar 			jbd_unlock_bh_state(bh);
231818d276cSGirish Shilamkar 		}
232818d276cSGirish Shilamkar 		put_bh(bh);
233818d276cSGirish Shilamkar 		cond_resched_lock(&journal->j_list_lock);
234818d276cSGirish Shilamkar 	}
235818d276cSGirish Shilamkar 	return ret;
236470decc6SDave Kleikamp   }
237470decc6SDave Kleikamp 
238470decc6SDave Kleikamp static void journal_do_submit_data(struct buffer_head **wbuf, int bufs)
239470decc6SDave Kleikamp {
240470decc6SDave Kleikamp 	int i;
241470decc6SDave Kleikamp 
242470decc6SDave Kleikamp 	for (i = 0; i < bufs; i++) {
243470decc6SDave Kleikamp 		wbuf[i]->b_end_io = end_buffer_write_sync;
244470decc6SDave Kleikamp 		/* We use-up our safety reference in submit_bh() */
245470decc6SDave Kleikamp 		submit_bh(WRITE, wbuf[i]);
246470decc6SDave Kleikamp 	}
247470decc6SDave Kleikamp }
248470decc6SDave Kleikamp 
249470decc6SDave Kleikamp /*
250470decc6SDave Kleikamp  *  Submit all the data buffers to disk
251470decc6SDave Kleikamp  */
252470decc6SDave Kleikamp static void journal_submit_data_buffers(journal_t *journal,
253470decc6SDave Kleikamp 				transaction_t *commit_transaction)
254470decc6SDave Kleikamp {
255470decc6SDave Kleikamp 	struct journal_head *jh;
256470decc6SDave Kleikamp 	struct buffer_head *bh;
257470decc6SDave Kleikamp 	int locked;
258470decc6SDave Kleikamp 	int bufs = 0;
259470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
260470decc6SDave Kleikamp 
261470decc6SDave Kleikamp 	/*
262470decc6SDave Kleikamp 	 * Whenever we unlock the journal and sleep, things can get added
263470decc6SDave Kleikamp 	 * onto ->t_sync_datalist, so we have to keep looping back to
264470decc6SDave Kleikamp 	 * write_out_data until we *know* that the list is empty.
265470decc6SDave Kleikamp 	 *
266470decc6SDave Kleikamp 	 * Cleanup any flushed data buffers from the data list.  Even in
267470decc6SDave Kleikamp 	 * abort mode, we want to flush this out as soon as possible.
268470decc6SDave Kleikamp 	 */
269470decc6SDave Kleikamp write_out_data:
270470decc6SDave Kleikamp 	cond_resched();
271470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
272470decc6SDave Kleikamp 
273470decc6SDave Kleikamp 	while (commit_transaction->t_sync_datalist) {
274470decc6SDave Kleikamp 		jh = commit_transaction->t_sync_datalist;
275470decc6SDave Kleikamp 		bh = jh2bh(jh);
276470decc6SDave Kleikamp 		locked = 0;
277470decc6SDave Kleikamp 
278470decc6SDave Kleikamp 		/* Get reference just to make sure buffer does not disappear
279470decc6SDave Kleikamp 		 * when we are forced to drop various locks */
280470decc6SDave Kleikamp 		get_bh(bh);
281470decc6SDave Kleikamp 		/* If the buffer is dirty, we need to submit IO and hence
282470decc6SDave Kleikamp 		 * we need the buffer lock. We try to lock the buffer without
283470decc6SDave Kleikamp 		 * blocking. If we fail, we need to drop j_list_lock and do
284470decc6SDave Kleikamp 		 * blocking lock_buffer().
285470decc6SDave Kleikamp 		 */
286470decc6SDave Kleikamp 		if (buffer_dirty(bh)) {
287470decc6SDave Kleikamp 			if (test_set_buffer_locked(bh)) {
288470decc6SDave Kleikamp 				BUFFER_TRACE(bh, "needs blocking lock");
289470decc6SDave Kleikamp 				spin_unlock(&journal->j_list_lock);
290470decc6SDave Kleikamp 				/* Write out all data to prevent deadlocks */
291470decc6SDave Kleikamp 				journal_do_submit_data(wbuf, bufs);
292470decc6SDave Kleikamp 				bufs = 0;
293470decc6SDave Kleikamp 				lock_buffer(bh);
294470decc6SDave Kleikamp 				spin_lock(&journal->j_list_lock);
295470decc6SDave Kleikamp 			}
296470decc6SDave Kleikamp 			locked = 1;
297470decc6SDave Kleikamp 		}
298470decc6SDave Kleikamp 		/* We have to get bh_state lock. Again out of order, sigh. */
299470decc6SDave Kleikamp 		if (!inverted_lock(journal, bh)) {
300470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
301470decc6SDave Kleikamp 			spin_lock(&journal->j_list_lock);
302470decc6SDave Kleikamp 		}
303470decc6SDave Kleikamp 		/* Someone already cleaned up the buffer? */
304470decc6SDave Kleikamp 		if (!buffer_jbd(bh)
305470decc6SDave Kleikamp 			|| jh->b_transaction != commit_transaction
306470decc6SDave Kleikamp 			|| jh->b_jlist != BJ_SyncData) {
307470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
308470decc6SDave Kleikamp 			if (locked)
309470decc6SDave Kleikamp 				unlock_buffer(bh);
310470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "already cleaned up");
311470decc6SDave Kleikamp 			put_bh(bh);
312470decc6SDave Kleikamp 			continue;
313470decc6SDave Kleikamp 		}
314470decc6SDave Kleikamp 		if (locked && test_clear_buffer_dirty(bh)) {
315470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "needs writeout, adding to array");
316470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
317f7f4bccbSMingming Cao 			__jbd2_journal_file_buffer(jh, commit_transaction,
318470decc6SDave Kleikamp 						BJ_Locked);
319470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
320470decc6SDave Kleikamp 			if (bufs == journal->j_wbufsize) {
321470decc6SDave Kleikamp 				spin_unlock(&journal->j_list_lock);
322470decc6SDave Kleikamp 				journal_do_submit_data(wbuf, bufs);
323470decc6SDave Kleikamp 				bufs = 0;
324470decc6SDave Kleikamp 				goto write_out_data;
325470decc6SDave Kleikamp 			}
32612603925SHisashi Hifumi 		} else if (!locked && buffer_locked(bh)) {
32712603925SHisashi Hifumi 			__jbd2_journal_file_buffer(jh, commit_transaction,
32812603925SHisashi Hifumi 						BJ_Locked);
32912603925SHisashi Hifumi 			jbd_unlock_bh_state(bh);
33012603925SHisashi Hifumi 			put_bh(bh);
33112603925SHisashi Hifumi 		} else {
332470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "writeout complete: unfile");
333f7f4bccbSMingming Cao 			__jbd2_journal_unfile_buffer(jh);
334470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
335470decc6SDave Kleikamp 			if (locked)
336470decc6SDave Kleikamp 				unlock_buffer(bh);
337f7f4bccbSMingming Cao 			jbd2_journal_remove_journal_head(bh);
338470decc6SDave Kleikamp 			/* Once for our safety reference, once for
339f7f4bccbSMingming Cao 			 * jbd2_journal_remove_journal_head() */
340470decc6SDave Kleikamp 			put_bh(bh);
341470decc6SDave Kleikamp 			put_bh(bh);
342470decc6SDave Kleikamp 		}
343470decc6SDave Kleikamp 
34495c354feSNick Piggin 		if (need_resched() || spin_needbreak(&journal->j_list_lock)) {
345470decc6SDave Kleikamp 			spin_unlock(&journal->j_list_lock);
346470decc6SDave Kleikamp 			goto write_out_data;
347470decc6SDave Kleikamp 		}
348470decc6SDave Kleikamp 	}
349470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
350470decc6SDave Kleikamp 	journal_do_submit_data(wbuf, bufs);
351470decc6SDave Kleikamp }
352470decc6SDave Kleikamp 
353818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
354818d276cSGirish Shilamkar {
355818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
356818d276cSGirish Shilamkar 	char *addr;
357818d276cSGirish Shilamkar 	__u32 checksum;
358818d276cSGirish Shilamkar 
359818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
360818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
361818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
362818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
363818d276cSGirish Shilamkar 
364818d276cSGirish Shilamkar 	return checksum;
365818d276cSGirish Shilamkar }
366818d276cSGirish Shilamkar 
367818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
36818eba7aaSMingming Cao 				   unsigned long long block)
369b517bea1SZach Brown {
370b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
371cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
372b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
373b517bea1SZach Brown }
374b517bea1SZach Brown 
375470decc6SDave Kleikamp /*
376f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
377470decc6SDave Kleikamp  *
378470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
379470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
380470decc6SDave Kleikamp  */
381f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
382470decc6SDave Kleikamp {
3838e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
384470decc6SDave Kleikamp 	transaction_t *commit_transaction;
385470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
386470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
387470decc6SDave Kleikamp 	int bufs;
388470decc6SDave Kleikamp 	int flags;
389470decc6SDave Kleikamp 	int err;
39018eba7aaSMingming Cao 	unsigned long long blocknr;
391470decc6SDave Kleikamp 	char *tagp = NULL;
392470decc6SDave Kleikamp 	journal_header_t *header;
393470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
394470decc6SDave Kleikamp 	int space_left = 0;
395470decc6SDave Kleikamp 	int first_tag = 0;
396470decc6SDave Kleikamp 	int tag_flag;
397470decc6SDave Kleikamp 	int i;
398b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
399818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
400818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
401470decc6SDave Kleikamp 
402470decc6SDave Kleikamp 	/*
403470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
404470decc6SDave Kleikamp 	 * all outstanding updates to complete.
405470decc6SDave Kleikamp 	 */
406470decc6SDave Kleikamp 
407470decc6SDave Kleikamp #ifdef COMMIT_STATS
408470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
409470decc6SDave Kleikamp 	summarise_journal_usage(journal);
410470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
411470decc6SDave Kleikamp #endif
412470decc6SDave Kleikamp 
413f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
414f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
415470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
416f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
417470decc6SDave Kleikamp 	} else {
418470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
419470decc6SDave Kleikamp 	}
420470decc6SDave Kleikamp 
421470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
422470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
423470decc6SDave Kleikamp 
424470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
425470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
426470decc6SDave Kleikamp 
427470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
428470decc6SDave Kleikamp 			commit_transaction->t_tid);
429470decc6SDave Kleikamp 
430470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
431470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
432470decc6SDave Kleikamp 
4338e85fb3fSJohann Lombardi 	stats.u.run.rs_wait = commit_transaction->t_max_wait;
4348e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jiffies;
4358e85fb3fSJohann Lombardi 	stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
4368e85fb3fSJohann Lombardi 						stats.u.run.rs_locked);
4378e85fb3fSJohann Lombardi 
438470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
439470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
440470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
441470decc6SDave Kleikamp 
442470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
443470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
444470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
445470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
446470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
447470decc6SDave Kleikamp 			schedule();
448470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
449470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
450470decc6SDave Kleikamp 		}
451470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
452470decc6SDave Kleikamp 	}
453470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
454470decc6SDave Kleikamp 
455470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
456470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
457470decc6SDave Kleikamp 
458470decc6SDave Kleikamp 	/*
459470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
460470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
461470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
462470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
463f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
464470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
465470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
466470decc6SDave Kleikamp 	 *
467470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
468470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
469470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
470470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
471f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
472470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
473470decc6SDave Kleikamp 	 */
474470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
475470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
476470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
477470decc6SDave Kleikamp 		/*
478f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
479470decc6SDave Kleikamp 		 * leave undo-committed data.
480470decc6SDave Kleikamp 		 */
481470decc6SDave Kleikamp 		if (jh->b_committed_data) {
482470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
483470decc6SDave Kleikamp 
484470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
485af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
486470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
487470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
488470decc6SDave Kleikamp 		}
489f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
490470decc6SDave Kleikamp 	}
491470decc6SDave Kleikamp 
492470decc6SDave Kleikamp 	/*
493470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
494470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
495470decc6SDave Kleikamp 	 * frees some memory
496470decc6SDave Kleikamp 	 */
497470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
498f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
499470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
500470decc6SDave Kleikamp 
501470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
502470decc6SDave Kleikamp 
503470decc6SDave Kleikamp 	/*
504470decc6SDave Kleikamp 	 * Switch to a new revoke table.
505470decc6SDave Kleikamp 	 */
506f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
507470decc6SDave Kleikamp 
5088e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jiffies;
5098e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
5108e85fb3fSJohann Lombardi 					       stats.u.run.rs_flushing);
5118e85fb3fSJohann Lombardi 
512470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
513470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
514470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
515470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
516470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
517470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
518470decc6SDave Kleikamp 
519470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
520470decc6SDave Kleikamp 
521470decc6SDave Kleikamp 	/*
522470decc6SDave Kleikamp 	 * First, drop modified flag: all accesses to the buffers
523470decc6SDave Kleikamp 	 * will be tracked for a new trasaction only -bzzz
524470decc6SDave Kleikamp 	 */
525470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
526470decc6SDave Kleikamp 	if (commit_transaction->t_buffers) {
527470decc6SDave Kleikamp 		new_jh = jh = commit_transaction->t_buffers->b_tnext;
528470decc6SDave Kleikamp 		do {
529470decc6SDave Kleikamp 			J_ASSERT_JH(new_jh, new_jh->b_modified == 1 ||
530470decc6SDave Kleikamp 					new_jh->b_modified == 0);
531470decc6SDave Kleikamp 			new_jh->b_modified = 0;
532470decc6SDave Kleikamp 			new_jh = new_jh->b_tnext;
533470decc6SDave Kleikamp 		} while (new_jh != jh);
534470decc6SDave Kleikamp 	}
535470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
536470decc6SDave Kleikamp 
537470decc6SDave Kleikamp 	/*
538470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
539470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
540470decc6SDave Kleikamp 	 */
541470decc6SDave Kleikamp 	err = 0;
542470decc6SDave Kleikamp 	journal_submit_data_buffers(journal, commit_transaction);
543470decc6SDave Kleikamp 
544470decc6SDave Kleikamp 	/*
545818d276cSGirish Shilamkar 	 * Wait for all previously submitted IO to complete if commit
546818d276cSGirish Shilamkar 	 * record is to be written synchronously.
547470decc6SDave Kleikamp 	 */
548470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
549818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
550818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT))
551818d276cSGirish Shilamkar 		err = journal_wait_on_locked_list(journal,
552818d276cSGirish Shilamkar 						commit_transaction);
553470decc6SDave Kleikamp 
554470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
555470decc6SDave Kleikamp 
556470decc6SDave Kleikamp 	if (err)
557a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
558470decc6SDave Kleikamp 
559f7f4bccbSMingming Cao 	jbd2_journal_write_revoke_records(journal, commit_transaction);
560470decc6SDave Kleikamp 
561470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
562470decc6SDave Kleikamp 
563470decc6SDave Kleikamp 	/*
564470decc6SDave Kleikamp 	 * If we found any dirty or locked buffers, then we should have
565470decc6SDave Kleikamp 	 * looped back up to the write_out_data label.  If there weren't
566470decc6SDave Kleikamp 	 * any then journal_clean_data_list should have wiped the list
567470decc6SDave Kleikamp 	 * clean by now, so check that it is in fact empty.
568470decc6SDave Kleikamp 	 */
569470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_sync_datalist == NULL);
570470decc6SDave Kleikamp 
571470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 3\n");
572470decc6SDave Kleikamp 
573470decc6SDave Kleikamp 	/*
574470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
575470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
576470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
577470decc6SDave Kleikamp 	 */
578470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
579470decc6SDave Kleikamp 
5808e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jiffies;
5818e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
5828e85fb3fSJohann Lombardi 						 stats.u.run.rs_logging);
5838e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
5848e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks_logged = 0;
5858e85fb3fSJohann Lombardi 
586470decc6SDave Kleikamp 	descriptor = NULL;
587470decc6SDave Kleikamp 	bufs = 0;
588470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
589470decc6SDave Kleikamp 
590470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
591470decc6SDave Kleikamp 
592470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
593470decc6SDave Kleikamp 
594470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
595470decc6SDave Kleikamp 		   release it for background writing. */
596470decc6SDave Kleikamp 
597470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
598470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
599f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
600470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
601470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
602470decc6SDave Kleikamp 			 * already allocated, even if we are now
603470decc6SDave Kleikamp 			 * aborting. */
604470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
605470decc6SDave Kleikamp 				goto start_journal_io;
606470decc6SDave Kleikamp 			continue;
607470decc6SDave Kleikamp 		}
608470decc6SDave Kleikamp 
609470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
610470decc6SDave Kleikamp 		   record the metadata buffer. */
611470decc6SDave Kleikamp 
612470decc6SDave Kleikamp 		if (!descriptor) {
613470decc6SDave Kleikamp 			struct buffer_head *bh;
614470decc6SDave Kleikamp 
615470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
616470decc6SDave Kleikamp 
617470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
618470decc6SDave Kleikamp 
619f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
620470decc6SDave Kleikamp 			if (!descriptor) {
621a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
622470decc6SDave Kleikamp 				continue;
623470decc6SDave Kleikamp 			}
624470decc6SDave Kleikamp 
625470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
626470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
627470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
628470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
629f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
630f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
631470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
632470decc6SDave Kleikamp 
633470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
634470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
635470decc6SDave Kleikamp 			first_tag = 1;
636470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
637470decc6SDave Kleikamp 			set_buffer_dirty(bh);
638470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
639470decc6SDave Kleikamp 
640470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
641470decc6SDave Kleikamp                            completion later */
642470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
643f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
644470decc6SDave Kleikamp 					BJ_LogCtl);
645470decc6SDave Kleikamp 		}
646470decc6SDave Kleikamp 
647470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
648470decc6SDave Kleikamp 
649f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
650470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
651470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
652470decc6SDave Kleikamp 		   refile-on-abort condition above. */
653470decc6SDave Kleikamp 		if (err) {
654a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
655470decc6SDave Kleikamp 			continue;
656470decc6SDave Kleikamp 		}
657470decc6SDave Kleikamp 
658470decc6SDave Kleikamp 		/*
659470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
660470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
661f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
662470decc6SDave Kleikamp 		 */
663470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
664470decc6SDave Kleikamp 
665470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
666470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
667470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
668470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
669470decc6SDave Kleikamp 
670470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
671470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
672470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
673470decc6SDave Kleikamp 
674470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
675470decc6SDave Kleikamp 		/*
676f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
677470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
678470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
679470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
680470decc6SDave Kleikamp 		 */
681470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
682f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
683470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
684470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
685470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
686470decc6SDave Kleikamp 
687470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
688470decc6SDave Kleikamp                    buffer */
689470decc6SDave Kleikamp 
690470decc6SDave Kleikamp 		tag_flag = 0;
691470decc6SDave Kleikamp 		if (flags & 1)
692f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
693470decc6SDave Kleikamp 		if (!first_tag)
694f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
695470decc6SDave Kleikamp 
696470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
697b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
698470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
699b517bea1SZach Brown 		tagp += tag_bytes;
700b517bea1SZach Brown 		space_left -= tag_bytes;
701470decc6SDave Kleikamp 
702470decc6SDave Kleikamp 		if (first_tag) {
703470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
704470decc6SDave Kleikamp 			tagp += 16;
705470decc6SDave Kleikamp 			space_left -= 16;
706470decc6SDave Kleikamp 			first_tag = 0;
707470decc6SDave Kleikamp 		}
708470decc6SDave Kleikamp 
709470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
710470decc6SDave Kleikamp 		   let the IO rip! */
711470decc6SDave Kleikamp 
712470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
713470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
714b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
715470decc6SDave Kleikamp 
716470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
717470decc6SDave Kleikamp 
718470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
719470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
720470decc6SDave Kleikamp                            the last tag we set up. */
721470decc6SDave Kleikamp 
722f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
723470decc6SDave Kleikamp 
724470decc6SDave Kleikamp start_journal_io:
725470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
726470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
727818d276cSGirish Shilamkar 				/*
728818d276cSGirish Shilamkar 				 * Compute checksum.
729818d276cSGirish Shilamkar 				 */
730818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
731818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
732818d276cSGirish Shilamkar 					crc32_sum =
733818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
734818d276cSGirish Shilamkar 				}
735818d276cSGirish Shilamkar 
736470decc6SDave Kleikamp 				lock_buffer(bh);
737470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
738470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
739470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
740470decc6SDave Kleikamp 				submit_bh(WRITE, bh);
741470decc6SDave Kleikamp 			}
742470decc6SDave Kleikamp 			cond_resched();
7438e85fb3fSJohann Lombardi 			stats.u.run.rs_blocks_logged += bufs;
744470decc6SDave Kleikamp 
745470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
746470decc6SDave Kleikamp                            time round the loop. */
747470decc6SDave Kleikamp 			descriptor = NULL;
748470decc6SDave Kleikamp 			bufs = 0;
749470decc6SDave Kleikamp 		}
750470decc6SDave Kleikamp 	}
751470decc6SDave Kleikamp 
752818d276cSGirish Shilamkar 	/* Done it all: now write the commit record asynchronously. */
753818d276cSGirish Shilamkar 
754818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
755818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
756818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
757818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
758818d276cSGirish Shilamkar 		if (err)
759818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
760818d276cSGirish Shilamkar 
761818d276cSGirish Shilamkar 		spin_lock(&journal->j_list_lock);
762818d276cSGirish Shilamkar 		err = journal_wait_on_locked_list(journal,
763818d276cSGirish Shilamkar 						commit_transaction);
764818d276cSGirish Shilamkar 		spin_unlock(&journal->j_list_lock);
765818d276cSGirish Shilamkar 		if (err)
766818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
767818d276cSGirish Shilamkar 	}
768818d276cSGirish Shilamkar 
769470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
770470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
771470decc6SDave Kleikamp            complete.  Control buffers being written are on the
772470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
773470decc6SDave Kleikamp            the t_iobuf_list queue.
774470decc6SDave Kleikamp 
775470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
776470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
777470decc6SDave Kleikamp 	   so we incur less scheduling load.
778470decc6SDave Kleikamp 	*/
779470decc6SDave Kleikamp 
780470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 4\n");
781470decc6SDave Kleikamp 
782470decc6SDave Kleikamp 	/*
783470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
784470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
785470decc6SDave Kleikamp 	 */
786470decc6SDave Kleikamp wait_for_iobuf:
787470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
788470decc6SDave Kleikamp 		struct buffer_head *bh;
789470decc6SDave Kleikamp 
790470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
791470decc6SDave Kleikamp 		bh = jh2bh(jh);
792470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
793470decc6SDave Kleikamp 			wait_on_buffer(bh);
794470decc6SDave Kleikamp 			goto wait_for_iobuf;
795470decc6SDave Kleikamp 		}
796470decc6SDave Kleikamp 		if (cond_resched())
797470decc6SDave Kleikamp 			goto wait_for_iobuf;
798470decc6SDave Kleikamp 
799470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
800470decc6SDave Kleikamp 			err = -EIO;
801470decc6SDave Kleikamp 
802470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
803470decc6SDave Kleikamp 
804470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
805f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
806470decc6SDave Kleikamp 
807470decc6SDave Kleikamp 		/*
808470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
809f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
810470decc6SDave Kleikamp 		 */
811470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
812f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
813470decc6SDave Kleikamp 		__brelse(bh);
814470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
815470decc6SDave Kleikamp 		free_buffer_head(bh);
816470decc6SDave Kleikamp 
817470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
818470decc6SDave Kleikamp                    shadowed buffer */
819470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
820470decc6SDave Kleikamp 		bh = jh2bh(jh);
821470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
822470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
823470decc6SDave Kleikamp 
824470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
825470decc6SDave Kleikamp                    to remember it against this transaction so that when
826470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
827470decc6SDave Kleikamp                    required. */
828470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
829f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
830470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
831470decc6SDave Kleikamp 		   IO to complete */
832470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
833470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
834470decc6SDave Kleikamp 		__brelse(bh);
835470decc6SDave Kleikamp 	}
836470decc6SDave Kleikamp 
837470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
838470decc6SDave Kleikamp 
839470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 5\n");
840470decc6SDave Kleikamp 
841470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
842470decc6SDave Kleikamp  wait_for_ctlbuf:
843470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
844470decc6SDave Kleikamp 		struct buffer_head *bh;
845470decc6SDave Kleikamp 
846470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
847470decc6SDave Kleikamp 		bh = jh2bh(jh);
848470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
849470decc6SDave Kleikamp 			wait_on_buffer(bh);
850470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
851470decc6SDave Kleikamp 		}
852470decc6SDave Kleikamp 		if (cond_resched())
853470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
854470decc6SDave Kleikamp 
855470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
856470decc6SDave Kleikamp 			err = -EIO;
857470decc6SDave Kleikamp 
858470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
859470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
860f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
861f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
862470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
863470decc6SDave Kleikamp 		/* AKPM: bforget here */
864470decc6SDave Kleikamp 	}
865470decc6SDave Kleikamp 
866470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 6\n");
867470decc6SDave Kleikamp 
868818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
869818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
870818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
871818d276cSGirish Shilamkar 						&cbh, crc32_sum);
872818d276cSGirish Shilamkar 		if (err)
873818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
874818d276cSGirish Shilamkar 	}
875b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
876818d276cSGirish Shilamkar 		err = journal_wait_on_commit_record(cbh);
877470decc6SDave Kleikamp 
878470decc6SDave Kleikamp 	if (err)
879a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
880470decc6SDave Kleikamp 
881470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
882470decc6SDave Kleikamp            processing: any buffers committed as a result of this
883470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
884470decc6SDave Kleikamp            before. */
885470decc6SDave Kleikamp 
886470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 7\n");
887470decc6SDave Kleikamp 
888470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_sync_datalist == NULL);
889470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
890470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
891470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
892470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
893470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
894470decc6SDave Kleikamp 
895470decc6SDave Kleikamp restart_loop:
896470decc6SDave Kleikamp 	/*
897470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
898470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
899470decc6SDave Kleikamp 	 */
900470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
901470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
902470decc6SDave Kleikamp 		transaction_t *cp_transaction;
903470decc6SDave Kleikamp 		struct buffer_head *bh;
904470decc6SDave Kleikamp 
905470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
906470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
907470decc6SDave Kleikamp 		bh = jh2bh(jh);
908470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
909470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
910470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
911470decc6SDave Kleikamp 
912470decc6SDave Kleikamp 		/*
913470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
914470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
915470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
916470decc6SDave Kleikamp 		 * field now points to a committed version of the
917470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
918470decc6SDave Kleikamp 		 * data.
919470decc6SDave Kleikamp 		 *
920470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
921470decc6SDave Kleikamp 		 */
922470decc6SDave Kleikamp 		if (jh->b_committed_data) {
923af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
924470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
925470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
926470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
927470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
928470decc6SDave Kleikamp 			}
929470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
930af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
931470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
932470decc6SDave Kleikamp 		}
933470decc6SDave Kleikamp 
934470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
935470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
936470decc6SDave Kleikamp 		if (cp_transaction) {
937470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
9388e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
939f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
940470decc6SDave Kleikamp 		}
941470decc6SDave Kleikamp 
942470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
943470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
944f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
945470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
946470decc6SDave Kleikamp 		 * it. */
947470decc6SDave Kleikamp 
948470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
949470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
950470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
951470decc6SDave Kleikamp 		 * that buffer in the future now that the last use has
952470decc6SDave Kleikamp 		 * been committed.  That's not only a performance gain,
953470decc6SDave Kleikamp 		 * it also stops aliasing problems if the buffer is left
954470decc6SDave Kleikamp 		 * behind for writeback and gets reallocated for another
955470decc6SDave Kleikamp 		 * use in a different page. */
956470decc6SDave Kleikamp 		if (buffer_freed(bh)) {
957470decc6SDave Kleikamp 			clear_buffer_freed(bh);
958470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
959470decc6SDave Kleikamp 		}
960470decc6SDave Kleikamp 
961470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
962470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
963f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
964470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
965f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
966470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
967470decc6SDave Kleikamp 		} else {
968470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
969470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
970470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
971470decc6SDave Kleikamp 			 * could not have been reallocated until this
972470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
973470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
974470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
975470decc6SDave Kleikamp 			 * list. */
976470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
977f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
978470decc6SDave Kleikamp 			if (!jh->b_transaction) {
979470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
980470decc6SDave Kleikamp 				 /* needs a brelse */
981f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
982470decc6SDave Kleikamp 				release_buffer_page(bh);
983470decc6SDave Kleikamp 			} else
984470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
985470decc6SDave Kleikamp 		}
986470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
987470decc6SDave Kleikamp 	}
988470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
989470decc6SDave Kleikamp 	/*
990f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
991f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
992f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
993f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
994470decc6SDave Kleikamp 	 */
995470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
996470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
997470decc6SDave Kleikamp 	/*
998470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
999470decc6SDave Kleikamp 	 * while the lock was dropped...
1000470decc6SDave Kleikamp 	 */
1001470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
1002470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
1003470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
1004470decc6SDave Kleikamp 		goto restart_loop;
1005470decc6SDave Kleikamp 	}
1006470decc6SDave Kleikamp 
1007470decc6SDave Kleikamp 	/* Done with this transaction! */
1008470decc6SDave Kleikamp 
1009470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 8\n");
1010470decc6SDave Kleikamp 
1011470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
1012470decc6SDave Kleikamp 
10138e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
10148e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
10158e85fb3fSJohann Lombardi 						commit_transaction->t_start);
10168e85fb3fSJohann Lombardi 
10178e85fb3fSJohann Lombardi 	/*
10188e85fb3fSJohann Lombardi 	 * File the transaction for history
10198e85fb3fSJohann Lombardi 	 */
10208e85fb3fSJohann Lombardi 	stats.ts_type = JBD2_STATS_RUN;
10218e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
10228e85fb3fSJohann Lombardi 	stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
10238e85fb3fSJohann Lombardi 	spin_lock(&journal->j_history_lock);
10248e85fb3fSJohann Lombardi 	memcpy(journal->j_history + journal->j_history_cur, &stats,
10258e85fb3fSJohann Lombardi 			sizeof(stats));
10268e85fb3fSJohann Lombardi 	if (++journal->j_history_cur == journal->j_history_max)
10278e85fb3fSJohann Lombardi 		journal->j_history_cur = 0;
10288e85fb3fSJohann Lombardi 
10298e85fb3fSJohann Lombardi 	/*
10308e85fb3fSJohann Lombardi 	 * Calculate overall stats
10318e85fb3fSJohann Lombardi 	 */
10328e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
10338e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
10348e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
10358e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
10368e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
10378e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
10388e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
10398e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
10408e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
10418e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
10428e85fb3fSJohann Lombardi 
1043470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
1044470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
1045470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
1046470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
1047470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
1048470decc6SDave Kleikamp 
1049f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
1050f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
1051f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
1052470decc6SDave Kleikamp 	} else {
1053470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
1054470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
1055470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
1056470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
1057470decc6SDave Kleikamp 		} else {
1058470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
1059470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
1060470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
1061470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
1062470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
1063470decc6SDave Kleikamp 				commit_transaction;
1064470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
1065470decc6SDave Kleikamp 				commit_transaction;
1066470decc6SDave Kleikamp 		}
1067470decc6SDave Kleikamp 	}
1068470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
1069470decc6SDave Kleikamp 
1070470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
1071470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
1072470decc6SDave Kleikamp 
1073470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
1074470decc6SDave Kleikamp }
1075