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