]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - repair/phase1.c
xfs: perags need atomic operational state
[thirdparty/xfsprogs-dev.git] / repair / phase1.c
index 618796e811b1e6343fba1b6f9ce6e69e7aec3747..00b98584eed4291e7ab3eebcd786d4439cc0bc69 100644 (file)
@@ -1,28 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
  * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <libxfs.h>
+#include "libxfs.h"
 #include "globals.h"
 #include "agheader.h"
 #include "protos.h"
 #include "err_protos.h"
 
-void
+static void
 no_sb(void)
 {
        do_warn(_("Sorry, could not find valid secondary superblock\n"));
@@ -70,13 +58,14 @@ phase1(xfs_mount_t *mp)
        ag_bp = alloc_ag_buf(MAX_SECTSIZE);
        sb = (xfs_sb_t *) ag_bp;
 
-       if (get_sb(sb, 0LL, MAX_SECTSIZE, 0) == XR_EOF)
+       rval = get_sb(sb, 0LL, MAX_SECTSIZE, 0);
+       if (rval == XR_EOF)
                do_error(_("error reading primary superblock\n"));
 
        /*
         * is this really an sb, verify internal consistency
         */
-       if ((rval = verify_sb(sb, 1)) != XR_OK)  {
+       if (rval != XR_OK)  {
                do_warn(_("bad primary superblock - %s !!!\n"),
                        err_string(rval));
                if (!find_secondary_sb(sb))
@@ -117,11 +106,17 @@ phase1(xfs_mount_t *mp)
                if (lazy_count && !xfs_sb_version_haslazysbcount(sb)) {
                        sb->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
                        sb->sb_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT;
+                       sb->sb_bad_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT;
                        primary_sb_modified = 1;
                        printf(_("Enabling lazy-counters\n"));
-               } else
-               if (!lazy_count && xfs_sb_version_haslazysbcount(sb)) {
+               } else if (!lazy_count && xfs_sb_version_haslazysbcount(sb)) {
+                       if (XFS_SB_VERSION_NUM(sb) == XFS_SB_VERSION_5) {
+                               printf(
+_("Cannot disable lazy-counters on V5 fs\n"));
+                               exit(1);
+                       }
                        sb->sb_features2 &= ~XFS_SB_VERSION2_LAZYSBCOUNTBIT;
+                       sb->sb_bad_features2 &= ~XFS_SB_VERSION2_LAZYSBCOUNTBIT;
                        printf(_("Disabling lazy-counters\n"));
                        primary_sb_modified = 1;
                } else {
@@ -131,6 +126,13 @@ phase1(xfs_mount_t *mp)
                }
        }
 
+       /* shared_vn should be zero */
+       if (sb->sb_shared_vn) {
+               do_warn(_("resetting shared_vn to zero\n"));
+               sb->sb_shared_vn = 0;
+               primary_sb_modified = 1;
+       }
+
        if (primary_sb_modified)  {
                if (!no_modify)  {
                        do_warn(_("writing modified primary superblock\n"));