]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_{db,repair}: fix XFS_REFC_COW_START usage
authorDarrick J. Wong <djwong@kernel.org>
Wed, 23 Nov 2022 17:09:39 +0000 (09:09 -0800)
committerCarlos Maiolino <cem@kernel.org>
Fri, 9 Dec 2022 09:18:19 +0000 (10:18 +0100)
This is really a bit field stashed in the upper bit of the rc_startblock
field, so change its usage patterns to use masking instead of integer
addition and subtraction.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
db/check.c
repair/scan.c

index 680edf1f9ed455539de1d0c2dde64224bb9fc376..bb27ce58053646a83ab479c242b82f44236764f4 100644 (file)
@@ -4848,8 +4848,8 @@ scanfunc_refcnt(
                                char            *msg;
 
                                agbno = be32_to_cpu(rp[i].rc_startblock);
-                               if (agbno >= XFS_REFC_COWFLAG) {
-                                       agbno -= XFS_REFC_COWFLAG;
+                               if (agbno & XFS_REFC_COWFLAG) {
+                                       agbno &= ~XFS_REFC_COWFLAG;
                                        msg = _(
                "leftover CoW extent (%u/%u) len %u\n");
                                } else {
index 859a6e69374f1d2cf086b840f5261bb3bff049cb..7b72013153d5174ab039b233166dd3394ccb5674 100644 (file)
@@ -1367,6 +1367,7 @@ _("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"),
                pag = libxfs_perag_get(mp, agno);
 
                for (i = 0; i < numrecs; i++) {
+                       enum xfs_refc_domain    domain;
                        xfs_agblock_t           b, agb, end;
                        xfs_extlen_t            len;
                        xfs_nlink_t             nr;
@@ -1374,16 +1375,23 @@ _("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"),
                        b = agb = be32_to_cpu(rp[i].rc_startblock);
                        len = be32_to_cpu(rp[i].rc_blockcount);
                        nr = be32_to_cpu(rp[i].rc_refcount);
-                       if (b >= XFS_REFC_COWFLAG && nr != 1)
+
+                       if (b & XFS_REFC_COWFLAG) {
+                               domain = XFS_REFC_DOMAIN_COW;
+                               agb &= ~XFS_REFC_COWFLAG;
+                       } else {
+                               domain = XFS_REFC_DOMAIN_SHARED;
+                       }
+
+                       if (domain == XFS_REFC_DOMAIN_COW && nr != 1)
                                do_warn(
 _("leftover CoW extent has incorrect refcount in record %u of %s btree block %u/%u\n"),
                                        i, name, agno, bno);
                        if (nr == 1) {
-                               if (agb < XFS_REFC_COWFLAG)
+                               if (domain != XFS_REFC_DOMAIN_COW)
                                        do_warn(
 _("leftover CoW extent has invalid startblock in record %u of %s btree block %u/%u\n"),
                                                i, name, agno, bno);
-                               agb -= XFS_REFC_COWFLAG;
                        }
                        end = agb + len;
 
@@ -1438,15 +1446,17 @@ _("extent (%u/%u) len %u claimed, state is %d\n"),
                        }
 
                        /* Is this record mergeable with the last one? */
-                       if (refc_priv->last_rec.rc_startblock +
-                           refc_priv->last_rec.rc_blockcount == b &&
+                       if (refc_priv->last_rec.rc_domain == domain &&
+                           refc_priv->last_rec.rc_startblock +
+                           refc_priv->last_rec.rc_blockcount == agb &&
                            refc_priv->last_rec.rc_refcount == nr) {
                                do_warn(
        _("record %d in block (%u/%u) of %s tree should be merged with previous record\n"),
                                        i, agno, bno, name);
                                refc_priv->last_rec.rc_blockcount += len;
                        } else {
-                               refc_priv->last_rec.rc_startblock = b;
+                               refc_priv->last_rec.rc_domain = domain;
+                               refc_priv->last_rec.rc_startblock = agb;
                                refc_priv->last_rec.rc_blockcount = len;
                                refc_priv->last_rec.rc_refcount = nr;
                        }