diff --git a/sys/vfs/hammer/hammer.h b/sys/vfs/hammer/hammer.h index f837a07..19b7e8c 100644 --- a/sys/vfs/hammer/hammer.h +++ b/sys/vfs/hammer/hammer.h @@ -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 int hammer_skipstage2; extern int hammer_debug_io; extern int hammer_debug_general; extern int hammer_debug_debug; diff --git a/sys/vfs/hammer/hammer_recover.c b/sys/vfs/hammer/hammer_recover.c index 0b699d2..062db89 100644 --- a/sys/vfs/hammer/hammer_recover.c +++ b/sys/vfs/hammer/hammer_recover.c @@ -115,6 +115,9 @@ #include "hammer.h" +int hammer_skipstage2 = 0; +TUNABLE_INT("vfs.hammer.skipstage2", &hammer_skipstage2); + /* * Each rterm entry has a list of fifo offsets indicating termination * points. These are stripped as the scan progresses. diff --git a/sys/vfs/hammer/hammer_vfsops.c b/sys/vfs/hammer/hammer_vfsops.c index 03049b3..682e064 100644 --- a/sys/vfs/hammer/hammer_vfsops.c +++ b/sys/vfs/hammer/hammer_vfsops.c @@ -525,7 +525,11 @@ hammer_vfs_mount(struct mount *mp, char *mntpt, caddr_t data, rootvol = hammer_get_root_volume(hmp, &error); if (rootvol) { hammer_recover_flush_buffers(hmp, rootvol, 1); - error = hammer_recover_stage2(hmp, rootvol); + if (!hammer_skipstage2) + error = hammer_recover_stage2(hmp, rootvol); + else + kprintf("Warning: Skipping hammer_recover_stage2! Use at your own risk!\n"); + bcopy(rootvol->ondisk->vol0_blockmap, hmp->blockmap, sizeof(hmp->blockmap)); @@ -780,8 +784,12 @@ hammer_vfs_mount(struct mount *mp, char *mntpt, caddr_t data, goto done; vput(rootvp); /*vn_unlock(hmp->rootvp);*/ - if (hmp->ronly == 0) - error = hammer_recover_stage2(hmp, rootvol); + if (hmp->ronly == 0) { + if (!hammer_skipstage2) + error = hammer_recover_stage2(hmp, rootvol); + else + kprintf("Warning: Skipping hammer_recover_stage2! Use at your own risk!\n"); + } /* * If the stage2 recovery fails be sure to clean out all cached