xref: /linux-6.15/fs/jbd2/commit.c (revision ede86cc4)
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>
19*ede86cc4STheodore Ts'o #include <linux/marker.h>
20470decc6SDave Kleikamp #include <linux/errno.h>
21470decc6SDave Kleikamp #include <linux/slab.h>
22470decc6SDave Kleikamp #include <linux/mm.h>
23470decc6SDave Kleikamp #include <linux/pagemap.h>
248e85fb3fSJohann Lombardi #include <linux/jiffies.h>
25818d276cSGirish Shilamkar #include <linux/crc32.h>
26cd1aac32SAneesh Kumar K.V #include <linux/writeback.h>
27cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h>
28470decc6SDave Kleikamp 
29470decc6SDave Kleikamp /*
30470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
31470decc6SDave Kleikamp  */
32470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
33470decc6SDave Kleikamp {
34470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
35470decc6SDave Kleikamp 	if (uptodate)
36470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
37470decc6SDave Kleikamp 	else
38470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
39470decc6SDave Kleikamp 	unlock_buffer(bh);
40470decc6SDave Kleikamp }
41470decc6SDave Kleikamp 
42470decc6SDave Kleikamp /*
4387c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4487c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
45470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
46470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
47470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
48470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
49470decc6SDave Kleikamp  *
50470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
51470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
52470decc6SDave Kleikamp  *
53470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
54470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
55470decc6SDave Kleikamp  */
56470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
57470decc6SDave Kleikamp {
58470decc6SDave Kleikamp 	struct page *page;
59470decc6SDave Kleikamp 
60470decc6SDave Kleikamp 	if (buffer_dirty(bh))
61470decc6SDave Kleikamp 		goto nope;
62470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
63470decc6SDave Kleikamp 		goto nope;
64470decc6SDave Kleikamp 	page = bh->b_page;
65470decc6SDave Kleikamp 	if (!page)
66470decc6SDave Kleikamp 		goto nope;
67470decc6SDave Kleikamp 	if (page->mapping)
68470decc6SDave Kleikamp 		goto nope;
69470decc6SDave Kleikamp 
70470decc6SDave Kleikamp 	/* OK, it's a truncated page */
71529ae9aaSNick Piggin 	if (!trylock_page(page))
72470decc6SDave Kleikamp 		goto nope;
73470decc6SDave Kleikamp 
74470decc6SDave Kleikamp 	page_cache_get(page);
75470decc6SDave Kleikamp 	__brelse(bh);
76470decc6SDave Kleikamp 	try_to_free_buffers(page);
77470decc6SDave Kleikamp 	unlock_page(page);
78470decc6SDave Kleikamp 	page_cache_release(page);
79470decc6SDave Kleikamp 	return;
80470decc6SDave Kleikamp 
81470decc6SDave Kleikamp nope:
82470decc6SDave Kleikamp 	__brelse(bh);
83470decc6SDave Kleikamp }
84470decc6SDave Kleikamp 
85470decc6SDave Kleikamp /*
86818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
87470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
88470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
89470decc6SDave Kleikamp  * entirely.
90470decc6SDave Kleikamp  *
91470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
92470decc6SDave Kleikamp  */
93818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
94818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
95818d276cSGirish Shilamkar 					struct buffer_head **cbh,
96818d276cSGirish Shilamkar 					__u32 crc32_sum)
97470decc6SDave Kleikamp {
98470decc6SDave Kleikamp 	struct journal_head *descriptor;
99818d276cSGirish Shilamkar 	struct commit_header *tmp;
100470decc6SDave Kleikamp 	struct buffer_head *bh;
101818d276cSGirish Shilamkar 	int ret;
102470decc6SDave Kleikamp 	int barrier_done = 0;
103736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
104470decc6SDave Kleikamp 
105470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
106470decc6SDave Kleikamp 		return 0;
107470decc6SDave Kleikamp 
108f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
109470decc6SDave Kleikamp 	if (!descriptor)
110470decc6SDave Kleikamp 		return 1;
111470decc6SDave Kleikamp 
112470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
113470decc6SDave Kleikamp 
114818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
115f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
116f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
117470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
118736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
119736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
120818d276cSGirish Shilamkar 
121818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
122818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
123818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
124818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
125818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
126470decc6SDave Kleikamp 	}
127470decc6SDave Kleikamp 
128818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
129818d276cSGirish Shilamkar 	lock_buffer(bh);
130c4b8e635SAneesh Kumar K.V 	get_bh(bh);
131470decc6SDave Kleikamp 	set_buffer_dirty(bh);
132818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
133818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
134818d276cSGirish Shilamkar 
135818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1364d605179SAneesh Kumar K.V 		!JBD2_HAS_INCOMPAT_FEATURE(journal,
137818d276cSGirish Shilamkar 					 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
138470decc6SDave Kleikamp 		set_buffer_ordered(bh);
139470decc6SDave Kleikamp 		barrier_done = 1;
140470decc6SDave Kleikamp 	}
141818d276cSGirish Shilamkar 	ret = submit_bh(WRITE, bh);
142c4e35e07SDave Kleikamp 	if (barrier_done)
143c4e35e07SDave Kleikamp 		clear_buffer_ordered(bh);
144818d276cSGirish Shilamkar 
145470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
146470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
147470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
148470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
149470decc6SDave Kleikamp 	 */
150470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
151470decc6SDave Kleikamp 		printk(KERN_WARNING
152470decc6SDave Kleikamp 		       "JBD: barrier-based sync failed on %s - "
15305496769STheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
154470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
155f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
156470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
157470decc6SDave Kleikamp 
158470decc6SDave Kleikamp 		/* And try again, without the barrier */
159034772b0STheodore Ts'o 		lock_buffer(bh);
160470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
161470decc6SDave Kleikamp 		set_buffer_dirty(bh);
162818d276cSGirish Shilamkar 		ret = submit_bh(WRITE, bh);
163470decc6SDave Kleikamp 	}
164818d276cSGirish Shilamkar 	*cbh = bh;
165818d276cSGirish Shilamkar 	return ret;
166818d276cSGirish Shilamkar }
167470decc6SDave Kleikamp 
168818d276cSGirish Shilamkar /*
169818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
170818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
171818d276cSGirish Shilamkar  */
172818d276cSGirish Shilamkar static int journal_wait_on_commit_record(struct buffer_head *bh)
173818d276cSGirish Shilamkar {
174818d276cSGirish Shilamkar 	int ret = 0;
175818d276cSGirish Shilamkar 
176818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
177818d276cSGirish Shilamkar 	wait_on_buffer(bh);
178818d276cSGirish Shilamkar 
179818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
180818d276cSGirish Shilamkar 		ret = -EIO;
181818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
182818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
183818d276cSGirish Shilamkar 
184818d276cSGirish Shilamkar 	return ret;
185818d276cSGirish Shilamkar }
186818d276cSGirish Shilamkar 
187818d276cSGirish Shilamkar /*
188cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
189cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
190cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
191cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
192cd1aac32SAneesh Kumar K.V  */
193cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
194cd1aac32SAneesh Kumar K.V {
195cd1aac32SAneesh Kumar K.V 	int ret;
196cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
197cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
198cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
199cd1aac32SAneesh Kumar K.V 		.range_start = 0,
200cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
201cd1aac32SAneesh Kumar K.V 		.for_writepages = 1,
202cd1aac32SAneesh Kumar K.V 	};
203cd1aac32SAneesh Kumar K.V 
204cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
205cd1aac32SAneesh Kumar K.V 	return ret;
206cd1aac32SAneesh Kumar K.V }
207cd1aac32SAneesh Kumar K.V 
208cd1aac32SAneesh Kumar K.V /*
209c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
210c851ed54SJan Kara  * disk.
211c851ed54SJan Kara  *
212c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
213c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
214c851ed54SJan Kara  * operate on from being released while we write out pages.
215c851ed54SJan Kara  */
216cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
217c851ed54SJan Kara 		transaction_t *commit_transaction)
218c851ed54SJan Kara {
219c851ed54SJan Kara 	struct jbd2_inode *jinode;
220c851ed54SJan Kara 	int err, ret = 0;
221c851ed54SJan Kara 	struct address_space *mapping;
222c851ed54SJan Kara 
223c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
224c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
225c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
226c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
227c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
228cd1aac32SAneesh Kumar K.V 		/*
229cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
230cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
231cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
232cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
233cd1aac32SAneesh Kumar K.V 		 */
234cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
235c851ed54SJan Kara 		if (!ret)
236c851ed54SJan Kara 			ret = err;
237c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
238c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
239c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
240c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
241c851ed54SJan Kara 	}
242c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
243c851ed54SJan Kara 	return ret;
244c851ed54SJan Kara }
245c851ed54SJan Kara 
246c851ed54SJan Kara /*
247c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
248c851ed54SJan Kara  * transaction if needed.
249c851ed54SJan Kara  *
250c851ed54SJan Kara  */
251c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
252c851ed54SJan Kara 		transaction_t *commit_transaction)
253c851ed54SJan Kara {
254c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
255c851ed54SJan Kara 	int err, ret = 0;
256c851ed54SJan Kara 
257cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
258c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
259c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
260c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
261c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
262c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
263e9e34f4eSHidehiro Kawai 		if (err) {
264e9e34f4eSHidehiro Kawai 			/*
265e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
266e9e34f4eSHidehiro Kawai 			 * wait_on_page_writeback_range(), set it again so
267e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
268e9e34f4eSHidehiro Kawai 			 */
269e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
270e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
271e9e34f4eSHidehiro Kawai 
272c851ed54SJan Kara 			if (!ret)
273c851ed54SJan Kara 				ret = err;
274e9e34f4eSHidehiro Kawai 		}
275c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
276c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
277c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
278c851ed54SJan Kara 	}
279c851ed54SJan Kara 
280c851ed54SJan Kara 	/* Now refile inode to proper lists */
281c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
282c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
283c851ed54SJan Kara 		list_del(&jinode->i_list);
284c851ed54SJan Kara 		if (jinode->i_next_transaction) {
285c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
286c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
287c851ed54SJan Kara 			list_add(&jinode->i_list,
288c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
289c851ed54SJan Kara 		} else {
290c851ed54SJan Kara 			jinode->i_transaction = NULL;
291c851ed54SJan Kara 		}
292c851ed54SJan Kara 	}
293c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
294c851ed54SJan Kara 
295c851ed54SJan Kara 	return ret;
296c851ed54SJan Kara }
297c851ed54SJan Kara 
298818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
299818d276cSGirish Shilamkar {
300818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
301818d276cSGirish Shilamkar 	char *addr;
302818d276cSGirish Shilamkar 	__u32 checksum;
303818d276cSGirish Shilamkar 
304818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
305818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
306818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
307818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
308818d276cSGirish Shilamkar 
309818d276cSGirish Shilamkar 	return checksum;
310818d276cSGirish Shilamkar }
311818d276cSGirish Shilamkar 
312818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
31318eba7aaSMingming Cao 				   unsigned long long block)
314b517bea1SZach Brown {
315b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
316cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
317b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
318b517bea1SZach Brown }
319b517bea1SZach Brown 
320470decc6SDave Kleikamp /*
321f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
322470decc6SDave Kleikamp  *
323470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
324470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
325470decc6SDave Kleikamp  */
326f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
327470decc6SDave Kleikamp {
3288e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
329470decc6SDave Kleikamp 	transaction_t *commit_transaction;
330470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
331470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
332470decc6SDave Kleikamp 	int bufs;
333470decc6SDave Kleikamp 	int flags;
334470decc6SDave Kleikamp 	int err;
33518eba7aaSMingming Cao 	unsigned long long blocknr;
336470decc6SDave Kleikamp 	char *tagp = NULL;
337470decc6SDave Kleikamp 	journal_header_t *header;
338470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
339470decc6SDave Kleikamp 	int space_left = 0;
340470decc6SDave Kleikamp 	int first_tag = 0;
341470decc6SDave Kleikamp 	int tag_flag;
342470decc6SDave Kleikamp 	int i;
343b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
344818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
345818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
346470decc6SDave Kleikamp 
347470decc6SDave Kleikamp 	/*
348470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
349470decc6SDave Kleikamp 	 * all outstanding updates to complete.
350470decc6SDave Kleikamp 	 */
351470decc6SDave Kleikamp 
352470decc6SDave Kleikamp #ifdef COMMIT_STATS
353470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
354470decc6SDave Kleikamp 	summarise_journal_usage(journal);
355470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
356470decc6SDave Kleikamp #endif
357470decc6SDave Kleikamp 
358f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
359f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
360470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
361f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
362470decc6SDave Kleikamp 	} else {
363470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
364470decc6SDave Kleikamp 	}
365470decc6SDave Kleikamp 
366470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
367470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
368470decc6SDave Kleikamp 
369470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
370470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
371470decc6SDave Kleikamp 
372*ede86cc4STheodore Ts'o 	trace_mark(jbd2_start_commit, "dev %s transaction %d",
373*ede86cc4STheodore Ts'o 		   journal->j_devname, commit_transaction->t_tid);
374470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
375470decc6SDave Kleikamp 			commit_transaction->t_tid);
376470decc6SDave Kleikamp 
377470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
378470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
379470decc6SDave Kleikamp 
3808e85fb3fSJohann Lombardi 	stats.u.run.rs_wait = commit_transaction->t_max_wait;
3818e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jiffies;
3828e85fb3fSJohann Lombardi 	stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
3838e85fb3fSJohann Lombardi 						stats.u.run.rs_locked);
3848e85fb3fSJohann Lombardi 
385470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
386470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
387470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
388470decc6SDave Kleikamp 
389470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
390470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
391470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
392470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
393470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
394470decc6SDave Kleikamp 			schedule();
395470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
396470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
397470decc6SDave Kleikamp 		}
398470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
399470decc6SDave Kleikamp 	}
400470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
401470decc6SDave Kleikamp 
402470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
403470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
404470decc6SDave Kleikamp 
405470decc6SDave Kleikamp 	/*
406470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
407470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
408470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
409470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
410f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
411470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
412470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
413470decc6SDave Kleikamp 	 *
414470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
415470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
416470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
417470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
418f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
419470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
420470decc6SDave Kleikamp 	 */
421470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
422470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
423470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
424470decc6SDave Kleikamp 		/*
425f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
426470decc6SDave Kleikamp 		 * leave undo-committed data.
427470decc6SDave Kleikamp 		 */
428470decc6SDave Kleikamp 		if (jh->b_committed_data) {
429470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
430470decc6SDave Kleikamp 
431470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
432af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
433470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
434470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
435470decc6SDave Kleikamp 		}
436f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
437470decc6SDave Kleikamp 	}
438470decc6SDave Kleikamp 
439470decc6SDave Kleikamp 	/*
440470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
441470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
442470decc6SDave Kleikamp 	 * frees some memory
443470decc6SDave Kleikamp 	 */
444470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
445f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
446470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
447470decc6SDave Kleikamp 
448470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
449470decc6SDave Kleikamp 
450470decc6SDave Kleikamp 	/*
451470decc6SDave Kleikamp 	 * Switch to a new revoke table.
452470decc6SDave Kleikamp 	 */
453f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
454470decc6SDave Kleikamp 
4558e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jiffies;
4568e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
4578e85fb3fSJohann Lombardi 					       stats.u.run.rs_flushing);
4588e85fb3fSJohann Lombardi 
459470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
460470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
461470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
462470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
463470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
464470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
465470decc6SDave Kleikamp 
466470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
467470decc6SDave Kleikamp 
468470decc6SDave Kleikamp 	/*
469470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
470470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
471470decc6SDave Kleikamp 	 */
472cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
473c851ed54SJan Kara 	if (err)
474c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
475470decc6SDave Kleikamp 
476f7f4bccbSMingming Cao 	jbd2_journal_write_revoke_records(journal, commit_transaction);
477470decc6SDave Kleikamp 
478470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
479470decc6SDave Kleikamp 
480470decc6SDave Kleikamp 	/*
481470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
482470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
483470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
484470decc6SDave Kleikamp 	 */
48502c471cbSMingming Cao 	spin_lock(&journal->j_state_lock);
486470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
48702c471cbSMingming Cao 	spin_unlock(&journal->j_state_lock);
488470decc6SDave Kleikamp 
4898e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jiffies;
4908e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
4918e85fb3fSJohann Lombardi 						 stats.u.run.rs_logging);
4928e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
4938e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks_logged = 0;
4948e85fb3fSJohann Lombardi 
4951dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
4961dfc3220SJosef Bacik 		 commit_transaction->t_outstanding_credits);
4971dfc3220SJosef Bacik 
49887c89c23SJan Kara 	err = 0;
499470decc6SDave Kleikamp 	descriptor = NULL;
500470decc6SDave Kleikamp 	bufs = 0;
501470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
502470decc6SDave Kleikamp 
503470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
504470decc6SDave Kleikamp 
505470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
506470decc6SDave Kleikamp 
507470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
508470decc6SDave Kleikamp 		   release it for background writing. */
509470decc6SDave Kleikamp 
510470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
511470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
512f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
513470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
514470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
515470decc6SDave Kleikamp 			 * already allocated, even if we are now
516470decc6SDave Kleikamp 			 * aborting. */
517470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
518470decc6SDave Kleikamp 				goto start_journal_io;
519470decc6SDave Kleikamp 			continue;
520470decc6SDave Kleikamp 		}
521470decc6SDave Kleikamp 
522470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
523470decc6SDave Kleikamp 		   record the metadata buffer. */
524470decc6SDave Kleikamp 
525470decc6SDave Kleikamp 		if (!descriptor) {
526470decc6SDave Kleikamp 			struct buffer_head *bh;
527470decc6SDave Kleikamp 
528470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
529470decc6SDave Kleikamp 
530470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
531470decc6SDave Kleikamp 
532f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
533470decc6SDave Kleikamp 			if (!descriptor) {
534a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
535470decc6SDave Kleikamp 				continue;
536470decc6SDave Kleikamp 			}
537470decc6SDave Kleikamp 
538470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
539470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
540470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
541470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
542f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
543f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
544470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
545470decc6SDave Kleikamp 
546470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
547470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
548470decc6SDave Kleikamp 			first_tag = 1;
549470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
550470decc6SDave Kleikamp 			set_buffer_dirty(bh);
551470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
552470decc6SDave Kleikamp 
553470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
554470decc6SDave Kleikamp                            completion later */
555470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
556f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
557470decc6SDave Kleikamp 					BJ_LogCtl);
558470decc6SDave Kleikamp 		}
559470decc6SDave Kleikamp 
560470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
561470decc6SDave Kleikamp 
562f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
563470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
564470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
565470decc6SDave Kleikamp 		   refile-on-abort condition above. */
566470decc6SDave Kleikamp 		if (err) {
567a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
568470decc6SDave Kleikamp 			continue;
569470decc6SDave Kleikamp 		}
570470decc6SDave Kleikamp 
571470decc6SDave Kleikamp 		/*
572470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
573470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
574f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
575470decc6SDave Kleikamp 		 */
576470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
577470decc6SDave Kleikamp 
578470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
579470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
580470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
581470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
582470decc6SDave Kleikamp 
583470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
584470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
585470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
586470decc6SDave Kleikamp 
587470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
588470decc6SDave Kleikamp 		/*
589f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
590470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
591470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
592470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
593470decc6SDave Kleikamp 		 */
594470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
595f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
596470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
597470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
598470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
599470decc6SDave Kleikamp 
600470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
601470decc6SDave Kleikamp                    buffer */
602470decc6SDave Kleikamp 
603470decc6SDave Kleikamp 		tag_flag = 0;
604470decc6SDave Kleikamp 		if (flags & 1)
605f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
606470decc6SDave Kleikamp 		if (!first_tag)
607f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
608470decc6SDave Kleikamp 
609470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
610b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
611470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
612b517bea1SZach Brown 		tagp += tag_bytes;
613b517bea1SZach Brown 		space_left -= tag_bytes;
614470decc6SDave Kleikamp 
615470decc6SDave Kleikamp 		if (first_tag) {
616470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
617470decc6SDave Kleikamp 			tagp += 16;
618470decc6SDave Kleikamp 			space_left -= 16;
619470decc6SDave Kleikamp 			first_tag = 0;
620470decc6SDave Kleikamp 		}
621470decc6SDave Kleikamp 
622470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
623470decc6SDave Kleikamp 		   let the IO rip! */
624470decc6SDave Kleikamp 
625470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
626470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
627b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
628470decc6SDave Kleikamp 
629470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
630470decc6SDave Kleikamp 
631470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
632470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
633470decc6SDave Kleikamp                            the last tag we set up. */
634470decc6SDave Kleikamp 
635f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
636470decc6SDave Kleikamp 
637470decc6SDave Kleikamp start_journal_io:
638470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
639470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
640818d276cSGirish Shilamkar 				/*
641818d276cSGirish Shilamkar 				 * Compute checksum.
642818d276cSGirish Shilamkar 				 */
643818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
644818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
645818d276cSGirish Shilamkar 					crc32_sum =
646818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
647818d276cSGirish Shilamkar 				}
648818d276cSGirish Shilamkar 
649470decc6SDave Kleikamp 				lock_buffer(bh);
650470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
651470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
652470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
653470decc6SDave Kleikamp 				submit_bh(WRITE, bh);
654470decc6SDave Kleikamp 			}
655470decc6SDave Kleikamp 			cond_resched();
6568e85fb3fSJohann Lombardi 			stats.u.run.rs_blocks_logged += bufs;
657470decc6SDave Kleikamp 
658470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
659470decc6SDave Kleikamp                            time round the loop. */
660470decc6SDave Kleikamp 			descriptor = NULL;
661470decc6SDave Kleikamp 			bufs = 0;
662470decc6SDave Kleikamp 		}
663470decc6SDave Kleikamp 	}
664470decc6SDave Kleikamp 
665818d276cSGirish Shilamkar 	/* Done it all: now write the commit record asynchronously. */
666818d276cSGirish Shilamkar 
667818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
668818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
669818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
670818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
671818d276cSGirish Shilamkar 		if (err)
672818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
673818d276cSGirish Shilamkar 	}
674818d276cSGirish Shilamkar 
675c851ed54SJan Kara 	/*
676c851ed54SJan Kara 	 * This is the right place to wait for data buffers both for ASYNC
677c851ed54SJan Kara 	 * and !ASYNC commit. If commit is ASYNC, we need to wait only after
678c851ed54SJan Kara 	 * the commit block went to disk (which happens above). If commit is
679c851ed54SJan Kara 	 * SYNC, we need to wait for data buffers before we start writing
680c851ed54SJan Kara 	 * commit block, which happens below in such setting.
681c851ed54SJan Kara 	 */
682c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
683e9e34f4eSHidehiro Kawai 	if (err) {
684e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
685e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
68605496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
687e9e34f4eSHidehiro Kawai 		err = 0;
688e9e34f4eSHidehiro Kawai 	}
689c851ed54SJan Kara 
690470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
691470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
692470decc6SDave Kleikamp            complete.  Control buffers being written are on the
693470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
694470decc6SDave Kleikamp            the t_iobuf_list queue.
695470decc6SDave Kleikamp 
696470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
697470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
698470decc6SDave Kleikamp 	   so we incur less scheduling load.
699470decc6SDave Kleikamp 	*/
700470decc6SDave Kleikamp 
70187c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
702470decc6SDave Kleikamp 
703470decc6SDave Kleikamp 	/*
704470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
705470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
706470decc6SDave Kleikamp 	 */
707470decc6SDave Kleikamp wait_for_iobuf:
708470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
709470decc6SDave Kleikamp 		struct buffer_head *bh;
710470decc6SDave Kleikamp 
711470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
712470decc6SDave Kleikamp 		bh = jh2bh(jh);
713470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
714470decc6SDave Kleikamp 			wait_on_buffer(bh);
715470decc6SDave Kleikamp 			goto wait_for_iobuf;
716470decc6SDave Kleikamp 		}
717470decc6SDave Kleikamp 		if (cond_resched())
718470decc6SDave Kleikamp 			goto wait_for_iobuf;
719470decc6SDave Kleikamp 
720470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
721470decc6SDave Kleikamp 			err = -EIO;
722470decc6SDave Kleikamp 
723470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
724470decc6SDave Kleikamp 
725470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
726f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
727470decc6SDave Kleikamp 
728470decc6SDave Kleikamp 		/*
729470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
730f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
731470decc6SDave Kleikamp 		 */
732470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
733f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
734470decc6SDave Kleikamp 		__brelse(bh);
735470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
736470decc6SDave Kleikamp 		free_buffer_head(bh);
737470decc6SDave Kleikamp 
738470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
739470decc6SDave Kleikamp                    shadowed buffer */
740470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
741470decc6SDave Kleikamp 		bh = jh2bh(jh);
742470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
743470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
744470decc6SDave Kleikamp 
745470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
746470decc6SDave Kleikamp                    to remember it against this transaction so that when
747470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
748470decc6SDave Kleikamp                    required. */
749470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
750f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
751470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
752470decc6SDave Kleikamp 		   IO to complete */
753470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
754470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
755470decc6SDave Kleikamp 		__brelse(bh);
756470decc6SDave Kleikamp 	}
757470decc6SDave Kleikamp 
758470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
759470decc6SDave Kleikamp 
76087c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
761470decc6SDave Kleikamp 
762470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
763470decc6SDave Kleikamp  wait_for_ctlbuf:
764470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
765470decc6SDave Kleikamp 		struct buffer_head *bh;
766470decc6SDave Kleikamp 
767470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
768470decc6SDave Kleikamp 		bh = jh2bh(jh);
769470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
770470decc6SDave Kleikamp 			wait_on_buffer(bh);
771470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
772470decc6SDave Kleikamp 		}
773470decc6SDave Kleikamp 		if (cond_resched())
774470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
775470decc6SDave Kleikamp 
776470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
777470decc6SDave Kleikamp 			err = -EIO;
778470decc6SDave Kleikamp 
779470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
780470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
781f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
782f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
783470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
784470decc6SDave Kleikamp 		/* AKPM: bforget here */
785470decc6SDave Kleikamp 	}
786470decc6SDave Kleikamp 
78787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
788470decc6SDave Kleikamp 
789818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
790818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
791818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
792818d276cSGirish Shilamkar 						&cbh, crc32_sum);
793818d276cSGirish Shilamkar 		if (err)
794818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
795818d276cSGirish Shilamkar 	}
796b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
797818d276cSGirish Shilamkar 		err = journal_wait_on_commit_record(cbh);
798470decc6SDave Kleikamp 
799470decc6SDave Kleikamp 	if (err)
800a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
801470decc6SDave Kleikamp 
802470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
803470decc6SDave Kleikamp            processing: any buffers committed as a result of this
804470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
805470decc6SDave Kleikamp            before. */
806470decc6SDave Kleikamp 
80787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
808470decc6SDave Kleikamp 
809c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
810470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
811470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
812470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
813470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
814470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
815470decc6SDave Kleikamp 
816470decc6SDave Kleikamp restart_loop:
817470decc6SDave Kleikamp 	/*
818470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
819470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
820470decc6SDave Kleikamp 	 */
821470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
822470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
823470decc6SDave Kleikamp 		transaction_t *cp_transaction;
824470decc6SDave Kleikamp 		struct buffer_head *bh;
825470decc6SDave Kleikamp 
826470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
827470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
828470decc6SDave Kleikamp 		bh = jh2bh(jh);
829470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
830470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
831470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
832470decc6SDave Kleikamp 
833470decc6SDave Kleikamp 		/*
834470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
835470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
836470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
837470decc6SDave Kleikamp 		 * field now points to a committed version of the
838470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
839470decc6SDave Kleikamp 		 * data.
840470decc6SDave Kleikamp 		 *
841470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
842470decc6SDave Kleikamp 		 */
843470decc6SDave Kleikamp 		if (jh->b_committed_data) {
844af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
845470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
846470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
847470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
848470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
849470decc6SDave Kleikamp 			}
850470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
851af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
852470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
853470decc6SDave Kleikamp 		}
854470decc6SDave Kleikamp 
855470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
856470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
857470decc6SDave Kleikamp 		if (cp_transaction) {
858470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
8598e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
860f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
861470decc6SDave Kleikamp 		}
862470decc6SDave Kleikamp 
863470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
864470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
865f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
866470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
867470decc6SDave Kleikamp 		 * it. */
868470decc6SDave Kleikamp 
869470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
870470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
871470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
872470decc6SDave Kleikamp 		 * that buffer in the future now that the last use has
873470decc6SDave Kleikamp 		 * been committed.  That's not only a performance gain,
874470decc6SDave Kleikamp 		 * it also stops aliasing problems if the buffer is left
875470decc6SDave Kleikamp 		 * behind for writeback and gets reallocated for another
876470decc6SDave Kleikamp 		 * use in a different page. */
877470decc6SDave Kleikamp 		if (buffer_freed(bh)) {
878470decc6SDave Kleikamp 			clear_buffer_freed(bh);
879470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
880470decc6SDave Kleikamp 		}
881470decc6SDave Kleikamp 
882470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
883470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
884f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
885470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
886f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
887470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
888470decc6SDave Kleikamp 		} else {
889470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
890470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
891470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
892470decc6SDave Kleikamp 			 * could not have been reallocated until this
893470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
894470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
895470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
896470decc6SDave Kleikamp 			 * list. */
897470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
898f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
899470decc6SDave Kleikamp 			if (!jh->b_transaction) {
900470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
901470decc6SDave Kleikamp 				 /* needs a brelse */
902f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
903470decc6SDave Kleikamp 				release_buffer_page(bh);
904470decc6SDave Kleikamp 			} else
905470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
906470decc6SDave Kleikamp 		}
907470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
908470decc6SDave Kleikamp 	}
909470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
910470decc6SDave Kleikamp 	/*
911f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
912f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
913f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
914f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
915470decc6SDave Kleikamp 	 */
916470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
917470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
918470decc6SDave Kleikamp 	/*
919470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
920470decc6SDave Kleikamp 	 * while the lock was dropped...
921470decc6SDave Kleikamp 	 */
922470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
923470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
924470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
925470decc6SDave Kleikamp 		goto restart_loop;
926470decc6SDave Kleikamp 	}
927470decc6SDave Kleikamp 
928470decc6SDave Kleikamp 	/* Done with this transaction! */
929470decc6SDave Kleikamp 
93087c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
931470decc6SDave Kleikamp 
932470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
933470decc6SDave Kleikamp 
9348e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
9358e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
9368e85fb3fSJohann Lombardi 						commit_transaction->t_start);
9378e85fb3fSJohann Lombardi 
9388e85fb3fSJohann Lombardi 	/*
9398e85fb3fSJohann Lombardi 	 * File the transaction for history
9408e85fb3fSJohann Lombardi 	 */
9418e85fb3fSJohann Lombardi 	stats.ts_type = JBD2_STATS_RUN;
9428e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9438e85fb3fSJohann Lombardi 	stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
9448e85fb3fSJohann Lombardi 	spin_lock(&journal->j_history_lock);
9458e85fb3fSJohann Lombardi 	memcpy(journal->j_history + journal->j_history_cur, &stats,
9468e85fb3fSJohann Lombardi 			sizeof(stats));
9478e85fb3fSJohann Lombardi 	if (++journal->j_history_cur == journal->j_history_max)
9488e85fb3fSJohann Lombardi 		journal->j_history_cur = 0;
9498e85fb3fSJohann Lombardi 
9508e85fb3fSJohann Lombardi 	/*
9518e85fb3fSJohann Lombardi 	 * Calculate overall stats
9528e85fb3fSJohann Lombardi 	 */
9538e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
9548e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
9558e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
9568e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
9578e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
9588e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
9598e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
9608e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
9618e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
9628e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
9638e85fb3fSJohann Lombardi 
964470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
965470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
966470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
967470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
968470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
969470decc6SDave Kleikamp 
970f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
971f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
972f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
973470decc6SDave Kleikamp 	} else {
974470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
975470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
976470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
977470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
978470decc6SDave Kleikamp 		} else {
979470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
980470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
981470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
982470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
983470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
984470decc6SDave Kleikamp 				commit_transaction;
985470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
986470decc6SDave Kleikamp 				commit_transaction;
987470decc6SDave Kleikamp 		}
988470decc6SDave Kleikamp 	}
989470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
990470decc6SDave Kleikamp 
991*ede86cc4STheodore Ts'o 	trace_mark(jbd2_end_commit, "dev %s transaction %d head %d",
992*ede86cc4STheodore Ts'o 		   journal->j_devname, commit_transaction->t_tid,
993*ede86cc4STheodore Ts'o 		   journal->j_tail_sequence);
994470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
995470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
996470decc6SDave Kleikamp 
997470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
998470decc6SDave Kleikamp }
999