Commit b21ebf14 authored by Harshad Shirwadkar's avatar Harshad Shirwadkar Committed by Theodore Ts'o
Browse files

ext4: mark fc ineligible if inode gets evictied due to mem pressure



If inode gets evicted due to memory pressure, we have to remove it
from the fast commit list. However, that inode may have uncommitted
changes that fast commits will lose. So, just fall back to full
commits in this case. Also, rename the fast commit ineligiblity reason
from "EXT4_FC_REASON_MEM" to "EXT4_FC_REASON_MEM_NOMEM" for better
expression.

Suggested-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarHarshad Shirwadkar <harshadshirwadkar@gmail.com>
Link: https://lore.kernel.org/r/20201106035911.1942128-3-harshadshirwadkar@gmail.com


Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent a44ad683
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -384,7 +384,7 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
	mutex_unlock(&ei->i_fc_lock);
	node = kmem_cache_alloc(ext4_fc_dentry_cachep, GFP_NOFS);
	if (!node) {
		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_MEM);
		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM);
		mutex_lock(&ei->i_fc_lock);
		return -ENOMEM;
	}
@@ -397,7 +397,7 @@ static int __track_dentry_update(struct inode *inode, void *arg, bool update)
		if (!node->fcd_name.name) {
			kmem_cache_free(ext4_fc_dentry_cachep, node);
			ext4_fc_mark_ineligible(inode->i_sb,
				EXT4_FC_REASON_MEM);
				EXT4_FC_REASON_NOMEM);
			mutex_lock(&ei->i_fc_lock);
			return -ENOMEM;
		}
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ enum {
	EXT4_FC_REASON_XATTR = 0,
	EXT4_FC_REASON_CROSS_RENAME,
	EXT4_FC_REASON_JOURNAL_FLAG_CHANGE,
	EXT4_FC_REASON_MEM,
	EXT4_FC_REASON_NOMEM,
	EXT4_FC_REASON_SWAP_BOOT,
	EXT4_FC_REASON_RESIZE,
	EXT4_FC_REASON_RENAME_DIR,
+2 −0
Original line number Diff line number Diff line
@@ -327,6 +327,8 @@ void ext4_evict_inode(struct inode *inode)
	ext4_xattr_inode_array_free(ea_inode_array);
	return;
no_delete:
	if (!list_empty(&EXT4_I(inode)->i_fc_list))
		ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM);
	ext4_clear_inode(inode);	/* We must guarantee clearing of inode... */
}

+3 −3
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ TRACE_DEFINE_ENUM(ES_REFERENCED_B);
		{ EXT4_FC_REASON_XATTR,		"XATTR"},		\
		{ EXT4_FC_REASON_CROSS_RENAME,	"CROSS_RENAME"},	\
		{ EXT4_FC_REASON_JOURNAL_FLAG_CHANGE, "JOURNAL_FLAG_CHANGE"}, \
		{ EXT4_FC_REASON_MEM,	"NO_MEM"},			\
		{ EXT4_FC_REASON_NOMEM,	"NO_MEM"},			\
		{ EXT4_FC_REASON_SWAP_BOOT,	"SWAP_BOOT"},		\
		{ EXT4_FC_REASON_RESIZE,	"RESIZE"},		\
		{ EXT4_FC_REASON_RENAME_DIR,	"RENAME_DIR"},		\
@@ -2917,13 +2917,13 @@ TRACE_EVENT(ext4_fc_stats,
		    ),

	    TP_printk("dev %d:%d fc ineligible reasons:\n"
		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s,%d; "
		      "%s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d, %s:%d; "
		      "num_commits:%ld, ineligible: %ld, numblks: %ld",
		      MAJOR(__entry->dev), MINOR(__entry->dev),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_XATTR),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_CROSS_RENAME),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_JOURNAL_FLAG_CHANGE),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_MEM),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_NOMEM),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_SWAP_BOOT),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RESIZE),
		      FC_REASON_NAME_STAT(EXT4_FC_REASON_RENAME_DIR),