From 6a7a6ab20dfb94565a745e0bfbacf5ab788e846f Mon Sep 17 00:00:00 2001 From: mckusick Date: Sat, 14 Apr 2001 05:26:28 +0000 Subject: This checkin adds support in ufs/ffs for the FS_NEEDSFSCK flag. It is described in ufs/ffs/fs.h as follows: /* * Filesystem flags. * * Note that the FS_NEEDSFSCK flag is set and cleared only by the * fsck utility. It is set when background fsck finds an unexpected * inconsistency which requires a traditional foreground fsck to be * run. Such inconsistencies should only be found after an uncorrectable * disk error. A foreground fsck will clear the FS_NEEDSFSCK flag when * it has successfully cleaned up the filesystem. The kernel uses this * flag to enforce that inconsistent filesystems be mounted read-only. */ #define FS_UNCLEAN 0x01 /* filesystem not clean at mount */ #define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */ #define FS_NEEDSFSCK 0x04 /* filesystem needs sync fsck before mount */ --- sys/ufs/ffs/ffs_snapshot.c | 2 +- sys/ufs/ffs/ffs_vfsops.c | 10 ++++++---- sys/ufs/ffs/fs.h | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index f128d04..35e0d1b 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -339,7 +339,7 @@ restart: goto out1; copy_fs = (struct fs *)(nbp->b_data + blkoff(fs, SBOFF)); bcopy(fs, copy_fs, fs->fs_sbsize); - if ((fs->fs_flags & FS_UNCLEAN) == 0) + if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0) copy_fs->fs_clean = 1; if (fs->fs_sbsize < SBSIZE) bzero(&nbp->b_data[blkoff(fs, SBOFF) + fs->fs_sbsize], diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 17fa431..80bed87 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -193,7 +193,7 @@ ffs_mount(mp, path, data, ndp, p) return (error); } fs->fs_ronly = 1; - if ((fs->fs_flags & FS_UNCLEAN) == 0) + if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0) fs->fs_clean = 1; if ((error = ffs_sbupdate(ump, MNT_WAIT)) != 0) { fs->fs_ronly = 0; @@ -224,7 +224,8 @@ ffs_mount(mp, path, data, ndp, p) if (fs->fs_clean == 0) { fs->fs_flags |= FS_UNCLEAN; if ((mp->mnt_flag & MNT_FORCE) || - (fs->fs_flags & FS_DOSOFTDEP)) { + ((fs->fs_flags & FS_NEEDSFSCK) == 0 && + (fs->fs_flags & FS_DOSOFTDEP))) { printf("WARNING: %s was not %s\n", fs->fs_fsmnt, "properly dismounted"); } else { @@ -586,7 +587,8 @@ ffs_mountfs(devvp, mp, p, malloctype) if (fs->fs_clean == 0) { fs->fs_flags |= FS_UNCLEAN; if (ronly || (mp->mnt_flag & MNT_FORCE) || - (fs->fs_flags & FS_DOSOFTDEP)) { + ((fs->fs_flags & FS_NEEDSFSCK) == 0 && + (fs->fs_flags & FS_DOSOFTDEP))) { printf( "WARNING: %s was not properly dismounted\n", fs->fs_fsmnt); @@ -805,7 +807,7 @@ ffs_unmount(mp, mntflags, p) } fs = ump->um_fs; if (fs->fs_ronly == 0) { - fs->fs_clean = fs->fs_flags & FS_UNCLEAN ? 0 : 1; + fs->fs_clean = fs->fs_flags & (FS_UNCLEAN|FS_NEEDSFSCK) ? 0 : 1; error = ffs_sbupdate(ump, MNT_WAIT); if (error) { fs->fs_clean = 0; diff --git a/sys/ufs/ffs/fs.h b/sys/ufs/ffs/fs.h index c11a9f8..b9cab9a 100644 --- a/sys/ufs/ffs/fs.h +++ b/sys/ufs/ffs/fs.h @@ -328,9 +328,18 @@ struct fs { /* * Filesystem flags. - */ -#define FS_UNCLEAN 0x01 /* filesystem not clean at mount */ -#define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */ + * + * Note that the FS_NEEDSFSCK flag is set and cleared only by the + * fsck utility. It is set when background fsck finds an unexpected + * inconsistency which requires a traditional foreground fsck to be + * run. Such inconsistencies should only be found after an uncorrectable + * disk error. A foreground fsck will clear the FS_NEEDSFSCK flag when + * it has successfully cleaned up the filesystem. The kernel uses this + * flag to enforce that inconsistent filesystems be mounted read-only. + */ +#define FS_UNCLEAN 0x01 /* filesystem not clean at mount */ +#define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */ +#define FS_NEEDSFSCK 0x04 /* filesystem needs sync fsck before mount */ /* * Rotational layout table format types -- cgit v1.1