Module Name: src Committed By: bouyer Date: Sun Sep 13 14:30:21 UTC 2009
Modified Files: src/sys/ufs/ffs: ffs_vfsops.c Log Message: If the WAPBL journal can't be read (ffs_wapbl_replay_start() fails), mount the filesystem anyway if MNT_FORCE is present. This allows to still boot single-user a system with a corrupted WAPBL on /, and so get a chance to run fsck to fix it. http://mail-index.netbsd.org/tech-kern/2009/08/17/msg005896.html and followups. To generate a diff of this commit: cvs rdiff -u -r1.251 -r1.252 src/sys/ufs/ffs/ffs_vfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ffs/ffs_vfsops.c diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.251 src/sys/ufs/ffs/ffs_vfsops.c:1.252 --- src/sys/ufs/ffs/ffs_vfsops.c:1.251 Sun Sep 13 05:17:36 2009 +++ src/sys/ufs/ffs/ffs_vfsops.c Sun Sep 13 14:30:21 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_vfsops.c,v 1.251 2009/09/13 05:17:36 tsutsui Exp $ */ +/* $NetBSD: ffs_vfsops.c,v 1.252 2009/09/13 14:30:21 bouyer Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.251 2009/09/13 05:17:36 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.252 2009/09/13 14:30:21 bouyer Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -959,28 +959,32 @@ #ifdef WAPBL if ((mp->mnt_wapbl_replay == 0) && (fs->fs_flags & FS_DOWAPBL)) { error = ffs_wapbl_replay_start(mp, fs, devvp); - if (error) + if (error && (mp->mnt_flag & MNT_FORCE) == 0) goto out; + if (!error) { + if (!ronly) { + /* XXX fsmnt may be stale. */ + printf("%s: replaying log to disk\n", + fs->fs_fsmnt); + error = wapbl_replay_write(mp->mnt_wapbl_replay, + devvp); + if (error) + goto out; + wapbl_replay_stop(mp->mnt_wapbl_replay); + fs->fs_clean = FS_WASCLEAN; + } else { + /* XXX fsmnt may be stale */ + printf("%s: replaying log to memory\n", + fs->fs_fsmnt); + } - if (!ronly) { - /* XXX fsmnt may be stale. */ - printf("%s: replaying log to disk\n", fs->fs_fsmnt); - error = wapbl_replay_write(mp->mnt_wapbl_replay, devvp); - if (error) - goto out; - wapbl_replay_stop(mp->mnt_wapbl_replay); - fs->fs_clean = FS_WASCLEAN; - } else { - /* XXX fsmnt may be stale */ - printf("%s: replaying log to memory\n", fs->fs_fsmnt); + /* Force a re-read of the superblock */ + brelse(bp, BC_INVAL); + bp = NULL; + free(fs, M_UFSMNT); + fs = NULL; + goto sbagain; } - - /* Force a re-read of the superblock */ - brelse(bp, BC_INVAL); - bp = NULL; - free(fs, M_UFSMNT); - fs = NULL; - goto sbagain; } #else /* !WAPBL */ if ((fs->fs_flags & FS_DOWAPBL) && (mp->mnt_flag & MNT_FORCE) == 0) {