Commit b72e7901 authored by Zhang Yi's avatar Zhang Yi
Browse files

ext4: introduce seq counter for the extent status entry

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9DN5Z


CVE: NA

--------------------------------

Add a modify counter for the extent status entry, which indicates the
version of extent status of one inode, increase it once extent changes.
It it a preparation for the conversion of the regular file's buffered
write path from bh to iomap.

Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
parent 1d7d5132
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1116,6 +1116,7 @@ struct ext4_inode_info {
	ext4_lblk_t i_es_shrink_lblk;	/* Offset where we start searching for
					   extents to shrink. Protected by
					   i_es_lock  */
	unsigned int i_es_seq;		/* modify counter for extents */

	/* ialloc */
	ext4_group_t	i_last_alloc_group;
+12 −1
Original line number Diff line number Diff line
@@ -204,6 +204,13 @@ static inline ext4_lblk_t ext4_es_end(struct extent_status *es)
	return es->es_lblk + es->es_len - 1;
}

static inline void ext4_es_inc_seq(struct inode *inode)
{
	struct ext4_inode_info *ei = EXT4_I(inode);

	WRITE_ONCE(ei->i_es_seq, READ_ONCE(ei->i_es_seq) + 1);
}

/*
 * search through the tree for an delayed extent with a given offset.  If
 * it can't be found, try to find next extent.
@@ -876,6 +883,7 @@ void ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
		WARN_ON(1);
	}

	ext4_es_inc_seq(inode);
	newes.es_lblk = lblk;
	newes.es_len = len;
	ext4_es_store_pblock_status(&newes, pblk, status);
@@ -1503,13 +1511,15 @@ void ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk,
	if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
		return;

	trace_ext4_es_remove_extent(inode, lblk, len);
	es_debug("remove [%u/%u) from extent status tree of inode %lu\n",
		 lblk, len, inode->i_ino);

	if (!len)
		return;

	ext4_es_inc_seq(inode);
	trace_ext4_es_remove_extent(inode, lblk, len);

	end = lblk + len - 1;
	BUG_ON(end < lblk);

@@ -2080,6 +2090,7 @@ void ext4_es_insert_delayed_extent(struct inode *inode, ext4_lblk_t lblk,
	if (!len)
		return;

	ext4_es_inc_seq(inode);
	newes.es_lblk = lblk;
	newes.es_len = len;
	ext4_es_store_pblock_status(&newes, ~0, EXTENT_STATUS_DELAYED);
+1 −0
Original line number Diff line number Diff line
@@ -1474,6 +1474,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb)
	ei->i_es_all_nr = 0;
	ei->i_es_shk_nr = 0;
	ei->i_es_shrink_lblk = 0;
	ei->i_es_seq = 0;
	ei->i_reserved_data_blocks = 0;
	spin_lock_init(&(ei->i_block_reservation_lock));
	ext4_init_pending_tree(&ei->i_pending_tree);
+14 −6
Original line number Diff line number Diff line
@@ -2186,6 +2186,7 @@ DECLARE_EVENT_CLASS(ext4__es_extent,
		__field(	ext4_lblk_t,	len		)
		__field(	ext4_fsblk_t,	pblk		)
		__field(	char, status	)
		__field(	unsigned int,	seq		)
	),

	TP_fast_assign(
@@ -2195,13 +2196,15 @@ DECLARE_EVENT_CLASS(ext4__es_extent,
		__entry->len	= es->es_len;
		__entry->pblk	= ext4_es_show_pblock(es);
		__entry->status	= ext4_es_status(es);
		__entry->seq	= EXT4_I(inode)->i_es_seq;
	),

	TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s",
	TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s seq %u",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  (unsigned long) __entry->ino,
		  __entry->lblk, __entry->len,
		  __entry->pblk, show_extent_status(__entry->status))
		  __entry->pblk, show_extent_status(__entry->status),
		  __entry->seq)
);

DEFINE_EVENT(ext4__es_extent, ext4_es_insert_extent,
@@ -2226,6 +2229,7 @@ TRACE_EVENT(ext4_es_remove_extent,
		__field(	ino_t,	ino			)
		__field(	loff_t,	lblk			)
		__field(	loff_t,	len			)
		__field(	unsigned int, seq		)
	),

	TP_fast_assign(
@@ -2233,12 +2237,13 @@ TRACE_EVENT(ext4_es_remove_extent,
		__entry->ino	= inode->i_ino;
		__entry->lblk	= lblk;
		__entry->len	= len;
		__entry->seq	= EXT4_I(inode)->i_es_seq;
	),

	TP_printk("dev %d,%d ino %lu es [%lld/%lld)",
	TP_printk("dev %d,%d ino %lu es [%lld/%lld) seq %u",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  (unsigned long) __entry->ino,
		  __entry->lblk, __entry->len)
		  __entry->lblk, __entry->len, __entry->seq)
);

TRACE_EVENT(ext4_es_find_extent_range_enter,
@@ -2498,6 +2503,7 @@ TRACE_EVENT(ext4_es_insert_delayed_extent,
		__field(	char,		status		)
		__field(	bool,		lclu_allocated	)
		__field(	bool,		end_allocated	)
		__field(	unsigned int,	seq		)
	),

	TP_fast_assign(
@@ -2509,15 +2515,17 @@ TRACE_EVENT(ext4_es_insert_delayed_extent,
		__entry->status		= ext4_es_status(es);
		__entry->lclu_allocated	= lclu_allocated;
		__entry->end_allocated	= end_allocated;
		__entry->seq		= EXT4_I(inode)->i_es_seq;
	),

	TP_printk("dev %d,%d ino %lu es [%u/%u) mapped %llu status %s "
		  "allocated %d %d",
		  "allocated %d %d seq %u",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  (unsigned long) __entry->ino,
		  __entry->lblk, __entry->len,
		  __entry->pblk, show_extent_status(__entry->status),
		  __entry->lclu_allocated, __entry->end_allocated)
		  __entry->lclu_allocated, __entry->end_allocated,
		  __entry->seq)
);

/* fsmap traces */