mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	ext4 / jbd2: add fast commit initialization
This patch adds fast commit area trackers in the journal_t structure. These are initialized via the jbd2_fc_init() routine that this patch adds. This patch also adds ext4/fast_commit.c and ext4/fast_commit.h files for fast commit code that will be added in subsequent patches in this series. Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com> Link: https://lore.kernel.org/r/20201015203802.3597742-4-harshadshirwadkar@gmail.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
		
							parent
							
								
									995a3ed67f
								
							
						
					
					
						commit
						6866d7b3f2
					
				
					 7 changed files with 122 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -10,7 +10,7 @@ ext4-y	:= balloc.o bitmap.o block_validity.o dir.o ext4_jbd2.o extents.o \
 | 
			
		|||
		indirect.o inline.o inode.o ioctl.o mballoc.o migrate.o \
 | 
			
		||||
		mmp.o move_extent.o namei.o page-io.o readpage.o resize.o \
 | 
			
		||||
		super.o symlink.o sysfs.o xattr.o xattr_hurd.o xattr_trusted.o \
 | 
			
		||||
		xattr_user.o
 | 
			
		||||
		xattr_user.o fast_commit.o
 | 
			
		||||
 | 
			
		||||
ext4-$(CONFIG_EXT4_FS_POSIX_ACL)	+= acl.o
 | 
			
		||||
ext4-$(CONFIG_EXT4_FS_SECURITY)		+= xattr_security.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -963,6 +963,7 @@ do {									       \
 | 
			
		|||
#endif /* defined(__KERNEL__) || defined(__linux__) */
 | 
			
		||||
 | 
			
		||||
#include "extents_status.h"
 | 
			
		||||
#include "fast_commit.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Lock subclasses for i_data_sem in the ext4_inode_info structure.
 | 
			
		||||
| 
						 | 
				
			
			@ -2678,6 +2679,9 @@ extern int ext4_init_inode_table(struct super_block *sb,
 | 
			
		|||
				 ext4_group_t group, int barrier);
 | 
			
		||||
extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate);
 | 
			
		||||
 | 
			
		||||
/* fast_commit.c */
 | 
			
		||||
 | 
			
		||||
void ext4_fc_init(struct super_block *sb, journal_t *journal);
 | 
			
		||||
/* mballoc.c */
 | 
			
		||||
extern const struct seq_operations ext4_mb_seq_groups_ops;
 | 
			
		||||
extern long ext4_mb_stats;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								fs/ext4/fast_commit.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								fs/ext4/fast_commit.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * fs/ext4/fast_commit.c
 | 
			
		||||
 *
 | 
			
		||||
 * Written by Harshad Shirwadkar <harshadshirwadkar@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Ext4 fast commits routines.
 | 
			
		||||
 */
 | 
			
		||||
#include "ext4_jbd2.h"
 | 
			
		||||
 | 
			
		||||
void ext4_fc_init(struct super_block *sb, journal_t *journal)
 | 
			
		||||
{
 | 
			
		||||
	if (!test_opt2(sb, JOURNAL_FAST_COMMIT))
 | 
			
		||||
		return;
 | 
			
		||||
	if (jbd2_fc_init(journal, EXT4_NUM_FC_BLKS)) {
 | 
			
		||||
		pr_warn("Error while enabling fast commits, turning off.");
 | 
			
		||||
		ext4_clear_feature_fast_commit(sb);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								fs/ext4/fast_commit.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								fs/ext4/fast_commit.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
 | 
			
		||||
#ifndef __FAST_COMMIT_H__
 | 
			
		||||
#define __FAST_COMMIT_H__
 | 
			
		||||
 | 
			
		||||
/* Number of blocks in journal area to allocate for fast commits */
 | 
			
		||||
#define EXT4_NUM_FC_BLKS		256
 | 
			
		||||
 | 
			
		||||
#endif /* __FAST_COMMIT_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -5170,6 +5170,7 @@ static void ext4_init_journal_params(struct super_block *sb, journal_t *journal)
 | 
			
		|||
	journal->j_commit_interval = sbi->s_commit_interval;
 | 
			
		||||
	journal->j_min_batch_time = sbi->s_min_batch_time;
 | 
			
		||||
	journal->j_max_batch_time = sbi->s_max_batch_time;
 | 
			
		||||
	ext4_fc_init(sb, journal);
 | 
			
		||||
 | 
			
		||||
	write_lock(&journal->j_state_lock);
 | 
			
		||||
	if (test_opt(sb, BARRIER))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1181,6 +1181,14 @@ static journal_t *journal_init_common(struct block_device *bdev,
 | 
			
		|||
	if (!journal->j_wbuf)
 | 
			
		||||
		goto err_cleanup;
 | 
			
		||||
 | 
			
		||||
	if (journal->j_fc_wbufsize > 0) {
 | 
			
		||||
		journal->j_fc_wbuf = kmalloc_array(journal->j_fc_wbufsize,
 | 
			
		||||
					sizeof(struct buffer_head *),
 | 
			
		||||
					GFP_KERNEL);
 | 
			
		||||
		if (!journal->j_fc_wbuf)
 | 
			
		||||
			goto err_cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bh = getblk_unmovable(journal->j_dev, start, journal->j_blocksize);
 | 
			
		||||
	if (!bh) {
 | 
			
		||||
		pr_err("%s: Cannot get buffer for journal superblock\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -1194,11 +1202,23 @@ static journal_t *journal_init_common(struct block_device *bdev,
 | 
			
		|||
 | 
			
		||||
err_cleanup:
 | 
			
		||||
	kfree(journal->j_wbuf);
 | 
			
		||||
	kfree(journal->j_fc_wbuf);
 | 
			
		||||
	jbd2_journal_destroy_revoke(journal);
 | 
			
		||||
	kfree(journal);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int jbd2_fc_init(journal_t *journal, int num_fc_blks)
 | 
			
		||||
{
 | 
			
		||||
	journal->j_fc_wbufsize = num_fc_blks;
 | 
			
		||||
	journal->j_fc_wbuf = kmalloc_array(journal->j_fc_wbufsize,
 | 
			
		||||
				sizeof(struct buffer_head *), GFP_KERNEL);
 | 
			
		||||
	if (!journal->j_fc_wbuf)
 | 
			
		||||
		return -ENOMEM;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(jbd2_fc_init);
 | 
			
		||||
 | 
			
		||||
/* jbd2_journal_init_dev and jbd2_journal_init_inode:
 | 
			
		||||
 *
 | 
			
		||||
 * Create a journal structure assigned some fixed set of disk blocks to
 | 
			
		||||
| 
						 | 
				
			
			@ -1316,11 +1336,20 @@ static int journal_reset(journal_t *journal)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	journal->j_first = first;
 | 
			
		||||
	journal->j_last = last;
 | 
			
		||||
 | 
			
		||||
	journal->j_head = first;
 | 
			
		||||
	journal->j_tail = first;
 | 
			
		||||
	journal->j_free = last - first;
 | 
			
		||||
	if (jbd2_has_feature_fast_commit(journal) &&
 | 
			
		||||
	    journal->j_fc_wbufsize > 0) {
 | 
			
		||||
		journal->j_fc_last = last;
 | 
			
		||||
		journal->j_last = last - journal->j_fc_wbufsize;
 | 
			
		||||
		journal->j_fc_first = journal->j_last + 1;
 | 
			
		||||
		journal->j_fc_off = 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		journal->j_last = last;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	journal->j_head = journal->j_first;
 | 
			
		||||
	journal->j_tail = journal->j_first;
 | 
			
		||||
	journal->j_free = journal->j_last - journal->j_first;
 | 
			
		||||
 | 
			
		||||
	journal->j_tail_sequence = journal->j_transaction_sequence;
 | 
			
		||||
	journal->j_commit_sequence = journal->j_transaction_sequence - 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1665,9 +1694,18 @@ static int load_superblock(journal_t *journal)
 | 
			
		|||
	journal->j_tail_sequence = be32_to_cpu(sb->s_sequence);
 | 
			
		||||
	journal->j_tail = be32_to_cpu(sb->s_start);
 | 
			
		||||
	journal->j_first = be32_to_cpu(sb->s_first);
 | 
			
		||||
	journal->j_last = be32_to_cpu(sb->s_maxlen);
 | 
			
		||||
	journal->j_errno = be32_to_cpu(sb->s_errno);
 | 
			
		||||
 | 
			
		||||
	if (jbd2_has_feature_fast_commit(journal) &&
 | 
			
		||||
	    journal->j_fc_wbufsize > 0) {
 | 
			
		||||
		journal->j_fc_last = be32_to_cpu(sb->s_maxlen);
 | 
			
		||||
		journal->j_last = journal->j_fc_last - journal->j_fc_wbufsize;
 | 
			
		||||
		journal->j_fc_first = journal->j_last + 1;
 | 
			
		||||
		journal->j_fc_off = 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		journal->j_last = be32_to_cpu(sb->s_maxlen);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1728,6 +1766,9 @@ int jbd2_journal_load(journal_t *journal)
 | 
			
		|||
	 */
 | 
			
		||||
	journal->j_flags &= ~JBD2_ABORT;
 | 
			
		||||
 | 
			
		||||
	if (journal->j_fc_wbufsize > 0)
 | 
			
		||||
		jbd2_journal_set_features(journal, 0, 0,
 | 
			
		||||
					  JBD2_FEATURE_INCOMPAT_FAST_COMMIT);
 | 
			
		||||
	/* OK, we've finished with the dynamic journal bits:
 | 
			
		||||
	 * reinitialise the dynamic contents of the superblock in memory
 | 
			
		||||
	 * and reset them on disk. */
 | 
			
		||||
| 
						 | 
				
			
			@ -1811,6 +1852,8 @@ int jbd2_journal_destroy(journal_t *journal)
 | 
			
		|||
		jbd2_journal_destroy_revoke(journal);
 | 
			
		||||
	if (journal->j_chksum_driver)
 | 
			
		||||
		crypto_free_shash(journal->j_chksum_driver);
 | 
			
		||||
	if (journal->j_fc_wbufsize > 0)
 | 
			
		||||
		kfree(journal->j_fc_wbuf);
 | 
			
		||||
	kfree(journal->j_wbuf);
 | 
			
		||||
	kfree(journal);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -918,6 +918,30 @@ struct journal_s
 | 
			
		|||
	 */
 | 
			
		||||
	unsigned long		j_last;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_fc_first:
 | 
			
		||||
	 *
 | 
			
		||||
	 * The block number of the first fast commit block in the journal
 | 
			
		||||
	 * [j_state_lock].
 | 
			
		||||
	 */
 | 
			
		||||
	unsigned long		j_fc_first;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_fc_off:
 | 
			
		||||
	 *
 | 
			
		||||
	 * Number of fast commit blocks currently allocated.
 | 
			
		||||
	 * [j_state_lock].
 | 
			
		||||
	 */
 | 
			
		||||
	unsigned long		j_fc_off;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_fc_last:
 | 
			
		||||
	 *
 | 
			
		||||
	 * The block number one beyond the last fast commit block in the journal
 | 
			
		||||
	 * [j_state_lock].
 | 
			
		||||
	 */
 | 
			
		||||
	unsigned long		j_fc_last;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_dev: Device where we store the journal.
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1068,6 +1092,12 @@ struct journal_s
 | 
			
		|||
	 */
 | 
			
		||||
	struct buffer_head	**j_wbuf;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_fc_wbuf: Array of fast commit bhs for
 | 
			
		||||
	 * jbd2_journal_commit_transaction.
 | 
			
		||||
	 */
 | 
			
		||||
	struct buffer_head	**j_fc_wbuf;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_wbufsize:
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			@ -1075,6 +1105,13 @@ struct journal_s
 | 
			
		|||
	 */
 | 
			
		||||
	int			j_wbufsize;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_fc_wbufsize:
 | 
			
		||||
	 *
 | 
			
		||||
	 * Size of @j_fc_wbuf array.
 | 
			
		||||
	 */
 | 
			
		||||
	int			j_fc_wbufsize;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @j_last_sync_writer:
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			@ -1535,6 +1572,8 @@ void __jbd2_log_wait_for_space(journal_t *journal);
 | 
			
		|||
extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *);
 | 
			
		||||
extern int jbd2_cleanup_journal_tail(journal_t *);
 | 
			
		||||
 | 
			
		||||
/* Fast commit related APIs */
 | 
			
		||||
int jbd2_fc_init(journal_t *journal, int num_fc_blks);
 | 
			
		||||
/*
 | 
			
		||||
 * is_journal_abort
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue