]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 b80c63faace29b3355ae78d903c8e6e25a790ee5..8a7aea041ee13a43fd73718c0af4558b041f6fbd 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 1492143371f323a5ab54ac063ba5d217ad3c0d46..60361d2d74a182808333aa65be8c05fb9f817bb5 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 */