Эх сурвалжийг харах

xfs: maintain a sequence count for inode fork manipulations

Add a simple 32-bit unsigned integer as the sequence count for
modifications to the extent list in the inode fork.  This will be
used to optimize away extent list lookups in the writeback code.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Christoph Hellwig 7 жил өмнө
parent
commit
745b3f76d1

+ 6 - 0
fs/xfs/libxfs/xfs_iext_tree.c

@@ -624,6 +624,8 @@ xfs_iext_insert(
 	struct xfs_iext_leaf	*new = NULL;
 	struct xfs_iext_leaf	*new = NULL;
 	int			nr_entries, i;
 	int			nr_entries, i;
 
 
+	ifp->if_seq++;
+
 	if (ifp->if_height == 0)
 	if (ifp->if_height == 0)
 		xfs_iext_alloc_root(ifp, cur);
 		xfs_iext_alloc_root(ifp, cur);
 	else if (ifp->if_height == 1)
 	else if (ifp->if_height == 1)
@@ -864,6 +866,8 @@ xfs_iext_remove(
 	ASSERT(ifp->if_u1.if_root != NULL);
 	ASSERT(ifp->if_u1.if_root != NULL);
 	ASSERT(xfs_iext_valid(ifp, cur));
 	ASSERT(xfs_iext_valid(ifp, cur));
 
 
+	ifp->if_seq++;
+
 	nr_entries = xfs_iext_leaf_nr_entries(ifp, leaf, cur->pos) - 1;
 	nr_entries = xfs_iext_leaf_nr_entries(ifp, leaf, cur->pos) - 1;
 	for (i = cur->pos; i < nr_entries; i++)
 	for (i = cur->pos; i < nr_entries; i++)
 		leaf->recs[i] = leaf->recs[i + 1];
 		leaf->recs[i] = leaf->recs[i + 1];
@@ -970,6 +974,8 @@ xfs_iext_update_extent(
 {
 {
 	struct xfs_ifork	*ifp = xfs_iext_state_to_fork(ip, state);
 	struct xfs_ifork	*ifp = xfs_iext_state_to_fork(ip, state);
 
 
+	ifp->if_seq++;
+
 	if (cur->pos == 0) {
 	if (cur->pos == 0) {
 		struct xfs_bmbt_irec	old;
 		struct xfs_bmbt_irec	old;
 
 

+ 1 - 0
fs/xfs/libxfs/xfs_inode_fork.h

@@ -14,6 +14,7 @@ struct xfs_dinode;
  */
  */
 struct xfs_ifork {
 struct xfs_ifork {
 	int			if_bytes;	/* bytes in if_u1 */
 	int			if_bytes;	/* bytes in if_u1 */
+	unsigned int		if_seq;		/* cow fork mod counter */
 	struct xfs_btree_block	*if_broot;	/* file's incore btree root */
 	struct xfs_btree_block	*if_broot;	/* file's incore btree root */
 	short			if_broot_bytes;	/* bytes allocated for root */
 	short			if_broot_bytes;	/* bytes allocated for root */
 	unsigned char		if_flags;	/* per-fork flags */
 	unsigned char		if_flags;	/* per-fork flags */