OSDN Git Service

xfs: maintain a sequence count for inode fork manipulations
authorChristoph Hellwig <hch@lst.de>
Tue, 17 Jul 2018 23:51:51 +0000 (16:51 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 31 Jul 2018 20:18:09 +0000 (13:18 -0700)
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>
fs/xfs/libxfs/xfs_iext_tree.c
fs/xfs/libxfs/xfs_inode_fork.h

index b80c63f..8a7aea0 100644 (file)
@@ -624,6 +624,8 @@ xfs_iext_insert(
        struct xfs_iext_leaf    *new = NULL;
        int                     nr_entries, i;
 
+       ifp->if_seq++;
+
        if (ifp->if_height == 0)
                xfs_iext_alloc_root(ifp, cur);
        else if (ifp->if_height == 1)
@@ -864,6 +866,8 @@ xfs_iext_remove(
        ASSERT(ifp->if_u1.if_root != NULL);
        ASSERT(xfs_iext_valid(ifp, cur));
 
+       ifp->if_seq++;
+
        nr_entries = xfs_iext_leaf_nr_entries(ifp, leaf, cur->pos) - 1;
        for (i = cur->pos; i < nr_entries; i++)
                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);
 
+       ifp->if_seq++;
+
        if (cur->pos == 0) {
                struct xfs_bmbt_irec    old;
 
index 1492143..60361d2 100644 (file)
@@ -14,6 +14,7 @@ struct xfs_dinode;
  */
 struct xfs_ifork {
        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 */
        short                   if_broot_bytes; /* bytes allocated for root */
        unsigned char           if_flags;       /* per-fork flags */