]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: fix cowextsize field checking and repairing
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 9 Nov 2017 17:35:26 +0000 (11:35 -0600)
committerEric Sandeen <sandeen@redhat.com>
Thu, 9 Nov 2017 17:35:26 +0000 (11:35 -0600)
Make sure that we never leave the filesystem with a zero cowextsize hint
while the cowextsize inode flag is set.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
repair/dinode.c

index e62ec335d10ea11e1fea41b9db3115edbc069900..32cc769176ac674a0f733bff4a01f319aaf05ca8 100644 (file)
@@ -2694,6 +2694,7 @@ _("Cannot have non-zero CoW extent size %u on non-cowextsize inode %" PRIu64 ",
                                        be32_to_cpu(dino->di_cowextsize), lino);
                        if (!no_modify)  {
                                do_warn(_("resetting to zero\n"));
+                               dino->di_flags2 &= ~cpu_to_be64(XFS_DIFLAG2_COWEXTSIZE);
                                dino->di_cowextsize = 0;
                                *dirty = 1;
                        } else
@@ -2701,6 +2702,24 @@ _("Cannot have non-zero CoW extent size %u on non-cowextsize inode %" PRIu64 ",
                }
        }
 
+       /*
+        * Can't have the COWEXTSIZE flag set with no hint.
+        */
+       if (dino->di_version >= 3 &&
+           be32_to_cpu(dino->di_cowextsize) == 0 &&
+           (be64_to_cpu(dino->di_flags2) & XFS_DIFLAG2_COWEXTSIZE)) {
+               do_warn(
+_("Cannot have CoW extent size of zero on cowextsize inode %" PRIu64 ", "),
+                               lino);
+               if (!no_modify)  {
+                       do_warn(_("clearing cowextsize flag\n"));
+                       dino->di_flags2 &= ~cpu_to_be64(XFS_DIFLAG2_COWEXTSIZE);
+                       *dirty = 1;
+               } else {
+                       do_warn(_("would clear cowextsize flag\n"));
+               }
+       }
+
        /*
         * general size/consistency checks:
         */