xref: /linux-6.15/fs/jbd2/commit.c (revision 05496769)
1470decc6SDave Kleikamp /*
2f7f4bccbSMingming Cao  * linux/fs/jbd2/commit.c
3470decc6SDave Kleikamp  *
4470decc6SDave Kleikamp  * Written by Stephen C. Tweedie <[email protected]>, 1998
5470decc6SDave Kleikamp  *
6470decc6SDave Kleikamp  * Copyright 1998 Red Hat corp --- All Rights Reserved
7470decc6SDave Kleikamp  *
8470decc6SDave Kleikamp  * This file is part of the Linux kernel and is made available under
9470decc6SDave Kleikamp  * the terms of the GNU General Public License, version 2, or at your
10470decc6SDave Kleikamp  * option, any later version, incorporated herein by reference.
11470decc6SDave Kleikamp  *
12470decc6SDave Kleikamp  * Journal commit routines for the generic filesystem journaling code;
13470decc6SDave Kleikamp  * part of the ext2fs journaling system.
14470decc6SDave Kleikamp  */
15470decc6SDave Kleikamp 
16470decc6SDave Kleikamp #include <linux/time.h>
17470decc6SDave Kleikamp #include <linux/fs.h>
18f7f4bccbSMingming Cao #include <linux/jbd2.h>
19470decc6SDave Kleikamp #include <linux/errno.h>
20470decc6SDave Kleikamp #include <linux/slab.h>
21470decc6SDave Kleikamp #include <linux/mm.h>
22470decc6SDave Kleikamp #include <linux/pagemap.h>
238e85fb3fSJohann Lombardi #include <linux/jiffies.h>
24818d276cSGirish Shilamkar #include <linux/crc32.h>
25cd1aac32SAneesh Kumar K.V #include <linux/writeback.h>
26cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h>
27470decc6SDave Kleikamp 
28470decc6SDave Kleikamp /*
29470decc6SDave Kleikamp  * Default IO end handler for temporary BJ_IO buffer_heads.
30470decc6SDave Kleikamp  */
31470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
32470decc6SDave Kleikamp {
33470decc6SDave Kleikamp 	BUFFER_TRACE(bh, "");
34470decc6SDave Kleikamp 	if (uptodate)
35470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
36470decc6SDave Kleikamp 	else
37470decc6SDave Kleikamp 		clear_buffer_uptodate(bh);
38470decc6SDave Kleikamp 	unlock_buffer(bh);
39470decc6SDave Kleikamp }
40470decc6SDave Kleikamp 
41470decc6SDave Kleikamp /*
4287c89c23SJan Kara  * When an ext4 file is truncated, it is possible that some pages are not
4387c89c23SJan Kara  * successfully freed, because they are attached to a committing transaction.
44470decc6SDave Kleikamp  * After the transaction commits, these pages are left on the LRU, with no
45470decc6SDave Kleikamp  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
46470decc6SDave Kleikamp  * by the VM, but their apparent absence upsets the VM accounting, and it makes
47470decc6SDave Kleikamp  * the numbers in /proc/meminfo look odd.
48470decc6SDave Kleikamp  *
49470decc6SDave Kleikamp  * So here, we have a buffer which has just come off the forget list.  Look to
50470decc6SDave Kleikamp  * see if we can strip all buffers from the backing page.
51470decc6SDave Kleikamp  *
52470decc6SDave Kleikamp  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
53470decc6SDave Kleikamp  * caller provided us with a ref against the buffer, and we drop that here.
54470decc6SDave Kleikamp  */
55470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh)
56470decc6SDave Kleikamp {
57470decc6SDave Kleikamp 	struct page *page;
58470decc6SDave Kleikamp 
59470decc6SDave Kleikamp 	if (buffer_dirty(bh))
60470decc6SDave Kleikamp 		goto nope;
61470decc6SDave Kleikamp 	if (atomic_read(&bh->b_count) != 1)
62470decc6SDave Kleikamp 		goto nope;
63470decc6SDave Kleikamp 	page = bh->b_page;
64470decc6SDave Kleikamp 	if (!page)
65470decc6SDave Kleikamp 		goto nope;
66470decc6SDave Kleikamp 	if (page->mapping)
67470decc6SDave Kleikamp 		goto nope;
68470decc6SDave Kleikamp 
69470decc6SDave Kleikamp 	/* OK, it's a truncated page */
70529ae9aaSNick Piggin 	if (!trylock_page(page))
71470decc6SDave Kleikamp 		goto nope;
72470decc6SDave Kleikamp 
73470decc6SDave Kleikamp 	page_cache_get(page);
74470decc6SDave Kleikamp 	__brelse(bh);
75470decc6SDave Kleikamp 	try_to_free_buffers(page);
76470decc6SDave Kleikamp 	unlock_page(page);
77470decc6SDave Kleikamp 	page_cache_release(page);
78470decc6SDave Kleikamp 	return;
79470decc6SDave Kleikamp 
80470decc6SDave Kleikamp nope:
81470decc6SDave Kleikamp 	__brelse(bh);
82470decc6SDave Kleikamp }
83470decc6SDave Kleikamp 
84470decc6SDave Kleikamp /*
85818d276cSGirish Shilamkar  * Done it all: now submit the commit record.  We should have
86470decc6SDave Kleikamp  * cleaned up our previous buffers by now, so if we are in abort
87470decc6SDave Kleikamp  * mode we can now just skip the rest of the journal write
88470decc6SDave Kleikamp  * entirely.
89470decc6SDave Kleikamp  *
90470decc6SDave Kleikamp  * Returns 1 if the journal needs to be aborted or 0 on success
91470decc6SDave Kleikamp  */
92818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal,
93818d276cSGirish Shilamkar 					transaction_t *commit_transaction,
94818d276cSGirish Shilamkar 					struct buffer_head **cbh,
95818d276cSGirish Shilamkar 					__u32 crc32_sum)
96470decc6SDave Kleikamp {
97470decc6SDave Kleikamp 	struct journal_head *descriptor;
98818d276cSGirish Shilamkar 	struct commit_header *tmp;
99470decc6SDave Kleikamp 	struct buffer_head *bh;
100818d276cSGirish Shilamkar 	int ret;
101470decc6SDave Kleikamp 	int barrier_done = 0;
102736603abSTheodore Ts'o 	struct timespec now = current_kernel_time();
103470decc6SDave Kleikamp 
104470decc6SDave Kleikamp 	if (is_journal_aborted(journal))
105470decc6SDave Kleikamp 		return 0;
106470decc6SDave Kleikamp 
107f7f4bccbSMingming Cao 	descriptor = jbd2_journal_get_descriptor_buffer(journal);
108470decc6SDave Kleikamp 	if (!descriptor)
109470decc6SDave Kleikamp 		return 1;
110470decc6SDave Kleikamp 
111470decc6SDave Kleikamp 	bh = jh2bh(descriptor);
112470decc6SDave Kleikamp 
113818d276cSGirish Shilamkar 	tmp = (struct commit_header *)bh->b_data;
114f7f4bccbSMingming Cao 	tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
115f7f4bccbSMingming Cao 	tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
116470decc6SDave Kleikamp 	tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
117736603abSTheodore Ts'o 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
118736603abSTheodore Ts'o 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
119818d276cSGirish Shilamkar 
120818d276cSGirish Shilamkar 	if (JBD2_HAS_COMPAT_FEATURE(journal,
121818d276cSGirish Shilamkar 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
122818d276cSGirish Shilamkar 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
123818d276cSGirish Shilamkar 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
124818d276cSGirish Shilamkar 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
125470decc6SDave Kleikamp 	}
126470decc6SDave Kleikamp 
127818d276cSGirish Shilamkar 	JBUFFER_TRACE(descriptor, "submit commit block");
128818d276cSGirish Shilamkar 	lock_buffer(bh);
129c4b8e635SAneesh Kumar K.V 	get_bh(bh);
130470decc6SDave Kleikamp 	set_buffer_dirty(bh);
131818d276cSGirish Shilamkar 	set_buffer_uptodate(bh);
132818d276cSGirish Shilamkar 	bh->b_end_io = journal_end_buffer_io_sync;
133818d276cSGirish Shilamkar 
134818d276cSGirish Shilamkar 	if (journal->j_flags & JBD2_BARRIER &&
1354d605179SAneesh Kumar K.V 		!JBD2_HAS_INCOMPAT_FEATURE(journal,
136818d276cSGirish Shilamkar 					 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
137470decc6SDave Kleikamp 		set_buffer_ordered(bh);
138470decc6SDave Kleikamp 		barrier_done = 1;
139470decc6SDave Kleikamp 	}
140818d276cSGirish Shilamkar 	ret = submit_bh(WRITE, bh);
141c4e35e07SDave Kleikamp 	if (barrier_done)
142c4e35e07SDave Kleikamp 		clear_buffer_ordered(bh);
143818d276cSGirish Shilamkar 
144470decc6SDave Kleikamp 	/* is it possible for another commit to fail at roughly
145470decc6SDave Kleikamp 	 * the same time as this one?  If so, we don't want to
146470decc6SDave Kleikamp 	 * trust the barrier flag in the super, but instead want
147470decc6SDave Kleikamp 	 * to remember if we sent a barrier request
148470decc6SDave Kleikamp 	 */
149470decc6SDave Kleikamp 	if (ret == -EOPNOTSUPP && barrier_done) {
150470decc6SDave Kleikamp 		printk(KERN_WARNING
151470decc6SDave Kleikamp 		       "JBD: barrier-based sync failed on %s - "
152*05496769STheodore Ts'o 		       "disabling barriers\n", journal->j_devname);
153470decc6SDave Kleikamp 		spin_lock(&journal->j_state_lock);
154f7f4bccbSMingming Cao 		journal->j_flags &= ~JBD2_BARRIER;
155470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
156470decc6SDave Kleikamp 
157470decc6SDave Kleikamp 		/* And try again, without the barrier */
158034772b0STheodore Ts'o 		lock_buffer(bh);
159470decc6SDave Kleikamp 		set_buffer_uptodate(bh);
160470decc6SDave Kleikamp 		set_buffer_dirty(bh);
161818d276cSGirish Shilamkar 		ret = submit_bh(WRITE, bh);
162470decc6SDave Kleikamp 	}
163818d276cSGirish Shilamkar 	*cbh = bh;
164818d276cSGirish Shilamkar 	return ret;
165818d276cSGirish Shilamkar }
166470decc6SDave Kleikamp 
167818d276cSGirish Shilamkar /*
168818d276cSGirish Shilamkar  * This function along with journal_submit_commit_record
169818d276cSGirish Shilamkar  * allows to write the commit record asynchronously.
170818d276cSGirish Shilamkar  */
171818d276cSGirish Shilamkar static int journal_wait_on_commit_record(struct buffer_head *bh)
172818d276cSGirish Shilamkar {
173818d276cSGirish Shilamkar 	int ret = 0;
174818d276cSGirish Shilamkar 
175818d276cSGirish Shilamkar 	clear_buffer_dirty(bh);
176818d276cSGirish Shilamkar 	wait_on_buffer(bh);
177818d276cSGirish Shilamkar 
178818d276cSGirish Shilamkar 	if (unlikely(!buffer_uptodate(bh)))
179818d276cSGirish Shilamkar 		ret = -EIO;
180818d276cSGirish Shilamkar 	put_bh(bh);            /* One for getblk() */
181818d276cSGirish Shilamkar 	jbd2_journal_put_journal_head(bh2jh(bh));
182818d276cSGirish Shilamkar 
183818d276cSGirish Shilamkar 	return ret;
184818d276cSGirish Shilamkar }
185818d276cSGirish Shilamkar 
186818d276cSGirish Shilamkar /*
187cd1aac32SAneesh Kumar K.V  * write the filemap data using writepage() address_space_operations.
188cd1aac32SAneesh Kumar K.V  * We don't do block allocation here even for delalloc. We don't
189cd1aac32SAneesh Kumar K.V  * use writepages() because with dealyed allocation we may be doing
190cd1aac32SAneesh Kumar K.V  * block allocation in writepages().
191cd1aac32SAneesh Kumar K.V  */
192cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping)
193cd1aac32SAneesh Kumar K.V {
194cd1aac32SAneesh Kumar K.V 	int ret;
195cd1aac32SAneesh Kumar K.V 	struct writeback_control wbc = {
196cd1aac32SAneesh Kumar K.V 		.sync_mode =  WB_SYNC_ALL,
197cd1aac32SAneesh Kumar K.V 		.nr_to_write = mapping->nrpages * 2,
198cd1aac32SAneesh Kumar K.V 		.range_start = 0,
199cd1aac32SAneesh Kumar K.V 		.range_end = i_size_read(mapping->host),
200cd1aac32SAneesh Kumar K.V 		.for_writepages = 1,
201cd1aac32SAneesh Kumar K.V 	};
202cd1aac32SAneesh Kumar K.V 
203cd1aac32SAneesh Kumar K.V 	ret = generic_writepages(mapping, &wbc);
204cd1aac32SAneesh Kumar K.V 	return ret;
205cd1aac32SAneesh Kumar K.V }
206cd1aac32SAneesh Kumar K.V 
207cd1aac32SAneesh Kumar K.V /*
208c851ed54SJan Kara  * Submit all the data buffers of inode associated with the transaction to
209c851ed54SJan Kara  * disk.
210c851ed54SJan Kara  *
211c851ed54SJan Kara  * We are in a committing transaction. Therefore no new inode can be added to
212c851ed54SJan Kara  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
213c851ed54SJan Kara  * operate on from being released while we write out pages.
214c851ed54SJan Kara  */
215cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal,
216c851ed54SJan Kara 		transaction_t *commit_transaction)
217c851ed54SJan Kara {
218c851ed54SJan Kara 	struct jbd2_inode *jinode;
219c851ed54SJan Kara 	int err, ret = 0;
220c851ed54SJan Kara 	struct address_space *mapping;
221c851ed54SJan Kara 
222c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
223c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
224c851ed54SJan Kara 		mapping = jinode->i_vfs_inode->i_mapping;
225c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
226c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
227cd1aac32SAneesh Kumar K.V 		/*
228cd1aac32SAneesh Kumar K.V 		 * submit the inode data buffers. We use writepage
229cd1aac32SAneesh Kumar K.V 		 * instead of writepages. Because writepages can do
230cd1aac32SAneesh Kumar K.V 		 * block allocation  with delalloc. We need to write
231cd1aac32SAneesh Kumar K.V 		 * only allocated blocks here.
232cd1aac32SAneesh Kumar K.V 		 */
233cd1aac32SAneesh Kumar K.V 		err = journal_submit_inode_data_buffers(mapping);
234c851ed54SJan Kara 		if (!ret)
235c851ed54SJan Kara 			ret = err;
236c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
237c851ed54SJan Kara 		J_ASSERT(jinode->i_transaction == commit_transaction);
238c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
239c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
240c851ed54SJan Kara 	}
241c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
242c851ed54SJan Kara 	return ret;
243c851ed54SJan Kara }
244c851ed54SJan Kara 
245c851ed54SJan Kara /*
246c851ed54SJan Kara  * Wait for data submitted for writeout, refile inodes to proper
247c851ed54SJan Kara  * transaction if needed.
248c851ed54SJan Kara  *
249c851ed54SJan Kara  */
250c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal,
251c851ed54SJan Kara 		transaction_t *commit_transaction)
252c851ed54SJan Kara {
253c851ed54SJan Kara 	struct jbd2_inode *jinode, *next_i;
254c851ed54SJan Kara 	int err, ret = 0;
255c851ed54SJan Kara 
256cd1aac32SAneesh Kumar K.V 	/* For locking, see the comment in journal_submit_data_buffers() */
257c851ed54SJan Kara 	spin_lock(&journal->j_list_lock);
258c851ed54SJan Kara 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
259c851ed54SJan Kara 		jinode->i_flags |= JI_COMMIT_RUNNING;
260c851ed54SJan Kara 		spin_unlock(&journal->j_list_lock);
261c851ed54SJan Kara 		err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
262e9e34f4eSHidehiro Kawai 		if (err) {
263e9e34f4eSHidehiro Kawai 			/*
264e9e34f4eSHidehiro Kawai 			 * Because AS_EIO is cleared by
265e9e34f4eSHidehiro Kawai 			 * wait_on_page_writeback_range(), set it again so
266e9e34f4eSHidehiro Kawai 			 * that user process can get -EIO from fsync().
267e9e34f4eSHidehiro Kawai 			 */
268e9e34f4eSHidehiro Kawai 			set_bit(AS_EIO,
269e9e34f4eSHidehiro Kawai 				&jinode->i_vfs_inode->i_mapping->flags);
270e9e34f4eSHidehiro Kawai 
271c851ed54SJan Kara 			if (!ret)
272c851ed54SJan Kara 				ret = err;
273e9e34f4eSHidehiro Kawai 		}
274c851ed54SJan Kara 		spin_lock(&journal->j_list_lock);
275c851ed54SJan Kara 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
276c851ed54SJan Kara 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
277c851ed54SJan Kara 	}
278c851ed54SJan Kara 
279c851ed54SJan Kara 	/* Now refile inode to proper lists */
280c851ed54SJan Kara 	list_for_each_entry_safe(jinode, next_i,
281c851ed54SJan Kara 				 &commit_transaction->t_inode_list, i_list) {
282c851ed54SJan Kara 		list_del(&jinode->i_list);
283c851ed54SJan Kara 		if (jinode->i_next_transaction) {
284c851ed54SJan Kara 			jinode->i_transaction = jinode->i_next_transaction;
285c851ed54SJan Kara 			jinode->i_next_transaction = NULL;
286c851ed54SJan Kara 			list_add(&jinode->i_list,
287c851ed54SJan Kara 				&jinode->i_transaction->t_inode_list);
288c851ed54SJan Kara 		} else {
289c851ed54SJan Kara 			jinode->i_transaction = NULL;
290c851ed54SJan Kara 		}
291c851ed54SJan Kara 	}
292c851ed54SJan Kara 	spin_unlock(&journal->j_list_lock);
293c851ed54SJan Kara 
294c851ed54SJan Kara 	return ret;
295c851ed54SJan Kara }
296c851ed54SJan Kara 
297818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
298818d276cSGirish Shilamkar {
299818d276cSGirish Shilamkar 	struct page *page = bh->b_page;
300818d276cSGirish Shilamkar 	char *addr;
301818d276cSGirish Shilamkar 	__u32 checksum;
302818d276cSGirish Shilamkar 
303818d276cSGirish Shilamkar 	addr = kmap_atomic(page, KM_USER0);
304818d276cSGirish Shilamkar 	checksum = crc32_be(crc32_sum,
305818d276cSGirish Shilamkar 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
306818d276cSGirish Shilamkar 	kunmap_atomic(addr, KM_USER0);
307818d276cSGirish Shilamkar 
308818d276cSGirish Shilamkar 	return checksum;
309818d276cSGirish Shilamkar }
310818d276cSGirish Shilamkar 
311818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
31218eba7aaSMingming Cao 				   unsigned long long block)
313b517bea1SZach Brown {
314b517bea1SZach Brown 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
315cd02ff0bSMingming Cao 	if (tag_bytes > JBD2_TAG_SIZE32)
316b517bea1SZach Brown 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
317b517bea1SZach Brown }
318b517bea1SZach Brown 
319470decc6SDave Kleikamp /*
320f7f4bccbSMingming Cao  * jbd2_journal_commit_transaction
321470decc6SDave Kleikamp  *
322470decc6SDave Kleikamp  * The primary function for committing a transaction to the log.  This
323470decc6SDave Kleikamp  * function is called by the journal thread to begin a complete commit.
324470decc6SDave Kleikamp  */
325f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal)
326470decc6SDave Kleikamp {
3278e85fb3fSJohann Lombardi 	struct transaction_stats_s stats;
328470decc6SDave Kleikamp 	transaction_t *commit_transaction;
329470decc6SDave Kleikamp 	struct journal_head *jh, *new_jh, *descriptor;
330470decc6SDave Kleikamp 	struct buffer_head **wbuf = journal->j_wbuf;
331470decc6SDave Kleikamp 	int bufs;
332470decc6SDave Kleikamp 	int flags;
333470decc6SDave Kleikamp 	int err;
33418eba7aaSMingming Cao 	unsigned long long blocknr;
335470decc6SDave Kleikamp 	char *tagp = NULL;
336470decc6SDave Kleikamp 	journal_header_t *header;
337470decc6SDave Kleikamp 	journal_block_tag_t *tag = NULL;
338470decc6SDave Kleikamp 	int space_left = 0;
339470decc6SDave Kleikamp 	int first_tag = 0;
340470decc6SDave Kleikamp 	int tag_flag;
341470decc6SDave Kleikamp 	int i;
342b517bea1SZach Brown 	int tag_bytes = journal_tag_bytes(journal);
343818d276cSGirish Shilamkar 	struct buffer_head *cbh = NULL; /* For transactional checksums */
344818d276cSGirish Shilamkar 	__u32 crc32_sum = ~0;
345470decc6SDave Kleikamp 
346470decc6SDave Kleikamp 	/*
347470decc6SDave Kleikamp 	 * First job: lock down the current transaction and wait for
348470decc6SDave Kleikamp 	 * all outstanding updates to complete.
349470decc6SDave Kleikamp 	 */
350470decc6SDave Kleikamp 
351470decc6SDave Kleikamp #ifdef COMMIT_STATS
352470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
353470decc6SDave Kleikamp 	summarise_journal_usage(journal);
354470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
355470decc6SDave Kleikamp #endif
356470decc6SDave Kleikamp 
357f7f4bccbSMingming Cao 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
358f7f4bccbSMingming Cao 	if (journal->j_flags & JBD2_FLUSHED) {
359470decc6SDave Kleikamp 		jbd_debug(3, "super block updated\n");
360f7f4bccbSMingming Cao 		jbd2_journal_update_superblock(journal, 1);
361470decc6SDave Kleikamp 	} else {
362470decc6SDave Kleikamp 		jbd_debug(3, "superblock not updated\n");
363470decc6SDave Kleikamp 	}
364470decc6SDave Kleikamp 
365470decc6SDave Kleikamp 	J_ASSERT(journal->j_running_transaction != NULL);
366470decc6SDave Kleikamp 	J_ASSERT(journal->j_committing_transaction == NULL);
367470decc6SDave Kleikamp 
368470decc6SDave Kleikamp 	commit_transaction = journal->j_running_transaction;
369470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
370470decc6SDave Kleikamp 
371470decc6SDave Kleikamp 	jbd_debug(1, "JBD: starting commit of transaction %d\n",
372470decc6SDave Kleikamp 			commit_transaction->t_tid);
373470decc6SDave Kleikamp 
374470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
375470decc6SDave Kleikamp 	commit_transaction->t_state = T_LOCKED;
376470decc6SDave Kleikamp 
3778e85fb3fSJohann Lombardi 	stats.u.run.rs_wait = commit_transaction->t_max_wait;
3788e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jiffies;
3798e85fb3fSJohann Lombardi 	stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
3808e85fb3fSJohann Lombardi 						stats.u.run.rs_locked);
3818e85fb3fSJohann Lombardi 
382470decc6SDave Kleikamp 	spin_lock(&commit_transaction->t_handle_lock);
383470decc6SDave Kleikamp 	while (commit_transaction->t_updates) {
384470decc6SDave Kleikamp 		DEFINE_WAIT(wait);
385470decc6SDave Kleikamp 
386470decc6SDave Kleikamp 		prepare_to_wait(&journal->j_wait_updates, &wait,
387470decc6SDave Kleikamp 					TASK_UNINTERRUPTIBLE);
388470decc6SDave Kleikamp 		if (commit_transaction->t_updates) {
389470decc6SDave Kleikamp 			spin_unlock(&commit_transaction->t_handle_lock);
390470decc6SDave Kleikamp 			spin_unlock(&journal->j_state_lock);
391470decc6SDave Kleikamp 			schedule();
392470decc6SDave Kleikamp 			spin_lock(&journal->j_state_lock);
393470decc6SDave Kleikamp 			spin_lock(&commit_transaction->t_handle_lock);
394470decc6SDave Kleikamp 		}
395470decc6SDave Kleikamp 		finish_wait(&journal->j_wait_updates, &wait);
396470decc6SDave Kleikamp 	}
397470decc6SDave Kleikamp 	spin_unlock(&commit_transaction->t_handle_lock);
398470decc6SDave Kleikamp 
399470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_outstanding_credits <=
400470decc6SDave Kleikamp 			journal->j_max_transaction_buffers);
401470decc6SDave Kleikamp 
402470decc6SDave Kleikamp 	/*
403470decc6SDave Kleikamp 	 * First thing we are allowed to do is to discard any remaining
404470decc6SDave Kleikamp 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
405470decc6SDave Kleikamp 	 * that there are no such buffers: if a large filesystem
406470decc6SDave Kleikamp 	 * operation like a truncate needs to split itself over multiple
407f7f4bccbSMingming Cao 	 * transactions, then it may try to do a jbd2_journal_restart() while
408470decc6SDave Kleikamp 	 * there are still BJ_Reserved buffers outstanding.  These must
409470decc6SDave Kleikamp 	 * be released cleanly from the current transaction.
410470decc6SDave Kleikamp 	 *
411470decc6SDave Kleikamp 	 * In this case, the filesystem must still reserve write access
412470decc6SDave Kleikamp 	 * again before modifying the buffer in the new transaction, but
413470decc6SDave Kleikamp 	 * we do not require it to remember exactly which old buffers it
414470decc6SDave Kleikamp 	 * has reserved.  This is consistent with the existing behaviour
415f7f4bccbSMingming Cao 	 * that multiple jbd2_journal_get_write_access() calls to the same
416470decc6SDave Kleikamp 	 * buffer are perfectly permissable.
417470decc6SDave Kleikamp 	 */
418470decc6SDave Kleikamp 	while (commit_transaction->t_reserved_list) {
419470decc6SDave Kleikamp 		jh = commit_transaction->t_reserved_list;
420470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "reserved, unused: refile");
421470decc6SDave Kleikamp 		/*
422f7f4bccbSMingming Cao 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
423470decc6SDave Kleikamp 		 * leave undo-committed data.
424470decc6SDave Kleikamp 		 */
425470decc6SDave Kleikamp 		if (jh->b_committed_data) {
426470decc6SDave Kleikamp 			struct buffer_head *bh = jh2bh(jh);
427470decc6SDave Kleikamp 
428470decc6SDave Kleikamp 			jbd_lock_bh_state(bh);
429af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
430470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
431470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
432470decc6SDave Kleikamp 		}
433f7f4bccbSMingming Cao 		jbd2_journal_refile_buffer(journal, jh);
434470decc6SDave Kleikamp 	}
435470decc6SDave Kleikamp 
436470decc6SDave Kleikamp 	/*
437470decc6SDave Kleikamp 	 * Now try to drop any written-back buffers from the journal's
438470decc6SDave Kleikamp 	 * checkpoint lists.  We do this *before* commit because it potentially
439470decc6SDave Kleikamp 	 * frees some memory
440470decc6SDave Kleikamp 	 */
441470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
442f7f4bccbSMingming Cao 	__jbd2_journal_clean_checkpoint_list(journal);
443470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
444470decc6SDave Kleikamp 
445470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 1\n");
446470decc6SDave Kleikamp 
447470decc6SDave Kleikamp 	/*
448470decc6SDave Kleikamp 	 * Switch to a new revoke table.
449470decc6SDave Kleikamp 	 */
450f7f4bccbSMingming Cao 	jbd2_journal_switch_revoke_table(journal);
451470decc6SDave Kleikamp 
4528e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jiffies;
4538e85fb3fSJohann Lombardi 	stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
4548e85fb3fSJohann Lombardi 					       stats.u.run.rs_flushing);
4558e85fb3fSJohann Lombardi 
456470decc6SDave Kleikamp 	commit_transaction->t_state = T_FLUSH;
457470decc6SDave Kleikamp 	journal->j_committing_transaction = commit_transaction;
458470decc6SDave Kleikamp 	journal->j_running_transaction = NULL;
459470decc6SDave Kleikamp 	commit_transaction->t_log_start = journal->j_head;
460470decc6SDave Kleikamp 	wake_up(&journal->j_wait_transaction_locked);
461470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
462470decc6SDave Kleikamp 
463470decc6SDave Kleikamp 	jbd_debug (3, "JBD: commit phase 2\n");
464470decc6SDave Kleikamp 
465470decc6SDave Kleikamp 	/*
466470decc6SDave Kleikamp 	 * Now start flushing things to disk, in the order they appear
467470decc6SDave Kleikamp 	 * on the transaction lists.  Data blocks go first.
468470decc6SDave Kleikamp 	 */
469cd1aac32SAneesh Kumar K.V 	err = journal_submit_data_buffers(journal, commit_transaction);
470c851ed54SJan Kara 	if (err)
471c851ed54SJan Kara 		jbd2_journal_abort(journal, err);
472470decc6SDave Kleikamp 
473f7f4bccbSMingming Cao 	jbd2_journal_write_revoke_records(journal, commit_transaction);
474470decc6SDave Kleikamp 
475470decc6SDave Kleikamp 	jbd_debug(3, "JBD: commit phase 2\n");
476470decc6SDave Kleikamp 
477470decc6SDave Kleikamp 	/*
478470decc6SDave Kleikamp 	 * Way to go: we have now written out all of the data for a
479470decc6SDave Kleikamp 	 * transaction!  Now comes the tricky part: we need to write out
480470decc6SDave Kleikamp 	 * metadata.  Loop over the transaction's entire buffer list:
481470decc6SDave Kleikamp 	 */
48202c471cbSMingming Cao 	spin_lock(&journal->j_state_lock);
483470decc6SDave Kleikamp 	commit_transaction->t_state = T_COMMIT;
48402c471cbSMingming Cao 	spin_unlock(&journal->j_state_lock);
485470decc6SDave Kleikamp 
4868e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jiffies;
4878e85fb3fSJohann Lombardi 	stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
4888e85fb3fSJohann Lombardi 						 stats.u.run.rs_logging);
4898e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
4908e85fb3fSJohann Lombardi 	stats.u.run.rs_blocks_logged = 0;
4918e85fb3fSJohann Lombardi 
4921dfc3220SJosef Bacik 	J_ASSERT(commit_transaction->t_nr_buffers <=
4931dfc3220SJosef Bacik 		 commit_transaction->t_outstanding_credits);
4941dfc3220SJosef Bacik 
49587c89c23SJan Kara 	err = 0;
496470decc6SDave Kleikamp 	descriptor = NULL;
497470decc6SDave Kleikamp 	bufs = 0;
498470decc6SDave Kleikamp 	while (commit_transaction->t_buffers) {
499470decc6SDave Kleikamp 
500470decc6SDave Kleikamp 		/* Find the next buffer to be journaled... */
501470decc6SDave Kleikamp 
502470decc6SDave Kleikamp 		jh = commit_transaction->t_buffers;
503470decc6SDave Kleikamp 
504470decc6SDave Kleikamp 		/* If we're in abort mode, we just un-journal the buffer and
505470decc6SDave Kleikamp 		   release it for background writing. */
506470decc6SDave Kleikamp 
507470decc6SDave Kleikamp 		if (is_journal_aborted(journal)) {
508470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "journal is aborting: refile");
509f7f4bccbSMingming Cao 			jbd2_journal_refile_buffer(journal, jh);
510470decc6SDave Kleikamp 			/* If that was the last one, we need to clean up
511470decc6SDave Kleikamp 			 * any descriptor buffers which may have been
512470decc6SDave Kleikamp 			 * already allocated, even if we are now
513470decc6SDave Kleikamp 			 * aborting. */
514470decc6SDave Kleikamp 			if (!commit_transaction->t_buffers)
515470decc6SDave Kleikamp 				goto start_journal_io;
516470decc6SDave Kleikamp 			continue;
517470decc6SDave Kleikamp 		}
518470decc6SDave Kleikamp 
519470decc6SDave Kleikamp 		/* Make sure we have a descriptor block in which to
520470decc6SDave Kleikamp 		   record the metadata buffer. */
521470decc6SDave Kleikamp 
522470decc6SDave Kleikamp 		if (!descriptor) {
523470decc6SDave Kleikamp 			struct buffer_head *bh;
524470decc6SDave Kleikamp 
525470decc6SDave Kleikamp 			J_ASSERT (bufs == 0);
526470decc6SDave Kleikamp 
527470decc6SDave Kleikamp 			jbd_debug(4, "JBD: get descriptor\n");
528470decc6SDave Kleikamp 
529f7f4bccbSMingming Cao 			descriptor = jbd2_journal_get_descriptor_buffer(journal);
530470decc6SDave Kleikamp 			if (!descriptor) {
531a7fa2bafSJan Kara 				jbd2_journal_abort(journal, -EIO);
532470decc6SDave Kleikamp 				continue;
533470decc6SDave Kleikamp 			}
534470decc6SDave Kleikamp 
535470decc6SDave Kleikamp 			bh = jh2bh(descriptor);
536470decc6SDave Kleikamp 			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
537470decc6SDave Kleikamp 				(unsigned long long)bh->b_blocknr, bh->b_data);
538470decc6SDave Kleikamp 			header = (journal_header_t *)&bh->b_data[0];
539f7f4bccbSMingming Cao 			header->h_magic     = cpu_to_be32(JBD2_MAGIC_NUMBER);
540f7f4bccbSMingming Cao 			header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
541470decc6SDave Kleikamp 			header->h_sequence  = cpu_to_be32(commit_transaction->t_tid);
542470decc6SDave Kleikamp 
543470decc6SDave Kleikamp 			tagp = &bh->b_data[sizeof(journal_header_t)];
544470decc6SDave Kleikamp 			space_left = bh->b_size - sizeof(journal_header_t);
545470decc6SDave Kleikamp 			first_tag = 1;
546470decc6SDave Kleikamp 			set_buffer_jwrite(bh);
547470decc6SDave Kleikamp 			set_buffer_dirty(bh);
548470decc6SDave Kleikamp 			wbuf[bufs++] = bh;
549470decc6SDave Kleikamp 
550470decc6SDave Kleikamp 			/* Record it so that we can wait for IO
551470decc6SDave Kleikamp                            completion later */
552470decc6SDave Kleikamp 			BUFFER_TRACE(bh, "ph3: file as descriptor");
553f7f4bccbSMingming Cao 			jbd2_journal_file_buffer(descriptor, commit_transaction,
554470decc6SDave Kleikamp 					BJ_LogCtl);
555470decc6SDave Kleikamp 		}
556470decc6SDave Kleikamp 
557470decc6SDave Kleikamp 		/* Where is the buffer to be written? */
558470decc6SDave Kleikamp 
559f7f4bccbSMingming Cao 		err = jbd2_journal_next_log_block(journal, &blocknr);
560470decc6SDave Kleikamp 		/* If the block mapping failed, just abandon the buffer
561470decc6SDave Kleikamp 		   and repeat this loop: we'll fall into the
562470decc6SDave Kleikamp 		   refile-on-abort condition above. */
563470decc6SDave Kleikamp 		if (err) {
564a7fa2bafSJan Kara 			jbd2_journal_abort(journal, err);
565470decc6SDave Kleikamp 			continue;
566470decc6SDave Kleikamp 		}
567470decc6SDave Kleikamp 
568470decc6SDave Kleikamp 		/*
569470decc6SDave Kleikamp 		 * start_this_handle() uses t_outstanding_credits to determine
570470decc6SDave Kleikamp 		 * the free space in the log, but this counter is changed
571f7f4bccbSMingming Cao 		 * by jbd2_journal_next_log_block() also.
572470decc6SDave Kleikamp 		 */
573470decc6SDave Kleikamp 		commit_transaction->t_outstanding_credits--;
574470decc6SDave Kleikamp 
575470decc6SDave Kleikamp 		/* Bump b_count to prevent truncate from stumbling over
576470decc6SDave Kleikamp                    the shadowed buffer!  @@@ This can go if we ever get
577470decc6SDave Kleikamp                    rid of the BJ_IO/BJ_Shadow pairing of buffers. */
578470decc6SDave Kleikamp 		atomic_inc(&jh2bh(jh)->b_count);
579470decc6SDave Kleikamp 
580470decc6SDave Kleikamp 		/* Make a temporary IO buffer with which to write it out
581470decc6SDave Kleikamp                    (this will requeue both the metadata buffer and the
582470decc6SDave Kleikamp                    temporary IO buffer). new_bh goes on BJ_IO*/
583470decc6SDave Kleikamp 
584470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
585470decc6SDave Kleikamp 		/*
586f7f4bccbSMingming Cao 		 * akpm: jbd2_journal_write_metadata_buffer() sets
587470decc6SDave Kleikamp 		 * new_bh->b_transaction to commit_transaction.
588470decc6SDave Kleikamp 		 * We need to clean this up before we release new_bh
589470decc6SDave Kleikamp 		 * (which is of type BJ_IO)
590470decc6SDave Kleikamp 		 */
591470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph3: write metadata");
592f7f4bccbSMingming Cao 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
593470decc6SDave Kleikamp 						      jh, &new_jh, blocknr);
594470decc6SDave Kleikamp 		set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
595470decc6SDave Kleikamp 		wbuf[bufs++] = jh2bh(new_jh);
596470decc6SDave Kleikamp 
597470decc6SDave Kleikamp 		/* Record the new block's tag in the current descriptor
598470decc6SDave Kleikamp                    buffer */
599470decc6SDave Kleikamp 
600470decc6SDave Kleikamp 		tag_flag = 0;
601470decc6SDave Kleikamp 		if (flags & 1)
602f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_ESCAPE;
603470decc6SDave Kleikamp 		if (!first_tag)
604f7f4bccbSMingming Cao 			tag_flag |= JBD2_FLAG_SAME_UUID;
605470decc6SDave Kleikamp 
606470decc6SDave Kleikamp 		tag = (journal_block_tag_t *) tagp;
607b517bea1SZach Brown 		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
608470decc6SDave Kleikamp 		tag->t_flags = cpu_to_be32(tag_flag);
609b517bea1SZach Brown 		tagp += tag_bytes;
610b517bea1SZach Brown 		space_left -= tag_bytes;
611470decc6SDave Kleikamp 
612470decc6SDave Kleikamp 		if (first_tag) {
613470decc6SDave Kleikamp 			memcpy (tagp, journal->j_uuid, 16);
614470decc6SDave Kleikamp 			tagp += 16;
615470decc6SDave Kleikamp 			space_left -= 16;
616470decc6SDave Kleikamp 			first_tag = 0;
617470decc6SDave Kleikamp 		}
618470decc6SDave Kleikamp 
619470decc6SDave Kleikamp 		/* If there's no more to do, or if the descriptor is full,
620470decc6SDave Kleikamp 		   let the IO rip! */
621470decc6SDave Kleikamp 
622470decc6SDave Kleikamp 		if (bufs == journal->j_wbufsize ||
623470decc6SDave Kleikamp 		    commit_transaction->t_buffers == NULL ||
624b517bea1SZach Brown 		    space_left < tag_bytes + 16) {
625470decc6SDave Kleikamp 
626470decc6SDave Kleikamp 			jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
627470decc6SDave Kleikamp 
628470decc6SDave Kleikamp 			/* Write an end-of-descriptor marker before
629470decc6SDave Kleikamp                            submitting the IOs.  "tag" still points to
630470decc6SDave Kleikamp                            the last tag we set up. */
631470decc6SDave Kleikamp 
632f7f4bccbSMingming Cao 			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
633470decc6SDave Kleikamp 
634470decc6SDave Kleikamp start_journal_io:
635470decc6SDave Kleikamp 			for (i = 0; i < bufs; i++) {
636470decc6SDave Kleikamp 				struct buffer_head *bh = wbuf[i];
637818d276cSGirish Shilamkar 				/*
638818d276cSGirish Shilamkar 				 * Compute checksum.
639818d276cSGirish Shilamkar 				 */
640818d276cSGirish Shilamkar 				if (JBD2_HAS_COMPAT_FEATURE(journal,
641818d276cSGirish Shilamkar 					JBD2_FEATURE_COMPAT_CHECKSUM)) {
642818d276cSGirish Shilamkar 					crc32_sum =
643818d276cSGirish Shilamkar 					    jbd2_checksum_data(crc32_sum, bh);
644818d276cSGirish Shilamkar 				}
645818d276cSGirish Shilamkar 
646470decc6SDave Kleikamp 				lock_buffer(bh);
647470decc6SDave Kleikamp 				clear_buffer_dirty(bh);
648470decc6SDave Kleikamp 				set_buffer_uptodate(bh);
649470decc6SDave Kleikamp 				bh->b_end_io = journal_end_buffer_io_sync;
650470decc6SDave Kleikamp 				submit_bh(WRITE, bh);
651470decc6SDave Kleikamp 			}
652470decc6SDave Kleikamp 			cond_resched();
6538e85fb3fSJohann Lombardi 			stats.u.run.rs_blocks_logged += bufs;
654470decc6SDave Kleikamp 
655470decc6SDave Kleikamp 			/* Force a new descriptor to be generated next
656470decc6SDave Kleikamp                            time round the loop. */
657470decc6SDave Kleikamp 			descriptor = NULL;
658470decc6SDave Kleikamp 			bufs = 0;
659470decc6SDave Kleikamp 		}
660470decc6SDave Kleikamp 	}
661470decc6SDave Kleikamp 
662818d276cSGirish Shilamkar 	/* Done it all: now write the commit record asynchronously. */
663818d276cSGirish Shilamkar 
664818d276cSGirish Shilamkar 	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
665818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
666818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
667818d276cSGirish Shilamkar 						 &cbh, crc32_sum);
668818d276cSGirish Shilamkar 		if (err)
669818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
670818d276cSGirish Shilamkar 	}
671818d276cSGirish Shilamkar 
672c851ed54SJan Kara 	/*
673c851ed54SJan Kara 	 * This is the right place to wait for data buffers both for ASYNC
674c851ed54SJan Kara 	 * and !ASYNC commit. If commit is ASYNC, we need to wait only after
675c851ed54SJan Kara 	 * the commit block went to disk (which happens above). If commit is
676c851ed54SJan Kara 	 * SYNC, we need to wait for data buffers before we start writing
677c851ed54SJan Kara 	 * commit block, which happens below in such setting.
678c851ed54SJan Kara 	 */
679c851ed54SJan Kara 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
680e9e34f4eSHidehiro Kawai 	if (err) {
681e9e34f4eSHidehiro Kawai 		printk(KERN_WARNING
682e9e34f4eSHidehiro Kawai 			"JBD2: Detected IO errors while flushing file data "
683*05496769STheodore Ts'o 		       "on %s\n", journal->j_devname);
684e9e34f4eSHidehiro Kawai 		err = 0;
685e9e34f4eSHidehiro Kawai 	}
686c851ed54SJan Kara 
687470decc6SDave Kleikamp 	/* Lo and behold: we have just managed to send a transaction to
688470decc6SDave Kleikamp            the log.  Before we can commit it, wait for the IO so far to
689470decc6SDave Kleikamp            complete.  Control buffers being written are on the
690470decc6SDave Kleikamp            transaction's t_log_list queue, and metadata buffers are on
691470decc6SDave Kleikamp            the t_iobuf_list queue.
692470decc6SDave Kleikamp 
693470decc6SDave Kleikamp 	   Wait for the buffers in reverse order.  That way we are
694470decc6SDave Kleikamp 	   less likely to be woken up until all IOs have completed, and
695470decc6SDave Kleikamp 	   so we incur less scheduling load.
696470decc6SDave Kleikamp 	*/
697470decc6SDave Kleikamp 
69887c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 3\n");
699470decc6SDave Kleikamp 
700470decc6SDave Kleikamp 	/*
701470decc6SDave Kleikamp 	 * akpm: these are BJ_IO, and j_list_lock is not needed.
702470decc6SDave Kleikamp 	 * See __journal_try_to_free_buffer.
703470decc6SDave Kleikamp 	 */
704470decc6SDave Kleikamp wait_for_iobuf:
705470decc6SDave Kleikamp 	while (commit_transaction->t_iobuf_list != NULL) {
706470decc6SDave Kleikamp 		struct buffer_head *bh;
707470decc6SDave Kleikamp 
708470decc6SDave Kleikamp 		jh = commit_transaction->t_iobuf_list->b_tprev;
709470decc6SDave Kleikamp 		bh = jh2bh(jh);
710470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
711470decc6SDave Kleikamp 			wait_on_buffer(bh);
712470decc6SDave Kleikamp 			goto wait_for_iobuf;
713470decc6SDave Kleikamp 		}
714470decc6SDave Kleikamp 		if (cond_resched())
715470decc6SDave Kleikamp 			goto wait_for_iobuf;
716470decc6SDave Kleikamp 
717470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
718470decc6SDave Kleikamp 			err = -EIO;
719470decc6SDave Kleikamp 
720470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
721470decc6SDave Kleikamp 
722470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
723f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
724470decc6SDave Kleikamp 
725470decc6SDave Kleikamp 		/*
726470decc6SDave Kleikamp 		 * ->t_iobuf_list should contain only dummy buffer_heads
727f7f4bccbSMingming Cao 		 * which were created by jbd2_journal_write_metadata_buffer().
728470decc6SDave Kleikamp 		 */
729470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "dumping temporary bh");
730f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
731470decc6SDave Kleikamp 		__brelse(bh);
732470decc6SDave Kleikamp 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
733470decc6SDave Kleikamp 		free_buffer_head(bh);
734470decc6SDave Kleikamp 
735470decc6SDave Kleikamp 		/* We also have to unlock and free the corresponding
736470decc6SDave Kleikamp                    shadowed buffer */
737470decc6SDave Kleikamp 		jh = commit_transaction->t_shadow_list->b_tprev;
738470decc6SDave Kleikamp 		bh = jh2bh(jh);
739470decc6SDave Kleikamp 		clear_bit(BH_JWrite, &bh->b_state);
740470decc6SDave Kleikamp 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
741470decc6SDave Kleikamp 
742470decc6SDave Kleikamp 		/* The metadata is now released for reuse, but we need
743470decc6SDave Kleikamp                    to remember it against this transaction so that when
744470decc6SDave Kleikamp                    we finally commit, we can do any checkpointing
745470decc6SDave Kleikamp                    required. */
746470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "file as BJ_Forget");
747f7f4bccbSMingming Cao 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
748470decc6SDave Kleikamp 		/* Wake up any transactions which were waiting for this
749470decc6SDave Kleikamp 		   IO to complete */
750470decc6SDave Kleikamp 		wake_up_bit(&bh->b_state, BH_Unshadow);
751470decc6SDave Kleikamp 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
752470decc6SDave Kleikamp 		__brelse(bh);
753470decc6SDave Kleikamp 	}
754470decc6SDave Kleikamp 
755470decc6SDave Kleikamp 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
756470decc6SDave Kleikamp 
75787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 4\n");
758470decc6SDave Kleikamp 
759470decc6SDave Kleikamp 	/* Here we wait for the revoke record and descriptor record buffers */
760470decc6SDave Kleikamp  wait_for_ctlbuf:
761470decc6SDave Kleikamp 	while (commit_transaction->t_log_list != NULL) {
762470decc6SDave Kleikamp 		struct buffer_head *bh;
763470decc6SDave Kleikamp 
764470decc6SDave Kleikamp 		jh = commit_transaction->t_log_list->b_tprev;
765470decc6SDave Kleikamp 		bh = jh2bh(jh);
766470decc6SDave Kleikamp 		if (buffer_locked(bh)) {
767470decc6SDave Kleikamp 			wait_on_buffer(bh);
768470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
769470decc6SDave Kleikamp 		}
770470decc6SDave Kleikamp 		if (cond_resched())
771470decc6SDave Kleikamp 			goto wait_for_ctlbuf;
772470decc6SDave Kleikamp 
773470decc6SDave Kleikamp 		if (unlikely(!buffer_uptodate(bh)))
774470decc6SDave Kleikamp 			err = -EIO;
775470decc6SDave Kleikamp 
776470decc6SDave Kleikamp 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
777470decc6SDave Kleikamp 		clear_buffer_jwrite(bh);
778f7f4bccbSMingming Cao 		jbd2_journal_unfile_buffer(journal, jh);
779f7f4bccbSMingming Cao 		jbd2_journal_put_journal_head(jh);
780470decc6SDave Kleikamp 		__brelse(bh);		/* One for getblk */
781470decc6SDave Kleikamp 		/* AKPM: bforget here */
782470decc6SDave Kleikamp 	}
783470decc6SDave Kleikamp 
78487c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 5\n");
785470decc6SDave Kleikamp 
786818d276cSGirish Shilamkar 	if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
787818d276cSGirish Shilamkar 		JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
788818d276cSGirish Shilamkar 		err = journal_submit_commit_record(journal, commit_transaction,
789818d276cSGirish Shilamkar 						&cbh, crc32_sum);
790818d276cSGirish Shilamkar 		if (err)
791818d276cSGirish Shilamkar 			__jbd2_journal_abort_hard(journal);
792818d276cSGirish Shilamkar 	}
793b048d846SMingming Cao 	if (!err && !is_journal_aborted(journal))
794818d276cSGirish Shilamkar 		err = journal_wait_on_commit_record(cbh);
795470decc6SDave Kleikamp 
796470decc6SDave Kleikamp 	if (err)
797a7fa2bafSJan Kara 		jbd2_journal_abort(journal, err);
798470decc6SDave Kleikamp 
799470decc6SDave Kleikamp 	/* End of a transaction!  Finally, we can do checkpoint
800470decc6SDave Kleikamp            processing: any buffers committed as a result of this
801470decc6SDave Kleikamp            transaction can be removed from any checkpoint list it was on
802470decc6SDave Kleikamp            before. */
803470decc6SDave Kleikamp 
80487c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 6\n");
805470decc6SDave Kleikamp 
806c851ed54SJan Kara 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
807470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_buffers == NULL);
808470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
809470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_iobuf_list == NULL);
810470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
811470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_log_list == NULL);
812470decc6SDave Kleikamp 
813470decc6SDave Kleikamp restart_loop:
814470decc6SDave Kleikamp 	/*
815470decc6SDave Kleikamp 	 * As there are other places (journal_unmap_buffer()) adding buffers
816470decc6SDave Kleikamp 	 * to this list we have to be careful and hold the j_list_lock.
817470decc6SDave Kleikamp 	 */
818470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
819470decc6SDave Kleikamp 	while (commit_transaction->t_forget) {
820470decc6SDave Kleikamp 		transaction_t *cp_transaction;
821470decc6SDave Kleikamp 		struct buffer_head *bh;
822470decc6SDave Kleikamp 
823470decc6SDave Kleikamp 		jh = commit_transaction->t_forget;
824470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
825470decc6SDave Kleikamp 		bh = jh2bh(jh);
826470decc6SDave Kleikamp 		jbd_lock_bh_state(bh);
827470decc6SDave Kleikamp 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction ||
828470decc6SDave Kleikamp 			jh->b_transaction == journal->j_running_transaction);
829470decc6SDave Kleikamp 
830470decc6SDave Kleikamp 		/*
831470decc6SDave Kleikamp 		 * If there is undo-protected committed data against
832470decc6SDave Kleikamp 		 * this buffer, then we can remove it now.  If it is a
833470decc6SDave Kleikamp 		 * buffer needing such protection, the old frozen_data
834470decc6SDave Kleikamp 		 * field now points to a committed version of the
835470decc6SDave Kleikamp 		 * buffer, so rotate that field to the new committed
836470decc6SDave Kleikamp 		 * data.
837470decc6SDave Kleikamp 		 *
838470decc6SDave Kleikamp 		 * Otherwise, we can just throw away the frozen data now.
839470decc6SDave Kleikamp 		 */
840470decc6SDave Kleikamp 		if (jh->b_committed_data) {
841af1e76d6SMingming Cao 			jbd2_free(jh->b_committed_data, bh->b_size);
842470decc6SDave Kleikamp 			jh->b_committed_data = NULL;
843470decc6SDave Kleikamp 			if (jh->b_frozen_data) {
844470decc6SDave Kleikamp 				jh->b_committed_data = jh->b_frozen_data;
845470decc6SDave Kleikamp 				jh->b_frozen_data = NULL;
846470decc6SDave Kleikamp 			}
847470decc6SDave Kleikamp 		} else if (jh->b_frozen_data) {
848af1e76d6SMingming Cao 			jbd2_free(jh->b_frozen_data, bh->b_size);
849470decc6SDave Kleikamp 			jh->b_frozen_data = NULL;
850470decc6SDave Kleikamp 		}
851470decc6SDave Kleikamp 
852470decc6SDave Kleikamp 		spin_lock(&journal->j_list_lock);
853470decc6SDave Kleikamp 		cp_transaction = jh->b_cp_transaction;
854470decc6SDave Kleikamp 		if (cp_transaction) {
855470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "remove from old cp transaction");
8568e85fb3fSJohann Lombardi 			cp_transaction->t_chp_stats.cs_dropped++;
857f7f4bccbSMingming Cao 			__jbd2_journal_remove_checkpoint(jh);
858470decc6SDave Kleikamp 		}
859470decc6SDave Kleikamp 
860470decc6SDave Kleikamp 		/* Only re-checkpoint the buffer_head if it is marked
861470decc6SDave Kleikamp 		 * dirty.  If the buffer was added to the BJ_Forget list
862f7f4bccbSMingming Cao 		 * by jbd2_journal_forget, it may no longer be dirty and
863470decc6SDave Kleikamp 		 * there's no point in keeping a checkpoint record for
864470decc6SDave Kleikamp 		 * it. */
865470decc6SDave Kleikamp 
866470decc6SDave Kleikamp 		/* A buffer which has been freed while still being
867470decc6SDave Kleikamp 		 * journaled by a previous transaction may end up still
868470decc6SDave Kleikamp 		 * being dirty here, but we want to avoid writing back
869470decc6SDave Kleikamp 		 * that buffer in the future now that the last use has
870470decc6SDave Kleikamp 		 * been committed.  That's not only a performance gain,
871470decc6SDave Kleikamp 		 * it also stops aliasing problems if the buffer is left
872470decc6SDave Kleikamp 		 * behind for writeback and gets reallocated for another
873470decc6SDave Kleikamp 		 * use in a different page. */
874470decc6SDave Kleikamp 		if (buffer_freed(bh)) {
875470decc6SDave Kleikamp 			clear_buffer_freed(bh);
876470decc6SDave Kleikamp 			clear_buffer_jbddirty(bh);
877470decc6SDave Kleikamp 		}
878470decc6SDave Kleikamp 
879470decc6SDave Kleikamp 		if (buffer_jbddirty(bh)) {
880470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
881f7f4bccbSMingming Cao 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
882470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile for checkpoint writeback");
883f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
884470decc6SDave Kleikamp 			jbd_unlock_bh_state(bh);
885470decc6SDave Kleikamp 		} else {
886470decc6SDave Kleikamp 			J_ASSERT_BH(bh, !buffer_dirty(bh));
887470decc6SDave Kleikamp 			/* The buffer on BJ_Forget list and not jbddirty means
888470decc6SDave Kleikamp 			 * it has been freed by this transaction and hence it
889470decc6SDave Kleikamp 			 * could not have been reallocated until this
890470decc6SDave Kleikamp 			 * transaction has committed. *BUT* it could be
891470decc6SDave Kleikamp 			 * reallocated once we have written all the data to
892470decc6SDave Kleikamp 			 * disk and before we process the buffer on BJ_Forget
893470decc6SDave Kleikamp 			 * list. */
894470decc6SDave Kleikamp 			JBUFFER_TRACE(jh, "refile or unfile freed buffer");
895f7f4bccbSMingming Cao 			__jbd2_journal_refile_buffer(jh);
896470decc6SDave Kleikamp 			if (!jh->b_transaction) {
897470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
898470decc6SDave Kleikamp 				 /* needs a brelse */
899f7f4bccbSMingming Cao 				jbd2_journal_remove_journal_head(bh);
900470decc6SDave Kleikamp 				release_buffer_page(bh);
901470decc6SDave Kleikamp 			} else
902470decc6SDave Kleikamp 				jbd_unlock_bh_state(bh);
903470decc6SDave Kleikamp 		}
904470decc6SDave Kleikamp 		cond_resched_lock(&journal->j_list_lock);
905470decc6SDave Kleikamp 	}
906470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
907470decc6SDave Kleikamp 	/*
908f5a7a6b0SJan Kara 	 * This is a bit sleazy.  We use j_list_lock to protect transition
909f5a7a6b0SJan Kara 	 * of a transaction into T_FINISHED state and calling
910f5a7a6b0SJan Kara 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
911f5a7a6b0SJan Kara 	 * other checkpointing code processing the transaction...
912470decc6SDave Kleikamp 	 */
913470decc6SDave Kleikamp 	spin_lock(&journal->j_state_lock);
914470decc6SDave Kleikamp 	spin_lock(&journal->j_list_lock);
915470decc6SDave Kleikamp 	/*
916470decc6SDave Kleikamp 	 * Now recheck if some buffers did not get attached to the transaction
917470decc6SDave Kleikamp 	 * while the lock was dropped...
918470decc6SDave Kleikamp 	 */
919470decc6SDave Kleikamp 	if (commit_transaction->t_forget) {
920470decc6SDave Kleikamp 		spin_unlock(&journal->j_list_lock);
921470decc6SDave Kleikamp 		spin_unlock(&journal->j_state_lock);
922470decc6SDave Kleikamp 		goto restart_loop;
923470decc6SDave Kleikamp 	}
924470decc6SDave Kleikamp 
925470decc6SDave Kleikamp 	/* Done with this transaction! */
926470decc6SDave Kleikamp 
92787c89c23SJan Kara 	jbd_debug(3, "JBD: commit phase 7\n");
928470decc6SDave Kleikamp 
929470decc6SDave Kleikamp 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
930470decc6SDave Kleikamp 
9318e85fb3fSJohann Lombardi 	commit_transaction->t_start = jiffies;
9328e85fb3fSJohann Lombardi 	stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
9338e85fb3fSJohann Lombardi 						commit_transaction->t_start);
9348e85fb3fSJohann Lombardi 
9358e85fb3fSJohann Lombardi 	/*
9368e85fb3fSJohann Lombardi 	 * File the transaction for history
9378e85fb3fSJohann Lombardi 	 */
9388e85fb3fSJohann Lombardi 	stats.ts_type = JBD2_STATS_RUN;
9398e85fb3fSJohann Lombardi 	stats.ts_tid = commit_transaction->t_tid;
9408e85fb3fSJohann Lombardi 	stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
9418e85fb3fSJohann Lombardi 	spin_lock(&journal->j_history_lock);
9428e85fb3fSJohann Lombardi 	memcpy(journal->j_history + journal->j_history_cur, &stats,
9438e85fb3fSJohann Lombardi 			sizeof(stats));
9448e85fb3fSJohann Lombardi 	if (++journal->j_history_cur == journal->j_history_max)
9458e85fb3fSJohann Lombardi 		journal->j_history_cur = 0;
9468e85fb3fSJohann Lombardi 
9478e85fb3fSJohann Lombardi 	/*
9488e85fb3fSJohann Lombardi 	 * Calculate overall stats
9498e85fb3fSJohann Lombardi 	 */
9508e85fb3fSJohann Lombardi 	journal->j_stats.ts_tid++;
9518e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
9528e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
9538e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
9548e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
9558e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
9568e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
9578e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
9588e85fb3fSJohann Lombardi 	journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
9598e85fb3fSJohann Lombardi 	spin_unlock(&journal->j_history_lock);
9608e85fb3fSJohann Lombardi 
961470decc6SDave Kleikamp 	commit_transaction->t_state = T_FINISHED;
962470decc6SDave Kleikamp 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
963470decc6SDave Kleikamp 	journal->j_commit_sequence = commit_transaction->t_tid;
964470decc6SDave Kleikamp 	journal->j_committing_transaction = NULL;
965470decc6SDave Kleikamp 	spin_unlock(&journal->j_state_lock);
966470decc6SDave Kleikamp 
967f89b7795SJan Kara 	if (commit_transaction->t_checkpoint_list == NULL &&
968f89b7795SJan Kara 	    commit_transaction->t_checkpoint_io_list == NULL) {
969f7f4bccbSMingming Cao 		__jbd2_journal_drop_transaction(journal, commit_transaction);
970470decc6SDave Kleikamp 	} else {
971470decc6SDave Kleikamp 		if (journal->j_checkpoint_transactions == NULL) {
972470decc6SDave Kleikamp 			journal->j_checkpoint_transactions = commit_transaction;
973470decc6SDave Kleikamp 			commit_transaction->t_cpnext = commit_transaction;
974470decc6SDave Kleikamp 			commit_transaction->t_cpprev = commit_transaction;
975470decc6SDave Kleikamp 		} else {
976470decc6SDave Kleikamp 			commit_transaction->t_cpnext =
977470decc6SDave Kleikamp 				journal->j_checkpoint_transactions;
978470decc6SDave Kleikamp 			commit_transaction->t_cpprev =
979470decc6SDave Kleikamp 				commit_transaction->t_cpnext->t_cpprev;
980470decc6SDave Kleikamp 			commit_transaction->t_cpnext->t_cpprev =
981470decc6SDave Kleikamp 				commit_transaction;
982470decc6SDave Kleikamp 			commit_transaction->t_cpprev->t_cpnext =
983470decc6SDave Kleikamp 				commit_transaction;
984470decc6SDave Kleikamp 		}
985470decc6SDave Kleikamp 	}
986470decc6SDave Kleikamp 	spin_unlock(&journal->j_list_lock);
987470decc6SDave Kleikamp 
988470decc6SDave Kleikamp 	jbd_debug(1, "JBD: commit %d complete, head %d\n",
989470decc6SDave Kleikamp 		  journal->j_commit_sequence, journal->j_tail_sequence);
990470decc6SDave Kleikamp 
991470decc6SDave Kleikamp 	wake_up(&journal->j_wait_done_commit);
992470decc6SDave Kleikamp }
993