xref: /linux-6.15/fs/jbd2/commit.c (revision 12603925)
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>
23470decc6SDave Kleikamp #include <linux/smp_lock.h>
24470decc6SDave Kleikamp 
25470decc6SDave Kleikamp /*
26470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
27470decc6SDave Kleikamp  */
28470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
29470decc6SDave Kleikamp {
30470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
31470decc6SDave Kleikamp 	if (uptodate)
32470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
33470decc6SDave Kleikamp 	else
34470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
35470decc6SDave Kleikamp 	unlock_buffer(bh);
36470decc6SDave Kleikamp }
37470decc6SDave Kleikamp 
38470decc6SDave Kleikamp /*
39470decc6SDave Kleikamp  * When an ext3-ordered file is truncated, it is possible that many pages are
40470decc6SDave Kleikamp  * not sucessfully freed, because they are attached to a committing transaction.
41470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
42470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
43470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
44470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
45470decc6SDave Kleikamp  *
46470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
47470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
48470decc6SDave Kleikamp  *
49470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
50470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
51470decc6SDave Kleikamp  */
52470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
53470decc6SDave Kleikamp {
54470decc6SDave Kleikamp 	struct page *page;
55470decc6SDave Kleikamp 
56470decc6SDave Kleikamp 	if (buffer_dirty(bh))
57470decc6SDave Kleikamp 		goto nope;
58470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
59470decc6SDave Kleikamp 		goto nope;
60470decc6SDave Kleikamp 	page = bh->b_page;
61470decc6SDave Kleikamp 	if (!page)
62470decc6SDave Kleikamp 		goto nope;
63470decc6SDave Kleikamp 	if (page->mapping)
64470decc6SDave Kleikamp 		goto nope;
65470decc6SDave Kleikamp 
66470decc6SDave Kleikamp 	/* OK, it's a truncated page */
67470decc6SDave Kleikamp 	if (TestSetPageLocked(page))
68470decc6SDave Kleikamp 		goto nope;
69470decc6SDave Kleikamp 
70470decc6SDave Kleikamp 	page_cache_get(page);
71470decc6SDave Kleikamp 	__brelse(bh);
72470decc6SDave Kleikamp 	try_to_free_buffers(page);
73470decc6SDave Kleikamp 	unlock_page(page);
74470decc6SDave Kleikamp 	page_cache_release(page);
75470decc6SDave Kleikamp 	return;
76470decc6SDave Kleikamp 
77470decc6SDave Kleikamp nope:
78470decc6SDave Kleikamp 	__brelse(bh);
79470decc6SDave Kleikamp }
80470decc6SDave Kleikamp 
81470decc6SDave Kleikamp /*
82470decc6SDave Kleikamp  * Try to acquire jbd_lock_bh_state() against the buffer, when j_list_lock is
83470decc6SDave Kleikamp  * held.  For ranking reasons we must trylock.  If we lose, schedule away and
84470decc6SDave Kleikamp  * return 0.  j_list_lock is dropped in this case.
85470decc6SDave Kleikamp  */
86470decc6SDave Kleikamp static int inverted_lock(journal_t *journal, struct buffer_head *bh)
87470decc6SDave Kleikamp {
88470decc6SDave Kleikamp 	if (!jbd_trylock_bh_state(bh)) {
89470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
90470decc6SDave Kleikamp 		schedule();
91470decc6SDave Kleikamp 		return 0;
92470decc6SDave Kleikamp 	}
93470decc6SDave Kleikamp 	return 1;
94470decc6SDave Kleikamp }
95470decc6SDave Kleikamp 
96470decc6SDave Kleikamp /* Done it all: now write the commit record.  We should have
97470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
98470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
99470decc6SDave Kleikamp  * entirely.
100470decc6SDave Kleikamp  *
101470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
102470decc6SDave Kleikamp  */
103470decc6SDave Kleikamp static int journal_write_commit_record(journal_t *journal,
104470decc6SDave Kleikamp 					transaction_t *commit_transaction)
105470decc6SDave Kleikamp {
106470decc6SDave Kleikamp 	struct journal_head *descriptor;
107470decc6SDave Kleikamp 	struct buffer_head *bh;
108470decc6SDave Kleikamp 	int i, ret;
109470decc6SDave Kleikamp 	int barrier_done = 0;
110470decc6SDave Kleikamp 
111470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
112470decc6SDave Kleikamp 		return 0;
113470decc6SDave Kleikamp 
114f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
115470decc6SDave Kleikamp 	if (!descriptor)
116470decc6SDave Kleikamp 		return 1;
117470decc6SDave Kleikamp 
118470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
119470decc6SDave Kleikamp 
120470decc6SDave Kleikamp 	/* AKPM: buglet - add `i' to tmp! */
121470decc6SDave Kleikamp 	for (i = 0; i < bh->b_size; i += 512) {
122470decc6SDave Kleikamp 		journal_header_t *tmp = (journal_header_t*)bh->b_data;
123f7f4bccbSMingming Cao 		tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
124f7f4bccbSMingming Cao 		tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
125470decc6SDave Kleikamp 		tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
126470decc6SDave Kleikamp 	}
127470decc6SDave Kleikamp 
128470decc6SDave Kleikamp 	JBUFFER_TRACE(descriptor, "write commit block");
129470decc6SDave Kleikamp 	set_buffer_dirty(bh);
130f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_BARRIER) {
131470decc6SDave Kleikamp 		set_buffer_ordered(bh);
132470decc6SDave Kleikamp 		barrier_done = 1;
133470decc6SDave Kleikamp 	}
134470decc6SDave Kleikamp 	ret = sync_dirty_buffer(bh);
135470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
136470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
137470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
138470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
139470decc6SDave Kleikamp 	 */
140470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
141470decc6SDave Kleikamp 		char b[BDEVNAME_SIZE];
142470decc6SDave Kleikamp 
143470decc6SDave Kleikamp 		printk(KERN_WARNING
144470decc6SDave Kleikamp 			"JBD: barrier-based sync failed on %s - "
145470decc6SDave Kleikamp 			"disabling barriers\n",
146470decc6SDave Kleikamp 			bdevname(journal->j_dev, b));
147470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
148f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
149470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
150470decc6SDave Kleikamp 
151470decc6SDave Kleikamp 		/* And try again, without the barrier */
152470decc6SDave Kleikamp 		clear_buffer_ordered(bh);
153470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
154470decc6SDave Kleikamp 		set_buffer_dirty(bh);
155470decc6SDave Kleikamp 		ret = sync_dirty_buffer(bh);
156470decc6SDave Kleikamp 	}
157470decc6SDave Kleikamp 	put_bh(bh);		/* One for getblk() */
158f7f4bccbSMingming Cao 	jbd2_journal_put_journal_head(descriptor);
159470decc6SDave Kleikamp 
160470decc6SDave Kleikamp 	return (ret == -EIO);
161470decc6SDave Kleikamp }
162470decc6SDave Kleikamp 
163470decc6SDave Kleikamp static void journal_do_submit_data(struct buffer_head **wbuf, int bufs)
164470decc6SDave Kleikamp {
165470decc6SDave Kleikamp 	int i;
166470decc6SDave Kleikamp 
167470decc6SDave Kleikamp 	for (i = 0; i < bufs; i++) {
168470decc6SDave Kleikamp 		wbuf[i]->b_end_io = end_buffer_write_sync;
169470decc6SDave Kleikamp 		/* We use-up our safety reference in submit_bh() */
170470decc6SDave Kleikamp 		submit_bh(WRITE, wbuf[i]);
171470decc6SDave Kleikamp 	}
172470decc6SDave Kleikamp }
173470decc6SDave Kleikamp 
174470decc6SDave Kleikamp /*
175470decc6SDave Kleikamp  *  Submit all the data buffers to disk
176470decc6SDave Kleikamp  */
177470decc6SDave Kleikamp static void journal_submit_data_buffers(journal_t *journal,
178470decc6SDave Kleikamp 				transaction_t *commit_transaction)
179470decc6SDave Kleikamp {
180470decc6SDave Kleikamp 	struct journal_head *jh;
181470decc6SDave Kleikamp 	struct buffer_head *bh;
182470decc6SDave Kleikamp 	int locked;
183470decc6SDave Kleikamp 	int bufs = 0;
184470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
185470decc6SDave Kleikamp 
186470decc6SDave Kleikamp 	/*
187470decc6SDave Kleikamp 	 * Whenever we unlock the journal and sleep, things can get added
188470decc6SDave Kleikamp 	 * onto ->t_sync_datalist, so we have to keep looping back to
189470decc6SDave Kleikamp 	 * write_out_data until we *know* that the list is empty.
190470decc6SDave Kleikamp 	 *
191470decc6SDave Kleikamp 	 * Cleanup any flushed data buffers from the data list.  Even in
192470decc6SDave Kleikamp 	 * abort mode, we want to flush this out as soon as possible.
193470decc6SDave Kleikamp 	 */
194470decc6SDave Kleikamp write_out_data:
195470decc6SDave Kleikamp 	cond_resched();
196470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
197470decc6SDave Kleikamp 
198470decc6SDave Kleikamp 	while (commit_transaction->t_sync_datalist) {
199470decc6SDave Kleikamp 		jh = commit_transaction->t_sync_datalist;
200470decc6SDave Kleikamp 		bh = jh2bh(jh);
201470decc6SDave Kleikamp 		locked = 0;
202470decc6SDave Kleikamp 
203470decc6SDave Kleikamp 		/* Get reference just to make sure buffer does not disappear
204470decc6SDave Kleikamp 		 * when we are forced to drop various locks */
205470decc6SDave Kleikamp 		get_bh(bh);
206470decc6SDave Kleikamp 		/* If the buffer is dirty, we need to submit IO and hence
207470decc6SDave Kleikamp 		 * we need the buffer lock. We try to lock the buffer without
208470decc6SDave Kleikamp 		 * blocking. If we fail, we need to drop j_list_lock and do
209470decc6SDave Kleikamp 		 * blocking lock_buffer().
210470decc6SDave Kleikamp 		 */
211470decc6SDave Kleikamp 		if (buffer_dirty(bh)) {
212470decc6SDave Kleikamp 			if (test_set_buffer_locked(bh)) {
213470decc6SDave Kleikamp 				BUFFER_TRACE(bh, "needs blocking lock");
214470decc6SDave Kleikamp 				spin_unlock(&journal->j_list_lock);
215470decc6SDave Kleikamp 				/* Write out all data to prevent deadlocks */
216470decc6SDave Kleikamp 				journal_do_submit_data(wbuf, bufs);
217470decc6SDave Kleikamp 				bufs = 0;
218470decc6SDave Kleikamp 				lock_buffer(bh);
219470decc6SDave Kleikamp 				spin_lock(&journal->j_list_lock);
220470decc6SDave Kleikamp 			}
221470decc6SDave Kleikamp 			locked = 1;
222470decc6SDave Kleikamp 		}
223470decc6SDave Kleikamp 		/* We have to get bh_state lock. Again out of order, sigh. */
224470decc6SDave Kleikamp 		if (!inverted_lock(journal, bh)) {
225470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
226470decc6SDave Kleikamp 			spin_lock(&journal->j_list_lock);
227470decc6SDave Kleikamp 		}
228470decc6SDave Kleikamp 		/* Someone already cleaned up the buffer? */
229470decc6SDave Kleikamp 		if (!buffer_jbd(bh)
230470decc6SDave Kleikamp 			|| jh->b_transaction != commit_transaction
231470decc6SDave Kleikamp 			|| jh->b_jlist != BJ_SyncData) {
232470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
233470decc6SDave Kleikamp 			if (locked)
234470decc6SDave Kleikamp 				unlock_buffer(bh);
235470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "already cleaned up");
236470decc6SDave Kleikamp 			put_bh(bh);
237470decc6SDave Kleikamp 			continue;
238470decc6SDave Kleikamp 		}
239470decc6SDave Kleikamp 		if (locked && test_clear_buffer_dirty(bh)) {
240470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "needs writeout, adding to array");
241470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
242f7f4bccbSMingming Cao 			__jbd2_journal_file_buffer(jh, commit_transaction,
243470decc6SDave Kleikamp 						BJ_Locked);
244470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
245470decc6SDave Kleikamp 			if (bufs == journal->j_wbufsize) {
246470decc6SDave Kleikamp 				spin_unlock(&journal->j_list_lock);
247470decc6SDave Kleikamp 				journal_do_submit_data(wbuf, bufs);
248470decc6SDave Kleikamp 				bufs = 0;
249470decc6SDave Kleikamp 				goto write_out_data;
250470decc6SDave Kleikamp 			}
251*12603925SHisashi Hifumi 		} else if (!locked && buffer_locked(bh)) {
252*12603925SHisashi Hifumi 			__jbd2_journal_file_buffer(jh, commit_transaction,
253*12603925SHisashi Hifumi 						BJ_Locked);
254*12603925SHisashi Hifumi 			jbd_unlock_bh_state(bh);
255*12603925SHisashi Hifumi 			put_bh(bh);
256*12603925SHisashi Hifumi 		} else {
257470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "writeout complete: unfile");
258f7f4bccbSMingming Cao 			__jbd2_journal_unfile_buffer(jh);
259470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
260470decc6SDave Kleikamp 			if (locked)
261470decc6SDave Kleikamp 				unlock_buffer(bh);
262f7f4bccbSMingming Cao 			jbd2_journal_remove_journal_head(bh);
263470decc6SDave Kleikamp 			/* Once for our safety reference, once for
264f7f4bccbSMingming Cao 			 * jbd2_journal_remove_journal_head() */
265470decc6SDave Kleikamp 			put_bh(bh);
266470decc6SDave Kleikamp 			put_bh(bh);
267470decc6SDave Kleikamp 		}
268470decc6SDave Kleikamp 
269470decc6SDave Kleikamp 		if (lock_need_resched(&journal->j_list_lock)) {
270470decc6SDave Kleikamp 			spin_unlock(&journal->j_list_lock);
271470decc6SDave Kleikamp 			goto write_out_data;
272470decc6SDave Kleikamp 		}
273470decc6SDave Kleikamp 	}
274470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
275470decc6SDave Kleikamp 	journal_do_submit_data(wbuf, bufs);
276470decc6SDave Kleikamp }
277470decc6SDave Kleikamp 
278b517bea1SZach Brown static inline void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
27918eba7aaSMingming Cao 				   unsigned long long block)
280b517bea1SZach Brown {
281b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
282b517bea1SZach Brown 	if (tag_bytes > JBD_TAG_SIZE32)
283b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
284b517bea1SZach Brown }
285b517bea1SZach Brown 
286470decc6SDave Kleikamp /*
287f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
288470decc6SDave Kleikamp  *
289470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
290470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
291470decc6SDave Kleikamp  */
292f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
293470decc6SDave Kleikamp {
294470decc6SDave Kleikamp 	transaction_t *commit_transaction;
295470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
296470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
297470decc6SDave Kleikamp 	int bufs;
298470decc6SDave Kleikamp 	int flags;
299470decc6SDave Kleikamp 	int err;
30018eba7aaSMingming Cao 	unsigned long long blocknr;
301470decc6SDave Kleikamp 	char *tagp = NULL;
302470decc6SDave Kleikamp 	journal_header_t *header;
303470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
304470decc6SDave Kleikamp 	int space_left = 0;
305470decc6SDave Kleikamp 	int first_tag = 0;
306470decc6SDave Kleikamp 	int tag_flag;
307470decc6SDave Kleikamp 	int i;
308b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
309470decc6SDave Kleikamp 
310470decc6SDave Kleikamp 	/*
311470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
312470decc6SDave Kleikamp 	 * all outstanding updates to complete.
313470decc6SDave Kleikamp 	 */
314470decc6SDave Kleikamp 
315470decc6SDave Kleikamp #ifdef COMMIT_STATS
316470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
317470decc6SDave Kleikamp 	summarise_journal_usage(journal);
318470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
319470decc6SDave Kleikamp #endif
320470decc6SDave Kleikamp 
321f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
322f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
323470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
324f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
325470decc6SDave Kleikamp 	} else {
326470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
327470decc6SDave Kleikamp 	}
328470decc6SDave Kleikamp 
329470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
330470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
331470decc6SDave Kleikamp 
332470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
333470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
334470decc6SDave Kleikamp 
335470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
336470decc6SDave Kleikamp 			commit_transaction->t_tid);
337470decc6SDave Kleikamp 
338470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
339470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
340470decc6SDave Kleikamp 
341470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
342470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
343470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
344470decc6SDave Kleikamp 
345470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
346470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
347470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
348470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
349470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
350470decc6SDave Kleikamp 			schedule();
351470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
352470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
353470decc6SDave Kleikamp 		}
354470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
355470decc6SDave Kleikamp 	}
356470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
357470decc6SDave Kleikamp 
358470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
359470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
360470decc6SDave Kleikamp 
361470decc6SDave Kleikamp 	/*
362470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
363470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
364470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
365470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
366f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
367470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
368470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
369470decc6SDave Kleikamp 	 *
370470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
371470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
372470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
373470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
374f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
375470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
376470decc6SDave Kleikamp 	 */
377470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
378470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
379470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
380470decc6SDave Kleikamp 		/*
381f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
382470decc6SDave Kleikamp 		 * leave undo-committed data.
383470decc6SDave Kleikamp 		 */
384470decc6SDave Kleikamp 		if (jh->b_committed_data) {
385470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
386470decc6SDave Kleikamp 
387470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
388f7f4bccbSMingming Cao 			jbd2_slab_free(jh->b_committed_data, bh->b_size);
389470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
390470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
391470decc6SDave Kleikamp 		}
392f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
393470decc6SDave Kleikamp 	}
394470decc6SDave Kleikamp 
395470decc6SDave Kleikamp 	/*
396470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
397470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
398470decc6SDave Kleikamp 	 * frees some memory
399470decc6SDave Kleikamp 	 */
400470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
401f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
402470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
403470decc6SDave Kleikamp 
404470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
405470decc6SDave Kleikamp 
406470decc6SDave Kleikamp 	/*
407470decc6SDave Kleikamp 	 * Switch to a new revoke table.
408470decc6SDave Kleikamp 	 */
409f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
410470decc6SDave Kleikamp 
411470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
412470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
413470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
414470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
415470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
416470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
417470decc6SDave Kleikamp 
418470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
419470decc6SDave Kleikamp 
420470decc6SDave Kleikamp 	/*
421470decc6SDave Kleikamp 	 * First, drop modified flag: all accesses to the buffers
422470decc6SDave Kleikamp 	 * will be tracked for a new trasaction only -bzzz
423470decc6SDave Kleikamp 	 */
424470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
425470decc6SDave Kleikamp 	if (commit_transaction->t_buffers) {
426470decc6SDave Kleikamp 		new_jh = jh = commit_transaction->t_buffers->b_tnext;
427470decc6SDave Kleikamp 		do {
428470decc6SDave Kleikamp 			J_ASSERT_JH(new_jh, new_jh->b_modified == 1 ||
429470decc6SDave Kleikamp 					new_jh->b_modified == 0);
430470decc6SDave Kleikamp 			new_jh->b_modified = 0;
431470decc6SDave Kleikamp 			new_jh = new_jh->b_tnext;
432470decc6SDave Kleikamp 		} while (new_jh != jh);
433470decc6SDave Kleikamp 	}
434470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
435470decc6SDave Kleikamp 
436470decc6SDave Kleikamp 	/*
437470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
438470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
439470decc6SDave Kleikamp 	 */
440470decc6SDave Kleikamp 	err = 0;
441470decc6SDave Kleikamp 	journal_submit_data_buffers(journal, commit_transaction);
442470decc6SDave Kleikamp 
443470decc6SDave Kleikamp 	/*
444470decc6SDave Kleikamp 	 * Wait for all previously submitted IO to complete.
445470decc6SDave Kleikamp 	 */
446470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
447470decc6SDave Kleikamp 	while (commit_transaction->t_locked_list) {
448470decc6SDave Kleikamp 		struct buffer_head *bh;
449470decc6SDave Kleikamp 
450470decc6SDave Kleikamp 		jh = commit_transaction->t_locked_list->b_tprev;
451470decc6SDave Kleikamp 		bh = jh2bh(jh);
452470decc6SDave Kleikamp 		get_bh(bh);
453470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
454470decc6SDave Kleikamp 			spin_unlock(&journal->j_list_lock);
455470decc6SDave Kleikamp 			wait_on_buffer(bh);
456470decc6SDave Kleikamp 			if (unlikely(!buffer_uptodate(bh)))
457470decc6SDave Kleikamp 				err = -EIO;
458470decc6SDave Kleikamp 			spin_lock(&journal->j_list_lock);
459470decc6SDave Kleikamp 		}
460470decc6SDave Kleikamp 		if (!inverted_lock(journal, bh)) {
461470decc6SDave Kleikamp 			put_bh(bh);
462470decc6SDave Kleikamp 			spin_lock(&journal->j_list_lock);
463470decc6SDave Kleikamp 			continue;
464470decc6SDave Kleikamp 		}
465470decc6SDave Kleikamp 		if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) {
466f7f4bccbSMingming Cao 			__jbd2_journal_unfile_buffer(jh);
467470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
468f7f4bccbSMingming Cao 			jbd2_journal_remove_journal_head(bh);
469470decc6SDave Kleikamp 			put_bh(bh);
470470decc6SDave Kleikamp 		} else {
471470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
472470decc6SDave Kleikamp 		}
473470decc6SDave Kleikamp 		put_bh(bh);
474470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
475470decc6SDave Kleikamp 	}
476470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
477470decc6SDave Kleikamp 
478470decc6SDave Kleikamp 	if (err)
479f7f4bccbSMingming Cao 		__jbd2_journal_abort_hard(journal);
480470decc6SDave Kleikamp 
481f7f4bccbSMingming Cao 	jbd2_journal_write_revoke_records(journal, commit_transaction);
482470decc6SDave Kleikamp 
483470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
484470decc6SDave Kleikamp 
485470decc6SDave Kleikamp 	/*
486470decc6SDave Kleikamp 	 * If we found any dirty or locked buffers, then we should have
487470decc6SDave Kleikamp 	 * looped back up to the write_out_data label.  If there weren't
488470decc6SDave Kleikamp 	 * any then journal_clean_data_list should have wiped the list
489470decc6SDave Kleikamp 	 * clean by now, so check that it is in fact empty.
490470decc6SDave Kleikamp 	 */
491470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_sync_datalist == NULL);
492470decc6SDave Kleikamp 
493470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 3\n");
494470decc6SDave Kleikamp 
495470decc6SDave Kleikamp 	/*
496470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
497470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
498470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
499470decc6SDave Kleikamp 	 */
500470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
501470decc6SDave Kleikamp 
502470decc6SDave Kleikamp 	descriptor = NULL;
503470decc6SDave Kleikamp 	bufs = 0;
504470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
505470decc6SDave Kleikamp 
506470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
507470decc6SDave Kleikamp 
508470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
509470decc6SDave Kleikamp 
510470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
511470decc6SDave Kleikamp 		   release it for background writing. */
512470decc6SDave Kleikamp 
513470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
514470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
515f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
516470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
517470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
518470decc6SDave Kleikamp 			 * already allocated, even if we are now
519470decc6SDave Kleikamp 			 * aborting. */
520470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
521470decc6SDave Kleikamp 				goto start_journal_io;
522470decc6SDave Kleikamp 			continue;
523470decc6SDave Kleikamp 		}
524470decc6SDave Kleikamp 
525470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
526470decc6SDave Kleikamp 		   record the metadata buffer. */
527470decc6SDave Kleikamp 
528470decc6SDave Kleikamp 		if (!descriptor) {
529470decc6SDave Kleikamp 			struct buffer_head *bh;
530470decc6SDave Kleikamp 
531470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
532470decc6SDave Kleikamp 
533470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
534470decc6SDave Kleikamp 
535f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
536470decc6SDave Kleikamp 			if (!descriptor) {
537f7f4bccbSMingming Cao 				__jbd2_journal_abort_hard(journal);
538470decc6SDave Kleikamp 				continue;
539470decc6SDave Kleikamp 			}
540470decc6SDave Kleikamp 
541470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
542470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
543470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
544470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
545f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
546f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
547470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
548470decc6SDave Kleikamp 
549470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
550470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
551470decc6SDave Kleikamp 			first_tag = 1;
552470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
553470decc6SDave Kleikamp 			set_buffer_dirty(bh);
554470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
555470decc6SDave Kleikamp 
556470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
557470decc6SDave Kleikamp                            completion later */
558470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
559f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
560470decc6SDave Kleikamp 					BJ_LogCtl);
561470decc6SDave Kleikamp 		}
562470decc6SDave Kleikamp 
563470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
564470decc6SDave Kleikamp 
565f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
566470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
567470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
568470decc6SDave Kleikamp 		   refile-on-abort condition above. */
569470decc6SDave Kleikamp 		if (err) {
570f7f4bccbSMingming Cao 			__jbd2_journal_abort_hard(journal);
571470decc6SDave Kleikamp 			continue;
572470decc6SDave Kleikamp 		}
573470decc6SDave Kleikamp 
574470decc6SDave Kleikamp 		/*
575470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
576470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
577f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
578470decc6SDave Kleikamp 		 */
579470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
580470decc6SDave Kleikamp 
581470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
582470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
583470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
584470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
585470decc6SDave Kleikamp 
586470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
587470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
588470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
589470decc6SDave Kleikamp 
590470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
591470decc6SDave Kleikamp 		/*
592f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
593470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
594470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
595470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
596470decc6SDave Kleikamp 		 */
597470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
598f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
599470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
600470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
601470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
602470decc6SDave Kleikamp 
603470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
604470decc6SDave Kleikamp                    buffer */
605470decc6SDave Kleikamp 
606470decc6SDave Kleikamp 		tag_flag = 0;
607470decc6SDave Kleikamp 		if (flags & 1)
608f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
609470decc6SDave Kleikamp 		if (!first_tag)
610f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
611470decc6SDave Kleikamp 
612470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
613b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
614470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
615b517bea1SZach Brown 		tagp += tag_bytes;
616b517bea1SZach Brown 		space_left -= tag_bytes;
617470decc6SDave Kleikamp 
618470decc6SDave Kleikamp 		if (first_tag) {
619470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
620470decc6SDave Kleikamp 			tagp += 16;
621470decc6SDave Kleikamp 			space_left -= 16;
622470decc6SDave Kleikamp 			first_tag = 0;
623470decc6SDave Kleikamp 		}
624470decc6SDave Kleikamp 
625470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
626470decc6SDave Kleikamp 		   let the IO rip! */
627470decc6SDave Kleikamp 
628470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
629470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
630b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
631470decc6SDave Kleikamp 
632470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
633470decc6SDave Kleikamp 
634470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
635470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
636470decc6SDave Kleikamp                            the last tag we set up. */
637470decc6SDave Kleikamp 
638f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
639470decc6SDave Kleikamp 
640470decc6SDave Kleikamp start_journal_io:
641470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
642470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
643470decc6SDave Kleikamp 				lock_buffer(bh);
644470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
645470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
646470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
647470decc6SDave Kleikamp 				submit_bh(WRITE, bh);
648470decc6SDave Kleikamp 			}
649470decc6SDave Kleikamp 			cond_resched();
650470decc6SDave Kleikamp 
651470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
652470decc6SDave Kleikamp                            time round the loop. */
653470decc6SDave Kleikamp 			descriptor = NULL;
654470decc6SDave Kleikamp 			bufs = 0;
655470decc6SDave Kleikamp 		}
656470decc6SDave Kleikamp 	}
657470decc6SDave Kleikamp 
658470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
659470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
660470decc6SDave Kleikamp            complete.  Control buffers being written are on the
661470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
662470decc6SDave Kleikamp            the t_iobuf_list queue.
663470decc6SDave Kleikamp 
664470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
665470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
666470decc6SDave Kleikamp 	   so we incur less scheduling load.
667470decc6SDave Kleikamp 	*/
668470decc6SDave Kleikamp 
669470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 4\n");
670470decc6SDave Kleikamp 
671470decc6SDave Kleikamp 	/*
672470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
673470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
674470decc6SDave Kleikamp 	 */
675470decc6SDave Kleikamp wait_for_iobuf:
676470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
677470decc6SDave Kleikamp 		struct buffer_head *bh;
678470decc6SDave Kleikamp 
679470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
680470decc6SDave Kleikamp 		bh = jh2bh(jh);
681470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
682470decc6SDave Kleikamp 			wait_on_buffer(bh);
683470decc6SDave Kleikamp 			goto wait_for_iobuf;
684470decc6SDave Kleikamp 		}
685470decc6SDave Kleikamp 		if (cond_resched())
686470decc6SDave Kleikamp 			goto wait_for_iobuf;
687470decc6SDave Kleikamp 
688470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
689470decc6SDave Kleikamp 			err = -EIO;
690470decc6SDave Kleikamp 
691470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
692470decc6SDave Kleikamp 
693470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
694f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
695470decc6SDave Kleikamp 
696470decc6SDave Kleikamp 		/*
697470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
698f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
699470decc6SDave Kleikamp 		 */
700470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
701f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
702470decc6SDave Kleikamp 		__brelse(bh);
703470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
704470decc6SDave Kleikamp 		free_buffer_head(bh);
705470decc6SDave Kleikamp 
706470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
707470decc6SDave Kleikamp                    shadowed buffer */
708470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
709470decc6SDave Kleikamp 		bh = jh2bh(jh);
710470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
711470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
712470decc6SDave Kleikamp 
713470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
714470decc6SDave Kleikamp                    to remember it against this transaction so that when
715470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
716470decc6SDave Kleikamp                    required. */
717470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
718f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
719470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
720470decc6SDave Kleikamp 		   IO to complete */
721470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
722470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
723470decc6SDave Kleikamp 		__brelse(bh);
724470decc6SDave Kleikamp 	}
725470decc6SDave Kleikamp 
726470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
727470decc6SDave Kleikamp 
728470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 5\n");
729470decc6SDave Kleikamp 
730470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
731470decc6SDave Kleikamp  wait_for_ctlbuf:
732470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
733470decc6SDave Kleikamp 		struct buffer_head *bh;
734470decc6SDave Kleikamp 
735470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
736470decc6SDave Kleikamp 		bh = jh2bh(jh);
737470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
738470decc6SDave Kleikamp 			wait_on_buffer(bh);
739470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
740470decc6SDave Kleikamp 		}
741470decc6SDave Kleikamp 		if (cond_resched())
742470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
743470decc6SDave Kleikamp 
744470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
745470decc6SDave Kleikamp 			err = -EIO;
746470decc6SDave Kleikamp 
747470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
748470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
749f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
750f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
751470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
752470decc6SDave Kleikamp 		/* AKPM: bforget here */
753470decc6SDave Kleikamp 	}
754470decc6SDave Kleikamp 
755470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 6\n");
756470decc6SDave Kleikamp 
757470decc6SDave Kleikamp 	if (journal_write_commit_record(journal, commit_transaction))
758470decc6SDave Kleikamp 		err = -EIO;
759470decc6SDave Kleikamp 
760470decc6SDave Kleikamp 	if (err)
761f7f4bccbSMingming Cao 		__jbd2_journal_abort_hard(journal);
762470decc6SDave Kleikamp 
763470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
764470decc6SDave Kleikamp            processing: any buffers committed as a result of this
765470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
766470decc6SDave Kleikamp            before. */
767470decc6SDave Kleikamp 
768470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 7\n");
769470decc6SDave Kleikamp 
770470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_sync_datalist == NULL);
771470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
772470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
773470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
774470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
775470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
776470decc6SDave Kleikamp 
777470decc6SDave Kleikamp restart_loop:
778470decc6SDave Kleikamp 	/*
779470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
780470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
781470decc6SDave Kleikamp 	 */
782470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
783470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
784470decc6SDave Kleikamp 		transaction_t *cp_transaction;
785470decc6SDave Kleikamp 		struct buffer_head *bh;
786470decc6SDave Kleikamp 
787470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
788470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
789470decc6SDave Kleikamp 		bh = jh2bh(jh);
790470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
791470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
792470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
793470decc6SDave Kleikamp 
794470decc6SDave Kleikamp 		/*
795470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
796470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
797470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
798470decc6SDave Kleikamp 		 * field now points to a committed version of the
799470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
800470decc6SDave Kleikamp 		 * data.
801470decc6SDave Kleikamp 		 *
802470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
803470decc6SDave Kleikamp 		 */
804470decc6SDave Kleikamp 		if (jh->b_committed_data) {
805f7f4bccbSMingming Cao 			jbd2_slab_free(jh->b_committed_data, bh->b_size);
806470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
807470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
808470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
809470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
810470decc6SDave Kleikamp 			}
811470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
812f7f4bccbSMingming Cao 			jbd2_slab_free(jh->b_frozen_data, bh->b_size);
813470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
814470decc6SDave Kleikamp 		}
815470decc6SDave Kleikamp 
816470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
817470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
818470decc6SDave Kleikamp 		if (cp_transaction) {
819470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
820f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
821470decc6SDave Kleikamp 		}
822470decc6SDave Kleikamp 
823470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
824470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
825f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
826470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
827470decc6SDave Kleikamp 		 * it. */
828470decc6SDave Kleikamp 
829470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
830470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
831470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
832470decc6SDave Kleikamp 		 * that buffer in the future now that the last use has
833470decc6SDave Kleikamp 		 * been committed.  That's not only a performance gain,
834470decc6SDave Kleikamp 		 * it also stops aliasing problems if the buffer is left
835470decc6SDave Kleikamp 		 * behind for writeback and gets reallocated for another
836470decc6SDave Kleikamp 		 * use in a different page. */
837470decc6SDave Kleikamp 		if (buffer_freed(bh)) {
838470decc6SDave Kleikamp 			clear_buffer_freed(bh);
839470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
840470decc6SDave Kleikamp 		}
841470decc6SDave Kleikamp 
842470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
843470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
844f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
845470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
846f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
847470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
848470decc6SDave Kleikamp 		} else {
849470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
850470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
851470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
852470decc6SDave Kleikamp 			 * could not have been reallocated until this
853470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
854470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
855470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
856470decc6SDave Kleikamp 			 * list. */
857470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
858f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
859470decc6SDave Kleikamp 			if (!jh->b_transaction) {
860470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
861470decc6SDave Kleikamp 				 /* needs a brelse */
862f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
863470decc6SDave Kleikamp 				release_buffer_page(bh);
864470decc6SDave Kleikamp 			} else
865470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
866470decc6SDave Kleikamp 		}
867470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
868470decc6SDave Kleikamp 	}
869470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
870470decc6SDave Kleikamp 	/*
871470decc6SDave Kleikamp 	 * This is a bit sleazy.  We borrow j_list_lock to protect
872f7f4bccbSMingming Cao 	 * journal->j_committing_transaction in __jbd2_journal_remove_checkpoint.
873f7f4bccbSMingming Cao 	 * Really, __jbd2_journal_remove_checkpoint should be using j_state_lock but
874f7f4bccbSMingming Cao 	 * it's a bit hassle to hold that across __jbd2_journal_remove_checkpoint
875470decc6SDave Kleikamp 	 */
876470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
877470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
878470decc6SDave Kleikamp 	/*
879470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
880470decc6SDave Kleikamp 	 * while the lock was dropped...
881470decc6SDave Kleikamp 	 */
882470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
883470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
884470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
885470decc6SDave Kleikamp 		goto restart_loop;
886470decc6SDave Kleikamp 	}
887470decc6SDave Kleikamp 
888470decc6SDave Kleikamp 	/* Done with this transaction! */
889470decc6SDave Kleikamp 
890470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 8\n");
891470decc6SDave Kleikamp 
892470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
893470decc6SDave Kleikamp 
894470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
895470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
896470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
897470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
898470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
899470decc6SDave Kleikamp 
900470decc6SDave Kleikamp 	if (commit_transaction->t_checkpoint_list == NULL) {
901f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
902470decc6SDave Kleikamp 	} else {
903470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
904470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
905470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
906470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
907470decc6SDave Kleikamp 		} else {
908470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
909470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
910470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
911470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
912470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
913470decc6SDave Kleikamp 				commit_transaction;
914470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
915470decc6SDave Kleikamp 				commit_transaction;
916470decc6SDave Kleikamp 		}
917470decc6SDave Kleikamp 	}
918470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
919470decc6SDave Kleikamp 
920470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
921470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
922470decc6SDave Kleikamp 
923470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
924470decc6SDave Kleikamp }
925