]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - repair/phase1.c
libxfs: refactor manage_zones()
[thirdparty/xfsprogs-dev.git] / repair / phase1.c
index 3a25934a1e8e5e15c6e6c31a0c2c236df11874c3..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))
@@ -105,6 +94,45 @@ phase1(xfs_mount_t *mp)
                do_warn(_("superblock has a features2 mismatch, correcting\n"));
        }
 
+       /*
+        * apply any version changes or conversions after the primary
+        * superblock has been verified or repaired
+        *
+        * Send output to stdout as do_log and everything else in repair
+        * is sent to stderr and there is no "quiet" option. xfs_admin
+        * will filter stderr but not stdout. This situation must be improved.
+        */
+       if (convert_lazy_count) {
+               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)) {
+                       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 {
+                       printf(_("Lazy-counters are already %s\n"),
+                               lazy_count ? _("enabled") : _("disabled"));
+                       exit(0); /* no conversion required, exit */
+               }
+       }
+
+       /* 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"));