From owner-freebsd-current Tue Jun 23 08:30:41 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id IAA04244 for freebsd-current-outgoing; Tue, 23 Jun 1998 08:30:41 -0700 (PDT) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from lor.watermarkgroup.com (lor.watermarkgroup.com [207.202.73.33]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id IAA04229 for ; Tue, 23 Jun 1998 08:30:35 -0700 (PDT) (envelope-from luoqi@watermarkgroup.com) Received: (from luoqi@localhost) by lor.watermarkgroup.com (8.8.8/8.8.8) id LAA00998; Tue, 23 Jun 1998 11:30:03 -0400 (EDT) (envelope-from luoqi) Date: Tue, 23 Jun 1998 11:30:03 -0400 (EDT) From: Luoqi Chen Message-Id: <199806231530.LAA00998@lor.watermarkgroup.com> To: current@FreeBSD.ORG, rock@cs.uni-sb.de Subject: Re: softupdates and / Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG > Hi, > > I had some (hardware related) crashes lately and noticed that > softupdates arenīt enabled if the filesystem was unclean. So after a > crash I had to boot twice to re-enable softupdates on / again (no need > to run tunefs though). > Is this because soft updates are no mount option and so cannot be > enabled later and soft updates arenīt enabled on an unclean fs for > safety reasons? > Or is this just a bug? > > Daniel > I believe this is a bug. After fsck fixes inconsistencies on the disk, it will remount / with MNT_RELOAD flag to update the in-core superblock image. For some reason, fsck might change fs_ronly flag in superblock (to be more precise, it will change fs_ronly iff it has fixed the free block count -- could any more knowledgeable person tell me why it is doing that?!), and because of that, all the code to be called during ro->rw update is bypassed, including enabling of softupdate. You may try the following patch, (it also fixes the problem that an unsuccessful mount update could change the in-core superblock), but I think we should fix fsck not to modify the fs_ronly flag. -lq Index: ffs_vfsops.c =================================================================== RCS file: /fun/cvs/src/sys/ufs/ffs/ffs_vfsops.c,v retrieving revision 1.83 diff -u -r1.83 ffs_vfsops.c --- ffs_vfsops.c 1998/06/04 17:21:39 1.83 +++ ffs_vfsops.c 1998/06/23 15:10:22 @@ -148,6 +148,7 @@ register struct fs *fs; int error, flags; mode_t accessmode; + int ronly = 0; /* * Use NULL path to flag a root mount @@ -207,6 +208,7 @@ fs = ump->um_fs; devvp = ump->um_devvp; err = 0; + ronly = fs->fs_ronly; /* MNT_RELOAD might change this */ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERR) mp->mnt_flag |= MNT_NOCLUSTERR; if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERW) @@ -226,7 +228,7 @@ if (err) { goto error_1; } - if (fs->fs_ronly && (mp->mnt_kern_flag & MNTK_WANTRDWR)) { + if (ronly && (mp->mnt_kern_flag & MNTK_WANTRDWR)) { if (!fs->fs_clean) { if (mp->mnt_flag & MNT_FORCE) { printf("WARNING: %s was not properly dismounted.\n",fs->fs_fsmnt); @@ -259,7 +261,7 @@ goto error_1; } - fs->fs_ronly = 0; + ronly = 0; } /* * Soft updates is incompatible with "async", @@ -271,10 +273,6 @@ if (mp->mnt_flag & MNT_SOFTDEP) { mp->mnt_flag &= ~MNT_ASYNC; } - if (fs->fs_ronly == 0) { - fs->fs_clean = 0; - ffs_sbupdate(ump, MNT_WAIT); - } /* if not updating name...*/ if (args.fspec == 0) { /* @@ -410,7 +408,16 @@ error_1: /* no state to back out*/ success: - return( err); + if (!err && path && (mp->mnt_flag & MNT_UPDATE)) { + /* update superblock after ro -> rw update */ + fs = ump->um_fs; + if (!ronly && fs->fs_ronly) { + fs->fs_ronly = 0; + fs->fs_clean = 0; + ffs_sbupdate(ump, MNT_WAIT); + } + } + return (err); } /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message