VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
f51667685749e (Theodore Ts'o              2017-12-17 22:00:59 -0500    1) // SPDX-License-Identifier: GPL-2.0+
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    2) /*
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700    3)  * linux/fs/jbd2/commit.c
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    4)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    5)  * Written by Stephen C. Tweedie <sct@redhat.com>, 1998
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    6)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    7)  * Copyright 1998 Red Hat corp --- All Rights Reserved
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    8)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700    9)  * Journal commit routines for the generic filesystem journaling code;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   10)  * part of the ext2fs journaling system.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   11)  */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   12) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   13) #include <linux/time.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   14) #include <linux/fs.h>
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700   15) #include <linux/jbd2.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   16) #include <linux/errno.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   17) #include <linux/slab.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   18) #include <linux/mm.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   19) #include <linux/pagemap.h>
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500   20) #include <linux/jiffies.h>
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500   21) #include <linux/crc32.h>
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400   22) #include <linux/writeback.h>
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400   23) #include <linux/backing-dev.h>
fd98496f467b3 (Theodore Ts'o              2009-01-05 21:34:13 -0500   24) #include <linux/bio.h>
0e3d2a6313d03 (Theodore Ts'o              2009-09-11 09:30:12 -0400   25) #include <linux/blkdev.h>
39e3ac2599a5f (Brian King                 2010-10-27 21:25:12 -0400   26) #include <linux/bitops.h>
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400   27) #include <trace/events/jbd2.h>
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   28) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   29) /*
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   30)  * IO end handler for temporary buffer_heads handling writes to the journal.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   31)  */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   32) static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   33) {
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   34) 	struct buffer_head *orig_bh = bh->b_private;
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   35) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   36) 	BUFFER_TRACE(bh, "");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   37) 	if (uptodate)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   38) 		set_buffer_uptodate(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   39) 	else
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   40) 		clear_buffer_uptodate(bh);
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   41) 	if (orig_bh) {
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   42) 		clear_bit_unlock(BH_Shadow, &orig_bh->b_state);
4e857c58efeb9 (Peter Zijlstra             2014-03-17 18:06:10 +0100   43) 		smp_mb__after_atomic();
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   44) 		wake_up_bit(&orig_bh->b_state, BH_Shadow);
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400   45) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   46) 	unlock_buffer(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   47) }
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   48) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   49) /*
87c89c232c8f7 (Jan Kara                   2008-07-11 19:27:31 -0400   50)  * When an ext4 file is truncated, it is possible that some pages are not
87c89c232c8f7 (Jan Kara                   2008-07-11 19:27:31 -0400   51)  * successfully freed, because they are attached to a committing transaction.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   52)  * After the transaction commits, these pages are left on the LRU, with no
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   53)  * ->mapping, and with attached buffers.  These pages are trivially reclaimable
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   54)  * by the VM, but their apparent absence upsets the VM accounting, and it makes
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   55)  * the numbers in /proc/meminfo look odd.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   56)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   57)  * So here, we have a buffer which has just come off the forget list.  Look to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   58)  * see if we can strip all buffers from the backing page.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   59)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   60)  * Called under lock_journal(), and possibly under journal_datalist_lock.  The
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   61)  * caller provided us with a ref against the buffer, and we drop that here.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   62)  */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   63) static void release_buffer_page(struct buffer_head *bh)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   64) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   65) 	struct page *page;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   66) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   67) 	if (buffer_dirty(bh))
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   68) 		goto nope;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   69) 	if (atomic_read(&bh->b_count) != 1)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   70) 		goto nope;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   71) 	page = bh->b_page;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   72) 	if (!page)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   73) 		goto nope;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   74) 	if (page->mapping)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   75) 		goto nope;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   76) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   77) 	/* OK, it's a truncated page */
529ae9aaa0837 (Nicholas Piggin            2008-08-02 12:01:03 +0200   78) 	if (!trylock_page(page))
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   79) 		goto nope;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   80) 
09cbfeaf1a5a6 (Kirill A. Shutemov         2016-04-01 15:29:47 +0300   81) 	get_page(page);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   82) 	__brelse(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   83) 	try_to_free_buffers(page);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   84) 	unlock_page(page);
09cbfeaf1a5a6 (Kirill A. Shutemov         2016-04-01 15:29:47 +0300   85) 	put_page(page);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   86) 	return;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   87) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   88) nope:
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   89) 	__brelse(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   90) }
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700   91) 
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400   92) static void jbd2_commit_block_csum_set(journal_t *j, struct buffer_head *bh)
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   93) {
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   94) 	struct commit_header *h;
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   95) 	__u32 csum;
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   96) 
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400   97) 	if (!jbd2_journal_has_csum_v2or3(j))
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   98) 		return;
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400   99) 
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  100) 	h = (struct commit_header *)(bh->b_data);
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  101) 	h->h_chksum_type = 0;
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  102) 	h->h_chksum_size = 0;
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  103) 	h->h_chksum[0] = 0;
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  104) 	csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  105) 	h->h_chksum[0] = cpu_to_be32(csum);
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  106) }
1f56c5890e3e8 (Darrick J. Wong            2012-05-27 08:10:25 -0400  107) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  108) /*
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  109)  * Done it all: now submit the commit record.  We should have
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  110)  * cleaned up our previous buffers by now, so if we are in abort
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  111)  * mode we can now just skip the rest of the journal write
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  112)  * entirely.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  113)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  114)  * Returns 1 if the journal needs to be aborted or 0 on success
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  115)  */
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  116) static int journal_submit_commit_record(journal_t *journal,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  117) 					transaction_t *commit_transaction,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  118) 					struct buffer_head **cbh,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  119) 					__u32 crc32_sum)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  120) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  121) 	struct commit_header *tmp;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  122) 	struct buffer_head *bh;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  123) 	int ret;
b42d1d6b5b789 (Arnd Bergmann              2018-07-29 15:51:47 -0400  124) 	struct timespec64 now;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  125) 
6cba611e600de (Zhang Huan                 2011-04-05 19:16:20 -0400  126) 	*cbh = NULL;
6cba611e600de (Zhang Huan                 2011-04-05 19:16:20 -0400  127) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  128) 	if (is_journal_aborted(journal))
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  129) 		return 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  130) 
32ab671599a89 (Jan Kara                   2016-02-22 23:17:15 -0500  131) 	bh = jbd2_journal_get_descriptor_buffer(commit_transaction,
32ab671599a89 (Jan Kara                   2016-02-22 23:17:15 -0500  132) 						JBD2_COMMIT_BLOCK);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  133) 	if (!bh)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  134) 		return 1;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  135) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  136) 	tmp = (struct commit_header *)bh->b_data;
b42d1d6b5b789 (Arnd Bergmann              2018-07-29 15:51:47 -0400  137) 	ktime_get_coarse_real_ts64(&now);
736603ab29750 (Theodore Ts'o              2008-07-11 19:27:31 -0400  138) 	tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
736603ab29750 (Theodore Ts'o              2008-07-11 19:27:31 -0400  139) 	tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  140) 
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  141) 	if (jbd2_has_feature_checksum(journal)) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  142) 		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  143) 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  144) 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  145) 	}
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  146) 	jbd2_commit_block_csum_set(journal, bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  147) 
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  148) 	BUFFER_TRACE(bh, "submit commit block");
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  149) 	lock_buffer(bh);
45a90bfd90c12 (Theodore Ts'o              2008-10-06 12:04:02 -0400  150) 	clear_buffer_dirty(bh);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  151) 	set_buffer_uptodate(bh);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  152) 	bh->b_end_io = journal_end_buffer_io_sync;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  153) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  154) 	if (journal->j_flags & JBD2_BARRIER &&
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  155) 	    !jbd2_has_feature_async_commit(journal))
70fd76140a6cb (Christoph Hellwig          2016-11-01 07:40:10 -0600  156) 		ret = submit_bh(REQ_OP_WRITE,
70fd76140a6cb (Christoph Hellwig          2016-11-01 07:40:10 -0600  157) 			REQ_SYNC | REQ_PREFLUSH | REQ_FUA, bh);
9c35575bbe6b1 (Christoph Hellwig          2010-08-18 05:29:17 -0400  158) 	else
70fd76140a6cb (Christoph Hellwig          2016-11-01 07:40:10 -0600  159) 		ret = submit_bh(REQ_OP_WRITE, REQ_SYNC, bh);
9c35575bbe6b1 (Christoph Hellwig          2010-08-18 05:29:17 -0400  160) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  161) 	*cbh = bh;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  162) 	return ret;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  163) }
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  164) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  165) /*
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  166)  * This function along with journal_submit_commit_record
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  167)  * allows to write the commit record asynchronously.
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  168)  */
fd98496f467b3 (Theodore Ts'o              2009-01-05 21:34:13 -0500  169) static int journal_wait_on_commit_record(journal_t *journal,
fd98496f467b3 (Theodore Ts'o              2009-01-05 21:34:13 -0500  170) 					 struct buffer_head *bh)
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  171) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  172) 	int ret = 0;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  173) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  174) 	clear_buffer_dirty(bh);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  175) 	wait_on_buffer(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  176) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  177) 	if (unlikely(!buffer_uptodate(bh)))
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  178) 		ret = -EIO;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  179) 	put_bh(bh);            /* One for getblk() */
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  180) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  181) 	return ret;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  182) }
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  183) 
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  184) /*
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  185)  * write the filemap data using writepage() address_space_operations.
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  186)  * We don't do block allocation here even for delalloc. We don't
a49773064bc22 (Liu Song                   2019-05-30 15:15:57 -0400  187)  * use writepages() because with delayed allocation we may be doing
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  188)  * block allocation in writepages().
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  189)  */
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  190) int jbd2_journal_submit_inode_data_buffers(struct jbd2_inode *jinode)
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  191) {
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  192) 	struct address_space *mapping = jinode->i_vfs_inode->i_mapping;
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  193) 	struct writeback_control wbc = {
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  194) 		.sync_mode =  WB_SYNC_ALL,
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  195) 		.nr_to_write = mapping->nrpages * 2,
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  196) 		.range_start = jinode->i_dirty_start,
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  197) 		.range_end = jinode->i_dirty_end,
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  198) 	};
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  199) 
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  200) 	/*
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  201) 	 * submit the inode data buffers. We use writepage
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  202) 	 * instead of writepages. Because writepages can do
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  203) 	 * block allocation with delalloc. We need to write
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  204) 	 * only allocated blocks here.
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  205) 	 */
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  206) 	return generic_writepages(mapping, &wbc);
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  207) }
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  208) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  209) /* Send all the data buffers related to an inode */
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  210) int jbd2_submit_inode_data(struct jbd2_inode *jinode)
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  211) {
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  212) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  213) 	if (!jinode || !(jinode->i_flags & JI_WRITE_DATA))
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  214) 		return 0;
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  215) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  216) 	trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  217) 	return jbd2_journal_submit_inode_data_buffers(jinode);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  218) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  219) }
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  220) EXPORT_SYMBOL(jbd2_submit_inode_data);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  221) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  222) int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode)
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  223) {
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  224) 	if (!jinode || !(jinode->i_flags & JI_WAIT_DATA) ||
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  225) 		!jinode->i_vfs_inode || !jinode->i_vfs_inode->i_mapping)
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  226) 		return 0;
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  227) 	return filemap_fdatawait_range_keep_errors(
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  228) 		jinode->i_vfs_inode->i_mapping, jinode->i_dirty_start,
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  229) 		jinode->i_dirty_end);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  230) }
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  231) EXPORT_SYMBOL(jbd2_wait_inode_data);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  232) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  233) /*
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  234)  * Submit all the data buffers of inode associated with the transaction to
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  235)  * disk.
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  236)  *
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  237)  * We are in a committing transaction. Therefore no new inode can be added to
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  238)  * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  239)  * operate on from being released while we write out pages.
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  240)  */
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  241) static int journal_submit_data_buffers(journal_t *journal,
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  242) 		transaction_t *commit_transaction)
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  243) {
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  244) 	struct jbd2_inode *jinode;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  245) 	int err, ret = 0;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  246) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  247) 	spin_lock(&journal->j_list_lock);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  248) 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
41617e1a8dec9 (Jan Kara                   2016-04-24 00:56:07 -0400  249) 		if (!(jinode->i_flags & JI_WRITE_DATA))
41617e1a8dec9 (Jan Kara                   2016-04-24 00:56:07 -0400  250) 			continue;
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  251) 		jinode->i_flags |= JI_COMMIT_RUNNING;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  252) 		spin_unlock(&journal->j_list_lock);
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  253) 		/* submit the inode data buffers. */
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400  254) 		trace_jbd2_submit_inode_data(jinode->i_vfs_inode);
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  255) 		if (journal->j_submit_inode_data_buffers) {
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  256) 			err = journal->j_submit_inode_data_buffers(jinode);
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  257) 			if (!ret)
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  258) 				ret = err;
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  259) 		}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  260) 		spin_lock(&journal->j_list_lock);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  261) 		J_ASSERT(jinode->i_transaction == commit_transaction);
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  262) 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  263) 		smp_mb();
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  264) 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  265) 	}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  266) 	spin_unlock(&journal->j_list_lock);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  267) 	return ret;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  268) }
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  269) 
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  270) int jbd2_journal_finish_inode_data_buffers(struct jbd2_inode *jinode)
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  271) {
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  272) 	struct address_space *mapping = jinode->i_vfs_inode->i_mapping;
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  273) 
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  274) 	return filemap_fdatawait_range_keep_errors(mapping,
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  275) 						   jinode->i_dirty_start,
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  276) 						   jinode->i_dirty_end);
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  277) }
aa3c0c61f62d6 (Mauricio Faria de Oliveira 2020-10-05 21:48:38 -0300  278) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  279) /*
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  280)  * Wait for data submitted for writeout, refile inodes to proper
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  281)  * transaction if needed.
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  282)  *
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  283)  */
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  284) static int journal_finish_inode_data_buffers(journal_t *journal,
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  285) 		transaction_t *commit_transaction)
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  286) {
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  287) 	struct jbd2_inode *jinode, *next_i;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  288) 	int err, ret = 0;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  289) 
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  290) 	/* For locking, see the comment in journal_submit_data_buffers() */
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  291) 	spin_lock(&journal->j_list_lock);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  292) 	list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
41617e1a8dec9 (Jan Kara                   2016-04-24 00:56:07 -0400  293) 		if (!(jinode->i_flags & JI_WAIT_DATA))
41617e1a8dec9 (Jan Kara                   2016-04-24 00:56:07 -0400  294) 			continue;
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  295) 		jinode->i_flags |= JI_COMMIT_RUNNING;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  296) 		spin_unlock(&journal->j_list_lock);
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  297) 		/* wait for the inode data buffers writeout. */
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  298) 		if (journal->j_finish_inode_data_buffers) {
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  299) 			err = journal->j_finish_inode_data_buffers(jinode);
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  300) 			if (!ret)
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  301) 				ret = err;
342af94ec6c02 (Mauricio Faria de Oliveira 2020-10-05 21:48:39 -0300  302) 		}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  303) 		spin_lock(&journal->j_list_lock);
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  304) 		jinode->i_flags &= ~JI_COMMIT_RUNNING;
cb0d9d47a39de (Jan Kara                   2016-02-22 23:20:30 -0500  305) 		smp_mb();
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  306) 		wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  307) 	}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  308) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  309) 	/* Now refile inode to proper lists */
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  310) 	list_for_each_entry_safe(jinode, next_i,
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  311) 				 &commit_transaction->t_inode_list, i_list) {
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  312) 		list_del(&jinode->i_list);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  313) 		if (jinode->i_next_transaction) {
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  314) 			jinode->i_transaction = jinode->i_next_transaction;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  315) 			jinode->i_next_transaction = NULL;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  316) 			list_add(&jinode->i_list,
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  317) 				&jinode->i_transaction->t_inode_list);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  318) 		} else {
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  319) 			jinode->i_transaction = NULL;
6ba0e7dc64a5a (Ross Zwisler               2019-06-20 17:24:56 -0400  320) 			jinode->i_dirty_start = 0;
6ba0e7dc64a5a (Ross Zwisler               2019-06-20 17:24:56 -0400  321) 			jinode->i_dirty_end = 0;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  322) 		}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  323) 	}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  324) 	spin_unlock(&journal->j_list_lock);
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  325) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  326) 	return ret;
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  327) }
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  328) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  329) static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  330) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  331) 	struct page *page = bh->b_page;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  332) 	char *addr;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  333) 	__u32 checksum;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  334) 
303a8f2afc7ba (Cong Wang                  2011-11-25 23:14:31 +0800  335) 	addr = kmap_atomic(page);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  336) 	checksum = crc32_be(crc32_sum,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  337) 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
303a8f2afc7ba (Cong Wang                  2011-11-25 23:14:31 +0800  338) 	kunmap_atomic(addr);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  339) 
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  340) 	return checksum;
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  341) }
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  342) 
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  343) static void write_tag_block(journal_t *j, journal_block_tag_t *tag,
18eba7aae080d (Mingming Cao               2006-10-11 01:21:13 -0700  344) 				   unsigned long long block)
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  345) {
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  346) 	tag->t_blocknr = cpu_to_be32(block & (u32)~0);
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  347) 	if (jbd2_has_feature_64bit(j))
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  348) 		tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  349) }
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  350) 
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  351) static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  352) 				    struct buffer_head *bh, __u32 sequence)
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  353) {
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  354) 	journal_block_tag3_t *tag3 = (journal_block_tag3_t *)tag;
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  355) 	struct page *page = bh->b_page;
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  356) 	__u8 *addr;
eee06c5678449 (Darrick J. Wong            2013-05-28 07:31:59 -0400  357) 	__u32 csum32;
18a6ea1e5cc88 (Darrick J. Wong            2013-08-28 14:59:58 -0400  358) 	__be32 seq;
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  359) 
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  360) 	if (!jbd2_journal_has_csum_v2or3(j))
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  361) 		return;
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  362) 
18a6ea1e5cc88 (Darrick J. Wong            2013-08-28 14:59:58 -0400  363) 	seq = cpu_to_be32(sequence);
906adea1536fe (Cong Wang                  2012-06-23 11:24:48 +0800  364) 	addr = kmap_atomic(page);
18a6ea1e5cc88 (Darrick J. Wong            2013-08-28 14:59:58 -0400  365) 	csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
eee06c5678449 (Darrick J. Wong            2013-05-28 07:31:59 -0400  366) 	csum32 = jbd2_chksum(j, csum32, addr + offset_in_page(bh->b_data),
eee06c5678449 (Darrick J. Wong            2013-05-28 07:31:59 -0400  367) 			     bh->b_size);
906adea1536fe (Cong Wang                  2012-06-23 11:24:48 +0800  368) 	kunmap_atomic(addr);
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  369) 
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  370) 	if (jbd2_has_feature_csum3(j))
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  371) 		tag3->t_checksum = cpu_to_be32(csum32);
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  372) 	else
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  373) 		tag->t_checksum = cpu_to_be16(csum32);
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  374) }
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  375) /*
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  376)  * jbd2_journal_commit_transaction
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  377)  *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  378)  * The primary function for committing a transaction to the log.  This
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  379)  * function is called by the journal thread to begin a complete commit.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  380)  */
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  381) void jbd2_journal_commit_transaction(journal_t *journal)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  382) {
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500  383) 	struct transaction_stats_s stats;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  384) 	transaction_t *commit_transaction;
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  385) 	struct journal_head *jh;
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  386) 	struct buffer_head *descriptor;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  387) 	struct buffer_head **wbuf = journal->j_wbuf;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  388) 	int bufs;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  389) 	int flags;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  390) 	int err;
18eba7aae080d (Mingming Cao               2006-10-11 01:21:13 -0700  391) 	unsigned long long blocknr;
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500  392) 	ktime_t start_time;
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500  393) 	u64 commit_time;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  394) 	char *tagp = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  395) 	journal_block_tag_t *tag = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  396) 	int space_left = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  397) 	int first_tag = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  398) 	int tag_flag;
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400  399) 	int i;
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  400) 	int tag_bytes = journal_tag_bytes(journal);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  401) 	struct buffer_head *cbh = NULL; /* For transactional checksums */
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  402) 	__u32 crc32_sum = ~0;
82f04ab47e1d9 (Jens Axboe                 2011-03-17 11:01:52 +0100  403) 	struct blk_plug plug;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  404) 	/* Tail of the journal */
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  405) 	unsigned long first_block;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  406) 	tid_t first_tid;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  407) 	int update_tail;
3caa487f53f65 (Darrick J. Wong            2012-05-27 08:10:22 -0400  408) 	int csum_size = 0;
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  409) 	LIST_HEAD(io_bufs);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  410) 	LIST_HEAD(log_bufs);
3caa487f53f65 (Darrick J. Wong            2012-05-27 08:10:22 -0400  411) 
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  412) 	if (jbd2_journal_has_csum_v2or3(journal))
3caa487f53f65 (Darrick J. Wong            2012-05-27 08:10:22 -0400  413) 		csum_size = sizeof(struct jbd2_journal_block_tail);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  414) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  415) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  416) 	 * First job: lock down the current transaction and wait for
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  417) 	 * all outstanding updates to complete.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  418) 	 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  419) 
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  420) 	/* Do we need to erase the effects of a prior jbd2_journal_flush? */
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  421) 	if (journal->j_flags & JBD2_FLUSHED) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  422) 		jbd_debug(3, "super block updated\n");
6fa7aa50b2c48 (Tejun Heo                  2016-10-28 12:58:12 -0400  423) 		mutex_lock_io(&journal->j_checkpoint_mutex);
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  424) 		/*
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  425) 		 * We hold j_checkpoint_mutex so tail cannot change under us.
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  426) 		 * We don't need any special data guarantees for writing sb
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  427) 		 * since journal is empty and it is ok for write to be
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  428) 		 * flushed only with transaction commit.
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  429) 		 */
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  430) 		jbd2_journal_update_sb_log_tail(journal,
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  431) 						journal->j_tail_sequence,
79feb521a4470 (Jan Kara                   2012-03-13 22:22:54 -0400  432) 						journal->j_tail,
70fd76140a6cb (Christoph Hellwig          2016-11-01 07:40:10 -0600  433) 						REQ_SYNC);
a78bb11d7acd5 (Jan Kara                   2012-03-13 15:43:04 -0400  434) 		mutex_unlock(&journal->j_checkpoint_mutex);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  435) 	} else {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  436) 		jbd_debug(3, "superblock not updated\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  437) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  438) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  439) 	J_ASSERT(journal->j_running_transaction != NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  440) 	J_ASSERT(journal->j_committing_transaction == NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  441) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  442) 	write_lock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  443) 	journal->j_flags |= JBD2_FULL_COMMIT_ONGOING;
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  444) 	while (journal->j_flags & JBD2_FAST_COMMIT_ONGOING) {
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  445) 		DEFINE_WAIT(wait);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  446) 
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  447) 		prepare_to_wait(&journal->j_fc_wait, &wait,
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  448) 				TASK_UNINTERRUPTIBLE);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  449) 		write_unlock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  450) 		schedule();
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  451) 		write_lock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  452) 		finish_wait(&journal->j_fc_wait, &wait);
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  453) 		/*
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  454) 		 * TODO: by blocking fast commits here, we are increasing
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  455) 		 * fsync() latency slightly. Strictly speaking, we don't need
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  456) 		 * to block fast commits until the transaction enters T_FLUSH
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  457) 		 * state. So an optimization is possible where we block new fast
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  458) 		 * commits here and wait for existing ones to complete
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  459) 		 * just before we enter T_FLUSH. That way, the existing fast
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  460) 		 * commits and this full commit can proceed parallely.
cc80586a57f70 (Harshad Shirwadkar         2020-11-05 19:58:59 -0800  461) 		 */
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  462) 	}
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  463) 	write_unlock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  464) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  465) 	commit_transaction = journal->j_running_transaction;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  466) 
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400  467) 	trace_jbd2_start_commit(journal, commit_transaction);
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  468) 	jbd_debug(1, "JBD2: starting commit of transaction %d\n",
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  469) 			commit_transaction->t_tid);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  470) 
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  471) 	write_lock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700  472) 	journal->j_fc_off = 0;
3ca841c106fd6 (Paul Gortmaker             2013-06-12 22:46:35 -0400  473) 	J_ASSERT(commit_transaction->t_state == T_RUNNING);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  474) 	commit_transaction->t_state = T_LOCKED;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  475) 
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400  476) 	trace_jbd2_commit_locking(journal, commit_transaction);
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  477) 	stats.run.rs_wait = commit_transaction->t_max_wait;
9fff24aa2c5c5 (Theodore Ts'o              2013-02-06 22:30:23 -0500  478) 	stats.run.rs_request_delay = 0;
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  479) 	stats.run.rs_locked = jiffies;
9fff24aa2c5c5 (Theodore Ts'o              2013-02-06 22:30:23 -0500  480) 	if (commit_transaction->t_requested)
9fff24aa2c5c5 (Theodore Ts'o              2013-02-06 22:30:23 -0500  481) 		stats.run.rs_request_delay =
9fff24aa2c5c5 (Theodore Ts'o              2013-02-06 22:30:23 -0500  482) 			jbd2_time_diff(commit_transaction->t_requested,
9fff24aa2c5c5 (Theodore Ts'o              2013-02-06 22:30:23 -0500  483) 				       stats.run.rs_locked);
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  484) 	stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  485) 					      stats.run.rs_locked);
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500  486) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  487) 	spin_lock(&commit_transaction->t_handle_lock);
a51dca9cd3bb4 (Theodore Ts'o              2010-08-02 08:43:25 -0400  488) 	while (atomic_read(&commit_transaction->t_updates)) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  489) 		DEFINE_WAIT(wait);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  490) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  491) 		prepare_to_wait(&journal->j_wait_updates, &wait,
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  492) 					TASK_UNINTERRUPTIBLE);
a51dca9cd3bb4 (Theodore Ts'o              2010-08-02 08:43:25 -0400  493) 		if (atomic_read(&commit_transaction->t_updates)) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  494) 			spin_unlock(&commit_transaction->t_handle_lock);
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  495) 			write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  496) 			schedule();
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  497) 			write_lock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  498) 			spin_lock(&commit_transaction->t_handle_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  499) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  500) 		finish_wait(&journal->j_wait_updates, &wait);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  501) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  502) 	spin_unlock(&commit_transaction->t_handle_lock);
96f1e09745750 (Jan Kara                   2018-12-03 23:16:07 -0500  503) 	commit_transaction->t_state = T_SWITCH;
96f1e09745750 (Jan Kara                   2018-12-03 23:16:07 -0500  504) 	write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  505) 
a51dca9cd3bb4 (Theodore Ts'o              2010-08-02 08:43:25 -0400  506) 	J_ASSERT (atomic_read(&commit_transaction->t_outstanding_credits) <=
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  507) 			journal->j_max_transaction_buffers);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  508) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  509) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  510) 	 * First thing we are allowed to do is to discard any remaining
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  511) 	 * BJ_Reserved buffers.  Note, it is _not_ permissible to assume
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  512) 	 * that there are no such buffers: if a large filesystem
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  513) 	 * operation like a truncate needs to split itself over multiple
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  514) 	 * transactions, then it may try to do a jbd2_journal_restart() while
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  515) 	 * there are still BJ_Reserved buffers outstanding.  These must
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  516) 	 * be released cleanly from the current transaction.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  517) 	 *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  518) 	 * In this case, the filesystem must still reserve write access
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  519) 	 * again before modifying the buffer in the new transaction, but
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  520) 	 * we do not require it to remember exactly which old buffers it
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  521) 	 * has reserved.  This is consistent with the existing behaviour
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  522) 	 * that multiple jbd2_journal_get_write_access() calls to the same
25985edcedea6 (Lucas De Marchi            2011-03-30 22:57:33 -0300  523) 	 * buffer are perfectly permissible.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  524) 	 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  525) 	while (commit_transaction->t_reserved_list) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  526) 		jh = commit_transaction->t_reserved_list;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  527) 		JBUFFER_TRACE(jh, "reserved, unused: refile");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  528) 		/*
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  529) 		 * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  530) 		 * leave undo-committed data.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  531) 		 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  532) 		if (jh->b_committed_data) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  533) 			struct buffer_head *bh = jh2bh(jh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  534) 
464170647b564 (Thomas Gleixner            2019-08-09 14:42:32 +0200  535) 			spin_lock(&jh->b_state_lock);
af1e76d6b3f37 (Mingming Cao               2007-10-16 18:38:25 -0400  536) 			jbd2_free(jh->b_committed_data, bh->b_size);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  537) 			jh->b_committed_data = NULL;
464170647b564 (Thomas Gleixner            2019-08-09 14:42:32 +0200  538) 			spin_unlock(&jh->b_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  539) 		}
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  540) 		jbd2_journal_refile_buffer(journal, jh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  541) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  542) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  543) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  544) 	 * Now try to drop any written-back buffers from the journal's
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  545) 	 * checkpoint lists.  We do this *before* commit because it potentially
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  546) 	 * frees some memory
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  547) 	 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  548) 	spin_lock(&journal->j_list_lock);
841df7df19623 (Jan Kara                   2015-07-28 14:57:14 -0400  549) 	__jbd2_journal_clean_checkpoint_list(journal, false);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  550) 	spin_unlock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  551) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  552) 	jbd_debug(3, "JBD2: commit phase 1\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  553) 
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  554) 	/*
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  555) 	 * Clear revoked flag to reflect there is no revoked buffers
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  556) 	 * in the next transaction which is going to be started.
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  557) 	 */
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  558) 	jbd2_clear_buffer_revoked_flags(journal);
1ba37268cd19e (Yongqiang Yang             2011-12-28 17:46:46 -0500  559) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  560) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  561) 	 * Switch to a new revoke table.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  562) 	 */
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  563) 	jbd2_journal_switch_revoke_table(journal);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  564) 
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  565) 	/*
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  566) 	 * Reserved credits cannot be claimed anymore, free them
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  567) 	 */
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  568) 	atomic_sub(atomic_read(&journal->j_reserved_credits),
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  569) 		   &commit_transaction->t_outstanding_credits);
8f7d89f36829b (Jan Kara                   2013-06-04 12:35:11 -0400  570) 
96f1e09745750 (Jan Kara                   2018-12-03 23:16:07 -0500  571) 	write_lock(&journal->j_state_lock);
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400  572) 	trace_jbd2_commit_flushing(journal, commit_transaction);
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  573) 	stats.run.rs_flushing = jiffies;
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  574) 	stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked,
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  575) 					     stats.run.rs_flushing);
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500  576) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  577) 	commit_transaction->t_state = T_FLUSH;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  578) 	journal->j_committing_transaction = commit_transaction;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  579) 	journal->j_running_transaction = NULL;
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500  580) 	start_time = ktime_get();
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  581) 	commit_transaction->t_log_start = journal->j_head;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  582) 	wake_up(&journal->j_wait_transaction_locked);
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  583) 	write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  584) 
cfc7bc896f452 (Paul Gortmaker             2013-06-12 22:56:35 -0400  585) 	jbd_debug(3, "JBD2: commit phase 2a\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  586) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  587) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  588) 	 * Now start flushing things to disk, in the order they appear
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  589) 	 * on the transaction lists.  Data blocks go first.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  590) 	 */
cd1aac32923a9 (Aneesh Kumar K.V           2008-07-11 19:27:31 -0400  591) 	err = journal_submit_data_buffers(journal, commit_transaction);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  592) 	if (err)
a7fa2baf8e2a6 (Jan Kara                   2007-10-16 18:38:25 -0400  593) 		jbd2_journal_abort(journal, err);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  594) 
82f04ab47e1d9 (Jens Axboe                 2011-03-17 11:01:52 +0100  595) 	blk_start_plug(&plug);
9bcf976cb8b86 (Jan Kara                   2016-02-22 23:07:30 -0500  596) 	jbd2_journal_write_revoke_records(commit_transaction, &log_bufs);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  597) 
cfc7bc896f452 (Paul Gortmaker             2013-06-12 22:56:35 -0400  598) 	jbd_debug(3, "JBD2: commit phase 2b\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  599) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  600) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  601) 	 * Way to go: we have now written out all of the data for a
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  602) 	 * transaction!  Now comes the tricky part: we need to write out
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  603) 	 * metadata.  Loop over the transaction's entire buffer list:
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  604) 	 */
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  605) 	write_lock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  606) 	commit_transaction->t_state = T_COMMIT;
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400  607) 	write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  608) 
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400  609) 	trace_jbd2_commit_logging(journal, commit_transaction);
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  610) 	stats.run.rs_logging = jiffies;
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  611) 	stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing,
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  612) 					       stats.run.rs_logging);
9f356e5a4f120 (Jan Kara                   2019-11-05 17:44:24 +0100  613) 	stats.run.rs_blocks = commit_transaction->t_nr_buffers;
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400  614) 	stats.run.rs_blocks_logged = 0;
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500  615) 
1dfc3220d9633 (Josef Bacik                2008-04-17 10:38:59 -0400  616) 	J_ASSERT(commit_transaction->t_nr_buffers <=
a51dca9cd3bb4 (Theodore Ts'o              2010-08-02 08:43:25 -0400  617) 		 atomic_read(&commit_transaction->t_outstanding_credits));
1dfc3220d9633 (Josef Bacik                2008-04-17 10:38:59 -0400  618) 
87c89c232c8f7 (Jan Kara                   2008-07-11 19:27:31 -0400  619) 	err = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  620) 	bufs = 0;
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  621) 	descriptor = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  622) 	while (commit_transaction->t_buffers) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  623) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  624) 		/* Find the next buffer to be journaled... */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  625) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  626) 		jh = commit_transaction->t_buffers;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  627) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  628) 		/* If we're in abort mode, we just un-journal the buffer and
7ad7445f60fe4 (Hidehiro Kawai             2008-10-10 20:29:31 -0400  629) 		   release it. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  630) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  631) 		if (is_journal_aborted(journal)) {
7ad7445f60fe4 (Hidehiro Kawai             2008-10-10 20:29:31 -0400  632) 			clear_buffer_jbddirty(jh2bh(jh));
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  633) 			JBUFFER_TRACE(jh, "journal is aborting: refile");
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  634) 			jbd2_buffer_abort_trigger(jh,
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  635) 						  jh->b_frozen_data ?
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  636) 						  jh->b_frozen_triggers :
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  637) 						  jh->b_triggers);
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  638) 			jbd2_journal_refile_buffer(journal, jh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  639) 			/* If that was the last one, we need to clean up
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  640) 			 * any descriptor buffers which may have been
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  641) 			 * already allocated, even if we are now
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  642) 			 * aborting. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  643) 			if (!commit_transaction->t_buffers)
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  644) 				goto start_journal_io;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  645) 			continue;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  646) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  647) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  648) 		/* Make sure we have a descriptor block in which to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  649) 		   record the metadata buffer. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  650) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  651) 		if (!descriptor) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  652) 			J_ASSERT (bufs == 0);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  653) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  654) 			jbd_debug(4, "JBD2: get descriptor\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  655) 
32ab671599a89 (Jan Kara                   2016-02-22 23:17:15 -0500  656) 			descriptor = jbd2_journal_get_descriptor_buffer(
32ab671599a89 (Jan Kara                   2016-02-22 23:17:15 -0500  657) 							commit_transaction,
32ab671599a89 (Jan Kara                   2016-02-22 23:17:15 -0500  658) 							JBD2_DESCRIPTOR_BLOCK);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  659) 			if (!descriptor) {
a7fa2baf8e2a6 (Jan Kara                   2007-10-16 18:38:25 -0400  660) 				jbd2_journal_abort(journal, -EIO);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  661) 				continue;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  662) 			}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  663) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  664) 			jbd_debug(4, "JBD2: got buffer %llu (%p)\n",
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  665) 				(unsigned long long)descriptor->b_blocknr,
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  666) 				descriptor->b_data);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  667) 			tagp = &descriptor->b_data[sizeof(journal_header_t)];
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  668) 			space_left = descriptor->b_size -
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  669) 						sizeof(journal_header_t);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  670) 			first_tag = 1;
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  671) 			set_buffer_jwrite(descriptor);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  672) 			set_buffer_dirty(descriptor);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  673) 			wbuf[bufs++] = descriptor;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  674) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  675) 			/* Record it so that we can wait for IO
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  676)                            completion later */
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  677) 			BUFFER_TRACE(descriptor, "ph3: file as descriptor");
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  678) 			jbd2_file_log_bh(&log_bufs, descriptor);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  679) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  680) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  681) 		/* Where is the buffer to be written? */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  682) 
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  683) 		err = jbd2_journal_next_log_block(journal, &blocknr);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  684) 		/* If the block mapping failed, just abandon the buffer
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  685) 		   and repeat this loop: we'll fall into the
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  686) 		   refile-on-abort condition above. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  687) 		if (err) {
a7fa2baf8e2a6 (Jan Kara                   2007-10-16 18:38:25 -0400  688) 			jbd2_journal_abort(journal, err);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  689) 			continue;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  690) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  691) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  692) 		/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  693) 		 * start_this_handle() uses t_outstanding_credits to determine
0db4588945364 (Jan Kara                   2019-11-05 17:44:08 +0100  694) 		 * the free space in the log.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  695) 		 */
a51dca9cd3bb4 (Theodore Ts'o              2010-08-02 08:43:25 -0400  696) 		atomic_dec(&commit_transaction->t_outstanding_credits);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  697) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  698) 		/* Bump b_count to prevent truncate from stumbling over
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  699)                    the shadowed buffer!  @@@ This can go if we ever get
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  700)                    rid of the shadow pairing of buffers. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  701) 		atomic_inc(&jh2bh(jh)->b_count);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  702) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  703) 		/*
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  704) 		 * Make a temporary IO buffer with which to write it out
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  705) 		 * (this will requeue the metadata buffer to BJ_Shadow).
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  706) 		 */
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  707) 		set_bit(BH_JWrite, &jh2bh(jh)->b_state);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  708) 		JBUFFER_TRACE(jh, "ph3: write metadata");
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  709) 		flags = jbd2_journal_write_metadata_buffer(commit_transaction,
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  710) 						jh, &wbuf[bufs], blocknr);
e6ec116b67f46 (Theodore Ts'o              2009-12-01 09:04:42 -0500  711) 		if (flags < 0) {
e6ec116b67f46 (Theodore Ts'o              2009-12-01 09:04:42 -0500  712) 			jbd2_journal_abort(journal, flags);
e6ec116b67f46 (Theodore Ts'o              2009-12-01 09:04:42 -0500  713) 			continue;
e6ec116b67f46 (Theodore Ts'o              2009-12-01 09:04:42 -0500  714) 		}
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  715) 		jbd2_file_log_bh(&io_bufs, wbuf[bufs]);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  716) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  717) 		/* Record the new block's tag in the current descriptor
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  718)                    buffer */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  719) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  720) 		tag_flag = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  721) 		if (flags & 1)
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  722) 			tag_flag |= JBD2_FLAG_ESCAPE;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  723) 		if (!first_tag)
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  724) 			tag_flag |= JBD2_FLAG_SAME_UUID;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  725) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  726) 		tag = (journal_block_tag_t *) tagp;
db9ee220361de (Darrick J. Wong            2014-08-27 18:40:07 -0400  727) 		write_tag_block(journal, tag, jh2bh(jh)->b_blocknr);
8f888ef846d44 (Darrick J. Wong            2012-05-22 22:43:41 -0400  728) 		tag->t_flags = cpu_to_be16(tag_flag);
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  729) 		jbd2_block_tag_csum_set(journal, tag, wbuf[bufs],
c390087591dcb (Darrick J. Wong            2012-05-27 08:12:12 -0400  730) 					commit_transaction->t_tid);
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  731) 		tagp += tag_bytes;
b517bea1c74e4 (Zach Brown                 2006-10-11 01:21:08 -0700  732) 		space_left -= tag_bytes;
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  733) 		bufs++;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  734) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  735) 		if (first_tag) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  736) 			memcpy (tagp, journal->j_uuid, 16);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  737) 			tagp += 16;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  738) 			space_left -= 16;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  739) 			first_tag = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  740) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  741) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  742) 		/* If there's no more to do, or if the descriptor is full,
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  743) 		   let the IO rip! */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  744) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  745) 		if (bufs == journal->j_wbufsize ||
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  746) 		    commit_transaction->t_buffers == NULL ||
3caa487f53f65 (Darrick J. Wong            2012-05-27 08:10:22 -0400  747) 		    space_left < tag_bytes + 16 + csum_size) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  748) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  749) 			jbd_debug(4, "JBD2: Submit %d IOs\n", bufs);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  750) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  751) 			/* Write an end-of-descriptor marker before
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  752)                            submitting the IOs.  "tag" still points to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  753)                            the last tag we set up. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  754) 
8f888ef846d44 (Darrick J. Wong            2012-05-22 22:43:41 -0400  755) 			tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  756) start_journal_io:
6e876c3dd205d (luojiajun                  2019-03-01 00:30:00 -0500  757) 			if (descriptor)
6e876c3dd205d (luojiajun                  2019-03-01 00:30:00 -0500  758) 				jbd2_descriptor_block_csum_set(journal,
6e876c3dd205d (luojiajun                  2019-03-01 00:30:00 -0500  759) 							descriptor);
6e876c3dd205d (luojiajun                  2019-03-01 00:30:00 -0500  760) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  761) 			for (i = 0; i < bufs; i++) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  762) 				struct buffer_head *bh = wbuf[i];
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  763) 				/*
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  764) 				 * Compute checksum.
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  765) 				 */
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  766) 				if (jbd2_has_feature_checksum(journal)) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  767) 					crc32_sum =
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  768) 					    jbd2_checksum_data(crc32_sum, bh);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  769) 				}
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  770) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  771) 				lock_buffer(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  772) 				clear_buffer_dirty(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  773) 				set_buffer_uptodate(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  774) 				bh->b_end_io = journal_end_buffer_io_sync;
70fd76140a6cb (Christoph Hellwig          2016-11-01 07:40:10 -0600  775) 				submit_bh(REQ_OP_WRITE, REQ_SYNC, bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  776) 			}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  777) 			cond_resched();
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  778) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  779) 			/* Force a new descriptor to be generated next
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  780)                            time round the loop. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  781) 			descriptor = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  782) 			bufs = 0;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  783) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  784) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  785) 
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  786) 	err = journal_finish_inode_data_buffers(journal, commit_transaction);
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  787) 	if (err) {
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  788) 		printk(KERN_WARNING
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  789) 			"JBD2: Detected IO errors while flushing file data "
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  790) 		       "on %s\n", journal->j_devname);
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  791) 		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  792) 			jbd2_journal_abort(journal, err);
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  793) 		err = 0;
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  794) 	}
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  795) 
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  796) 	/*
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  797) 	 * Get current oldest transaction in the log before we issue flush
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  798) 	 * to the filesystem device. After the flush we can be sure that
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  799) 	 * blocks of all older transactions are checkpointed to persistent
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  800) 	 * storage and we will be safe to update journal start in the
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  801) 	 * superblock with the numbers we get here.
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  802) 	 */
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  803) 	update_tail =
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  804) 		jbd2_journal_get_log_tail(journal, &first_tid, &first_block);
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  805) 
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  806) 	write_lock(&journal->j_state_lock);
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  807) 	if (update_tail) {
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  808) 		long freed = first_block - journal->j_tail;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  809) 
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  810) 		if (first_block < journal->j_tail)
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  811) 			freed += journal->j_last - journal->j_first;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  812) 		/* Update tail only if we free significant amount of space */
ede7dc7fa0af6 (Harshad Shirwadkar         2020-11-05 19:58:54 -0800  813) 		if (freed < jbd2_journal_get_max_txn_bufs(journal))
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  814) 			update_tail = 0;
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  815) 	}
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  816) 	J_ASSERT(commit_transaction->t_state == T_COMMIT);
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  817) 	commit_transaction->t_state = T_COMMIT_DFLUSH;
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  818) 	write_unlock(&journal->j_state_lock);
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  819) 
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  820) 	/* 
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  821) 	 * If the journal is not located on the file system device,
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  822) 	 * then we must flush the file system device before we issue
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  823) 	 * the commit record
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  824) 	 */
81be12c8179c1 (Jan Kara                   2011-05-24 11:52:40 -0400  825) 	if (commit_transaction->t_need_data_flush &&
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  826) 	    (journal->j_fs_dev != journal->j_dev) &&
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  827) 	    (journal->j_flags & JBD2_BARRIER))
c6bf3f0e25f4c (Christoph Hellwig          2021-01-26 15:52:35 +0100  828) 		blkdev_issue_flush(journal->j_fs_dev);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  829) 
cc3e1bea5d876 (Theodore Ts'o              2009-12-23 06:52:08 -0500  830) 	/* Done it all: now write the commit record asynchronously. */
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  831) 	if (jbd2_has_feature_async_commit(journal)) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  832) 		err = journal_submit_commit_record(journal, commit_transaction,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  833) 						 &cbh, crc32_sum);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  834) 		if (err)
d0a186e0d3e7a (zhangyi (F)                2019-12-04 20:46:11 +0800  835) 			jbd2_journal_abort(journal, err);
e9e34f4e8f421 (Hidehiro Kawai             2008-07-31 22:26:04 -0400  836) 	}
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  837) 
82f04ab47e1d9 (Jens Axboe                 2011-03-17 11:01:52 +0100  838) 	blk_finish_plug(&plug);
82f04ab47e1d9 (Jens Axboe                 2011-03-17 11:01:52 +0100  839) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  840) 	/* Lo and behold: we have just managed to send a transaction to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  841)            the log.  Before we can commit it, wait for the IO so far to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  842)            complete.  Control buffers being written are on the
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  843)            transaction's t_log_list queue, and metadata buffers are on
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  844)            the io_bufs list.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  845) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  846) 	   Wait for the buffers in reverse order.  That way we are
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  847) 	   less likely to be woken up until all IOs have completed, and
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  848) 	   so we incur less scheduling load.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  849) 	*/
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  850) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  851) 	jbd_debug(3, "JBD2: commit phase 3\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  852) 
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  853) 	while (!list_empty(&io_bufs)) {
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  854) 		struct buffer_head *bh = list_entry(io_bufs.prev,
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  855) 						    struct buffer_head,
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  856) 						    b_assoc_buffers);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  857) 
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  858) 		wait_on_buffer(bh);
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  859) 		cond_resched();
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  860) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  861) 		if (unlikely(!buffer_uptodate(bh)))
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  862) 			err = -EIO;
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  863) 		jbd2_unfile_log_bh(bh);
015c603306820 (Jan Kara                   2019-11-05 17:44:19 +0100  864) 		stats.run.rs_blocks_logged++;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  865) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  866) 		/*
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  867) 		 * The list contains temporary buffer heads created by
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  868) 		 * jbd2_journal_write_metadata_buffer().
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  869) 		 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  870) 		BUFFER_TRACE(bh, "dumping temporary bh");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  871) 		__brelse(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  872) 		J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  873) 		free_buffer_head(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  874) 
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  875) 		/* We also have to refile the corresponding shadowed buffer */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  876) 		jh = commit_transaction->t_shadow_list->b_tprev;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  877) 		bh = jh2bh(jh);
f5113effc2a2e (Jan Kara                   2013-06-04 12:01:45 -0400  878) 		clear_buffer_jwrite(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  879) 		J_ASSERT_BH(bh, buffer_jbddirty(bh));
b34090e5e22a0 (Jan Kara                   2013-06-04 12:08:56 -0400  880) 		J_ASSERT_BH(bh, !buffer_shadow(bh));
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  881) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  882) 		/* The metadata is now released for reuse, but we need
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  883)                    to remember it against this transaction so that when
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  884)                    we finally commit, we can do any checkpointing
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  885)                    required. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  886) 		JBUFFER_TRACE(jh, "file as BJ_Forget");
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700  887) 		jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  888) 		JBUFFER_TRACE(jh, "brelse shadowed buffer");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  889) 		__brelse(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  890) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  891) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  892) 	J_ASSERT (commit_transaction->t_shadow_list == NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  893) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  894) 	jbd_debug(3, "JBD2: commit phase 4\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  895) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  896) 	/* Here we wait for the revoke record and descriptor record buffers */
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  897) 	while (!list_empty(&log_bufs)) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  898) 		struct buffer_head *bh;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  899) 
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  900) 		bh = list_entry(log_bufs.prev, struct buffer_head, b_assoc_buffers);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  901) 		wait_on_buffer(bh);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  902) 		cond_resched();
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  903) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  904) 		if (unlikely(!buffer_uptodate(bh)))
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  905) 			err = -EIO;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  906) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  907) 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  908) 		clear_buffer_jwrite(bh);
e5a120aeb57f4 (Jan Kara                   2013-06-04 12:06:01 -0400  909) 		jbd2_unfile_log_bh(bh);
015c603306820 (Jan Kara                   2019-11-05 17:44:19 +0100  910) 		stats.run.rs_blocks_logged++;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  911) 		__brelse(bh);		/* One for getblk */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  912) 		/* AKPM: bforget here */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  913) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  914) 
77e841de8abac (Hidehiro Kawai             2008-10-12 16:39:16 -0400  915) 	if (err)
77e841de8abac (Hidehiro Kawai             2008-10-12 16:39:16 -0400  916) 		jbd2_journal_abort(journal, err);
77e841de8abac (Hidehiro Kawai             2008-10-12 16:39:16 -0400  917) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  918) 	jbd_debug(3, "JBD2: commit phase 5\n");
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  919) 	write_lock(&journal->j_state_lock);
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  920) 	J_ASSERT(commit_transaction->t_state == T_COMMIT_DFLUSH);
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  921) 	commit_transaction->t_state = T_COMMIT_JFLUSH;
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400  922) 	write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  923) 
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  924) 	if (!jbd2_has_feature_async_commit(journal)) {
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  925) 		err = journal_submit_commit_record(journal, commit_transaction,
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  926) 						&cbh, crc32_sum);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  927) 		if (err)
d0a186e0d3e7a (zhangyi (F)                2019-12-04 20:46:11 +0800  928) 			jbd2_journal_abort(journal, err);
818d276ceb83a (Girish Shilamkar           2008-01-28 23:58:27 -0500  929) 	}
6cba611e600de (Zhang Huan                 2011-04-05 19:16:20 -0400  930) 	if (cbh)
fd98496f467b3 (Theodore Ts'o              2009-01-05 21:34:13 -0500  931) 		err = journal_wait_on_commit_record(journal, cbh);
015c603306820 (Jan Kara                   2019-11-05 17:44:19 +0100  932) 	stats.run.rs_blocks_logged++;
56316a0d28f25 (Darrick J. Wong            2015-10-17 16:18:45 -0400  933) 	if (jbd2_has_feature_async_commit(journal) &&
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  934) 	    journal->j_flags & JBD2_BARRIER) {
c6bf3f0e25f4c (Christoph Hellwig          2021-01-26 15:52:35 +0100  935) 		blkdev_issue_flush(journal->j_dev);
f73bee49855fe (Jan Kara                   2010-08-18 15:56:56 +0200  936) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  937) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  938) 	if (err)
a7fa2baf8e2a6 (Jan Kara                   2007-10-16 18:38:25 -0400  939) 		jbd2_journal_abort(journal, err);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  940) 
9f356e5a4f120 (Jan Kara                   2019-11-05 17:44:24 +0100  941) 	WARN_ON_ONCE(
9f356e5a4f120 (Jan Kara                   2019-11-05 17:44:24 +0100  942) 		atomic_read(&commit_transaction->t_outstanding_credits) < 0);
9f356e5a4f120 (Jan Kara                   2019-11-05 17:44:24 +0100  943) 
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  944) 	/*
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  945) 	 * Now disk caches for filesystem device are flushed so we are safe to
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  946) 	 * erase checkpointed transactions from the log by updating journal
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  947) 	 * superblock.
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  948) 	 */
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  949) 	if (update_tail)
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  950) 		jbd2_update_log_tail(journal, first_tid, first_block);
3339578f05787 (Jan Kara                   2012-03-13 22:45:38 -0400  951) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  952) 	/* End of a transaction!  Finally, we can do checkpoint
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  953)            processing: any buffers committed as a result of this
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  954)            transaction can be removed from any checkpoint list it was on
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  955)            before. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  956) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400  957) 	jbd_debug(3, "JBD2: commit phase 6\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  958) 
c851ed5401737 (Jan Kara                   2008-07-11 19:27:31 -0400  959) 	J_ASSERT(list_empty(&commit_transaction->t_inode_list));
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  960) 	J_ASSERT(commit_transaction->t_buffers == NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  961) 	J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  962) 	J_ASSERT(commit_transaction->t_shadow_list == NULL);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  963) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  964) restart_loop:
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  965) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  966) 	 * As there are other places (journal_unmap_buffer()) adding buffers
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  967) 	 * to this list we have to be careful and hold the j_list_lock.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  968) 	 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  969) 	spin_lock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  970) 	while (commit_transaction->t_forget) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  971) 		transaction_t *cp_transaction;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  972) 		struct buffer_head *bh;
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  973) 		int try_to_free = 0;
93108ebb848df (Jan Kara                   2019-08-09 14:42:29 +0200  974) 		bool drop_ref;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  975) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  976) 		jh = commit_transaction->t_forget;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  977) 		spin_unlock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  978) 		bh = jh2bh(jh);
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  979) 		/*
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  980) 		 * Get a reference so that bh cannot be freed before we are
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  981) 		 * done with it.
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  982) 		 */
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400  983) 		get_bh(bh);
464170647b564 (Thomas Gleixner            2019-08-09 14:42:32 +0200  984) 		spin_lock(&jh->b_state_lock);
23e2af3518fac (dingdinghua                2010-02-24 12:11:20 -0500  985) 		J_ASSERT_JH(jh,	jh->b_transaction == commit_transaction);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  986) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  987) 		/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  988) 		 * If there is undo-protected committed data against
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  989) 		 * this buffer, then we can remove it now.  If it is a
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  990) 		 * buffer needing such protection, the old frozen_data
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  991) 		 * field now points to a committed version of the
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  992) 		 * buffer, so rotate that field to the new committed
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  993) 		 * data.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  994) 		 *
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  995) 		 * Otherwise, we can just throw away the frozen data now.
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  996) 		 *
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  997) 		 * We also know that the frozen data has already fired
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700  998) 		 * its triggers if they exist, so we can clear that too.
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700  999) 		 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1000) 		if (jh->b_committed_data) {
af1e76d6b3f37 (Mingming Cao               2007-10-16 18:38:25 -0400 1001) 			jbd2_free(jh->b_committed_data, bh->b_size);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1002) 			jh->b_committed_data = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1003) 			if (jh->b_frozen_data) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1004) 				jh->b_committed_data = jh->b_frozen_data;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1005) 				jh->b_frozen_data = NULL;
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700 1006) 				jh->b_frozen_triggers = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1007) 			}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1008) 		} else if (jh->b_frozen_data) {
af1e76d6b3f37 (Mingming Cao               2007-10-16 18:38:25 -0400 1009) 			jbd2_free(jh->b_frozen_data, bh->b_size);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1010) 			jh->b_frozen_data = NULL;
e06c8227fd94e (Joel Becker                2008-09-11 15:35:47 -0700 1011) 			jh->b_frozen_triggers = NULL;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1012) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1013) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1014) 		spin_lock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1015) 		cp_transaction = jh->b_cp_transaction;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1016) 		if (cp_transaction) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1017) 			JBUFFER_TRACE(jh, "remove from old cp transaction");
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1018) 			cp_transaction->t_chp_stats.cs_dropped++;
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700 1019) 			__jbd2_journal_remove_checkpoint(jh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1020) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1021) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1022) 		/* Only re-checkpoint the buffer_head if it is marked
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1023) 		 * dirty.  If the buffer was added to the BJ_Forget list
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700 1024) 		 * by jbd2_journal_forget, it may no longer be dirty and
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1025) 		 * there's no point in keeping a checkpoint record for
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1026) 		 * it. */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1027) 
b794e7a6ebfbd (Jan Kara                   2012-09-26 23:11:13 -0400 1028) 		/*
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1029) 		 * A buffer which has been freed while still being journaled
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1030) 		 * by a previous transaction, refile the buffer to BJ_Forget of
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1031) 		 * the running transaction. If the just committed transaction
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1032) 		 * contains "add to orphan" operation, we can completely
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1033) 		 * invalidate the buffer now. We are rather through in that
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1034) 		 * since the buffer may be still accessible when blocksize <
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1035) 		 * pagesize and it is attached to the last partial page.
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1036) 		 */
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1037) 		if (buffer_freed(bh) && !jh->b_next_transaction) {
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1038) 			struct address_space *mapping;
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1039) 
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1040) 			clear_buffer_freed(bh);
6a66a7ded12ba (zhangyi (F)                2020-02-13 14:38:20 +0800 1041) 			clear_buffer_jbddirty(bh);
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1042) 
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1043) 			/*
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1044) 			 * Block device buffers need to stay mapped all the
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1045) 			 * time, so it is enough to clear buffer_jbddirty and
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1046) 			 * buffer_freed bits. For the file mapping buffers (i.e.
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1047) 			 * journalled data) we need to unmap buffer and clear
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1048) 			 * more bits. We also need to be careful about the check
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1049) 			 * because the data page mapping can get cleared under
780f66e59231f (zhangyi (F)                2020-02-17 19:27:06 +0800 1050) 			 * our hands. Note that if mapping == NULL, we don't
780f66e59231f (zhangyi (F)                2020-02-17 19:27:06 +0800 1051) 			 * need to make buffer unmapped because the page is
780f66e59231f (zhangyi (F)                2020-02-17 19:27:06 +0800 1052) 			 * already detached from the mapping and buffers cannot
780f66e59231f (zhangyi (F)                2020-02-17 19:27:06 +0800 1053) 			 * get reused.
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1054) 			 */
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1055) 			mapping = READ_ONCE(bh->b_page->mapping);
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1056) 			if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1057) 				clear_buffer_mapped(bh);
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1058) 				clear_buffer_new(bh);
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1059) 				clear_buffer_req(bh);
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1060) 				bh->b_bdev = NULL;
c96dceeabf765 (zhangyi (F)                2020-02-13 14:38:21 +0800 1061) 			}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1062) 		}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1063) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1064) 		if (buffer_jbddirty(bh)) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1065) 			JBUFFER_TRACE(jh, "add to new checkpointing trans");
f7f4bccb72984 (Mingming Cao               2006-10-11 01:20:59 -0700 1066) 			__jbd2_journal_insert_checkpoint(jh, commit_transaction);
7ad7445f60fe4 (Hidehiro Kawai             2008-10-10 20:29:31 -0400 1067) 			if (is_journal_aborted(journal))
7ad7445f60fe4 (Hidehiro Kawai             2008-10-10 20:29:31 -0400 1068) 				clear_buffer_jbddirty(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1069) 		} else {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1070) 			J_ASSERT_BH(bh, !buffer_dirty(bh));
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1071) 			/*
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1072) 			 * The buffer on BJ_Forget list and not jbddirty means
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1073) 			 * it has been freed by this transaction and hence it
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1074) 			 * could not have been reallocated until this
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1075) 			 * transaction has committed. *BUT* it could be
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1076) 			 * reallocated once we have written all the data to
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1077) 			 * disk and before we process the buffer on BJ_Forget
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1078) 			 * list.
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1079) 			 */
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1080) 			if (!jh->b_next_transaction)
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1081) 				try_to_free = 1;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1082) 		}
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1083) 		JBUFFER_TRACE(jh, "refile or unfile buffer");
93108ebb848df (Jan Kara                   2019-08-09 14:42:29 +0200 1084) 		drop_ref = __jbd2_journal_refile_buffer(jh);
464170647b564 (Thomas Gleixner            2019-08-09 14:42:32 +0200 1085) 		spin_unlock(&jh->b_state_lock);
93108ebb848df (Jan Kara                   2019-08-09 14:42:29 +0200 1086) 		if (drop_ref)
93108ebb848df (Jan Kara                   2019-08-09 14:42:29 +0200 1087) 			jbd2_journal_put_journal_head(jh);
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1088) 		if (try_to_free)
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1089) 			release_buffer_page(bh);	/* Drops bh reference */
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1090) 		else
de1b794130b13 (Jan Kara                   2011-06-13 15:38:22 -0400 1091) 			__brelse(bh);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1092) 		cond_resched_lock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1093) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1094) 	spin_unlock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1095) 	/*
f5a7a6b0d9b6a (Jan Kara                   2008-01-28 23:58:27 -0500 1096) 	 * This is a bit sleazy.  We use j_list_lock to protect transition
f5a7a6b0d9b6a (Jan Kara                   2008-01-28 23:58:27 -0500 1097) 	 * of a transaction into T_FINISHED state and calling
f5a7a6b0d9b6a (Jan Kara                   2008-01-28 23:58:27 -0500 1098) 	 * __jbd2_journal_drop_transaction(). Otherwise we could race with
f5a7a6b0d9b6a (Jan Kara                   2008-01-28 23:58:27 -0500 1099) 	 * other checkpointing code processing the transaction...
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1100) 	 */
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400 1101) 	write_lock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1102) 	spin_lock(&journal->j_list_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1103) 	/*
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1104) 	 * Now recheck if some buffers did not get attached to the transaction
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1105) 	 * while the lock was dropped...
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1106) 	 */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1107) 	if (commit_transaction->t_forget) {
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1108) 		spin_unlock(&journal->j_list_lock);
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400 1109) 		write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1110) 		goto restart_loop;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1111) 	}
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1112) 
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1113) 	/* Add the transaction to the checkpoint list
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1114) 	 * __journal_remove_checkpoint() can not destroy transaction
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1115) 	 * under us because it is not marked as T_FINISHED yet */
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1116) 	if (journal->j_checkpoint_transactions == NULL) {
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1117) 		journal->j_checkpoint_transactions = commit_transaction;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1118) 		commit_transaction->t_cpnext = commit_transaction;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1119) 		commit_transaction->t_cpprev = commit_transaction;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1120) 	} else {
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1121) 		commit_transaction->t_cpnext =
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1122) 			journal->j_checkpoint_transactions;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1123) 		commit_transaction->t_cpprev =
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1124) 			commit_transaction->t_cpnext->t_cpprev;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1125) 		commit_transaction->t_cpnext->t_cpprev =
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1126) 			commit_transaction;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1127) 		commit_transaction->t_cpprev->t_cpnext =
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1128) 				commit_transaction;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1129) 	}
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1130) 	spin_unlock(&journal->j_list_lock);
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1131) 
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1132) 	/* Done with this transaction! */
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1133) 
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400 1134) 	jbd_debug(3, "JBD2: commit phase 7\n");
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1135) 
bbd2be3691072 (Jan Kara                   2011-05-24 11:59:18 -0400 1136) 	J_ASSERT(commit_transaction->t_state == T_COMMIT_JFLUSH);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1137) 
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1138) 	commit_transaction->t_start = jiffies;
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400 1139) 	stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging,
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400 1140) 					      commit_transaction->t_start);
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1141) 
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1142) 	/*
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400 1143) 	 * File the transaction statistics
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1144) 	 */
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1145) 	stats.ts_tid = commit_transaction->t_tid;
8dd420466c7bf (Theodore Ts'o              2010-08-03 21:38:29 -0400 1146) 	stats.run.rs_handle_count =
8dd420466c7bf (Theodore Ts'o              2010-08-03 21:38:29 -0400 1147) 		atomic_read(&commit_transaction->t_handle_count);
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400 1148) 	trace_jbd2_run_stats(journal->j_fs_dev->bd_dev,
bf6993276f74d (Theodore Ts'o              2009-09-30 00:32:06 -0400 1149) 			     commit_transaction->t_tid, &stats.run);
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1150) 	stats.ts_requested = (commit_transaction->t_requested) ? 1 : 0;
8e85fb3f305b2 (Johann Lombardi            2008-01-28 23:58:27 -0500 1151) 
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1152) 	commit_transaction->t_state = T_COMMIT_CALLBACK;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1153) 	J_ASSERT(commit_transaction == journal->j_committing_transaction);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1154) 	journal->j_commit_sequence = commit_transaction->t_tid;
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1155) 	journal->j_committing_transaction = NULL;
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1156) 	commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1157) 
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1158) 	/*
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1159) 	 * weight the commit time higher than the average time so we don't
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1160) 	 * react too strongly to vast changes in the commit time
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1161) 	 */
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1162) 	if (likely(journal->j_average_commit_time))
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1163) 		journal->j_average_commit_time = (commit_time +
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1164) 				journal->j_average_commit_time*3) / 4;
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1165) 	else
e07f7183a486c (Josef Bacik                2008-11-26 01:14:26 -0500 1166) 		journal->j_average_commit_time = commit_time;
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1167) 
a931da6ac9331 (Theodore Ts'o              2010-08-03 21:35:12 -0400 1168) 	write_unlock(&journal->j_state_lock);
6c20ec850360b (Theodore Ts'o              2008-10-28 21:08:20 -0400 1169) 
fb68407b0d9ef (Aneesh Kumar K.V           2008-11-06 17:50:21 -0500 1170) 	if (journal->j_commit_callback)
fb68407b0d9ef (Aneesh Kumar K.V           2008-11-06 17:50:21 -0500 1171) 		journal->j_commit_callback(journal, commit_transaction);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700 1172) 	if (journal->j_fc_cleanup_callback)
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700 1173) 		journal->j_fc_cleanup_callback(journal, 1);
fb68407b0d9ef (Aneesh Kumar K.V           2008-11-06 17:50:21 -0500 1174) 
879c5e6b7cb4c (Theodore Ts'o              2009-06-17 11:47:48 -0400 1175) 	trace_jbd2_end_commit(journal, commit_transaction);
f2a44523b20f3 (Eryu Guan                  2011-11-01 19:09:18 -0400 1176) 	jbd_debug(1, "JBD2: commit %d complete, head %d\n",
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1177) 		  journal->j_commit_sequence, journal->j_tail_sequence);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1178) 
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1179) 	write_lock(&journal->j_state_lock);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700 1180) 	journal->j_flags &= ~JBD2_FULL_COMMIT_ONGOING;
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700 1181) 	journal->j_flags &= ~JBD2_FAST_COMMIT_ONGOING;
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1182) 	spin_lock(&journal->j_list_lock);
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1183) 	commit_transaction->t_state = T_FINISHED;
d4e839d4a9dc3 (Theodore Ts'o              2014-03-08 22:34:10 -0500 1184) 	/* Check if the transaction can be dropped now that we are finished */
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1185) 	if (commit_transaction->t_checkpoint_list == NULL &&
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1186) 	    commit_transaction->t_checkpoint_io_list == NULL) {
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1187) 		__jbd2_journal_drop_transaction(journal, commit_transaction);
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1188) 		jbd2_journal_free_transaction(commit_transaction);
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1189) 	}
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1190) 	spin_unlock(&journal->j_list_lock);
794446c694651 (Dmitry Monakhov            2013-04-03 22:06:52 -0400 1191) 	write_unlock(&journal->j_state_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1192) 	wake_up(&journal->j_wait_done_commit);
ff780b91efe90 (Harshad Shirwadkar         2020-10-15 13:37:56 -0700 1193) 	wake_up(&journal->j_fc_wait);
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1194) 
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1195) 	/*
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1196) 	 * Calculate overall stats
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1197) 	 */
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1198) 	spin_lock(&journal->j_history_lock);
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1199) 	journal->j_stats.ts_tid++;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1200) 	journal->j_stats.ts_requested += stats.ts_requested;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1201) 	journal->j_stats.run.rs_wait += stats.run.rs_wait;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1202) 	journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1203) 	journal->j_stats.run.rs_running += stats.run.rs_running;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1204) 	journal->j_stats.run.rs_locked += stats.run.rs_locked;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1205) 	journal->j_stats.run.rs_flushing += stats.run.rs_flushing;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1206) 	journal->j_stats.run.rs_logging += stats.run.rs_logging;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1207) 	journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1208) 	journal->j_stats.run.rs_blocks += stats.run.rs_blocks;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1209) 	journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
42cf3452d5f5b (Theodore Ts'o              2014-03-08 19:51:16 -0500 1210) 	spin_unlock(&journal->j_history_lock);
470decc613ab2 (Dave Kleikamp              2006-10-11 01:20:57 -0700 1211) }