hammer - Add tunable vfs.hammer.skip_redo
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 14 Aug 2012 19:55:36 +0000 (21:55 +0200)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Wed, 15 Aug 2012 19:03:17 +0000 (21:03 +0200)
This tunable can be used to change the behaviour of the redo
recovery in the case a HAMMER filesystem is not able to mount.

Following values are accepted:

0 - Run redo recovery normally and fail to mount if
    the operation fails (default).
1 - Run redo recovery, but don't fail to mount if the
    operation fails.
2 - Completely skip redo recovery (only for severe error
    conditions and/or debugging).

Pointed-out-by: dillon
share/man/man5/hammer.5
sys/vfs/hammer/hammer.h
sys/vfs/hammer/hammer_recover.c

index 1f79973..f6e076c 100644 (file)
@@ -29,7 +29,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd April 19, 2011
+.Dd August 14, 2012
 .Dt HAMMER 5
 .Os
 .Sh NAME
 .Dt HAMMER 5
 .Os
 .Sh NAME
@@ -103,6 +103,24 @@ After a non-graceful system shutdown,
 file systems will be brought back into a fully coherent state
 when mounting the file system, usually within a few seconds.
 .Pp
 file systems will be brought back into a fully coherent state
 when mounting the file system, usually within a few seconds.
 .Pp
+In the unlikely case
+.Nm
+mount fails due redo recovery (stage 2 recovery) being corrupted, a
+workaround to skip this stage can be applied by setting the following tunable:
+.Bd -literal -offset indent
+vfs.hammer.skip_redo=<value>
+.Ed
+.Pp
+Possible values are:
+.Bl -tag -width indent
+.It 0
+Run redo recovery normally and fail to mount in the case of error (default).
+.It 1
+Run redo recovery but continue mounting if an error appears.
+.It 2
+Completely bypass redo recovery.
+.El
+.Pp
 Related commands:
 .Xr mount_hammer 8
 .Ss Large File Systems & Multi Volume
 Related commands:
 .Xr mount_hammer 8
 .Ss Large File Systems & Multi Volume
index f837a07..745d5f5 100644 (file)
@@ -998,6 +998,7 @@ extern struct vop_ops hammer_spec_vops;
 extern struct vop_ops hammer_fifo_vops;
 extern struct bio_ops hammer_bioops;
 
 extern struct vop_ops hammer_fifo_vops;
 extern struct bio_ops hammer_bioops;
 
+extern int hammer_skip_redo;
 extern int hammer_debug_io;
 extern int hammer_debug_general;
 extern int hammer_debug_debug;
 extern int hammer_debug_io;
 extern int hammer_debug_general;
 extern int hammer_debug_debug;
index 0b699d2..d7566ca 100644 (file)
 #include "hammer.h"
 
 /*
 #include "hammer.h"
 
 /*
+ * Specify the way we want to handle stage2 errors.
+ *
+ * Following values are accepted:
+ *
+ * 0 - Run redo recovery normally and fail to mount if
+ *     the operation fails (default).
+ * 1 - Run redo recovery, but don't fail to mount if the
+ *     operation fails.
+ * 2 - Completely skip redo recovery (only for severe error
+ *     conditions and/or debugging.
+ */
+int hammer_skip_redo = 0;
+TUNABLE_INT("vfs.hammer.skip_redo", &hammer_skip_redo);
+
+/*
  * Each rterm entry has a list of fifo offsets indicating termination
  * points.  These are stripped as the scan progresses.
  */
  * Each rterm entry has a list of fifo offsets indicating termination
  * points.  These are stripped as the scan progresses.
  */
@@ -529,6 +544,16 @@ hammer_recover_stage2(hammer_mount_t hmp, hammer_volume_t root_volume)
        KKASSERT(hmp->ronly == 0);
        RB_INIT(&rterm_root);
 
        KKASSERT(hmp->ronly == 0);
        RB_INIT(&rterm_root);
 
+       if (hammer_skip_redo == 1)
+               kprintf("HAMMER(%s) recovery redo marked as optional\n",
+                   root_volume->ondisk->vol_name);
+
+       if (hammer_skip_redo == 2) {
+               kprintf("HAMMER(%s) recovery redo skipped.\n",
+                   root_volume->ondisk->vol_name);
+               return (0);
+       }
+
        /*
         * Examine the UNDO FIFO.  If it is empty the filesystem is clean
         * and no action need be taken.
        /*
         * Examine the UNDO FIFO.  If it is empty the filesystem is clean
         * and no action need be taken.
@@ -741,7 +766,13 @@ fatal:
                kprintf("HAMMER(%s) End redo recovery\n",
                        root_volume->ondisk->vol_name);
        }
                kprintf("HAMMER(%s) End redo recovery\n",
                        root_volume->ondisk->vol_name);
        }
-       return (error);
+
+       if (error && hammer_skip_redo == 1)
+               kprintf("HAMMER(%s) recovery redo error %d, "
+                   " skipping.\n", root_volume->ondisk->vol_name,
+                   error);
+
+       return (hammer_skip_redo ? 0 : error);
 }
 
 /*
 }
 
 /*