Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 May 2004 00:12:59 +0200
From:      Stefan =?iso-8859-1?Q?E=DFer?= <se@FreeBSD.org>
To:        Ivan Voras <ivoras@fer.hr>
Cc:        current@freebsd.org
Subject:   [PATCH] Re: Softupdates a mount option?
Message-ID:  <20040528221259.GA1526@StefanEsser.FreeBSD.org>
In-Reply-To: <40B4ECC8.50808@fer.hr>
References:  <40B4ECC8.50808@fer.hr>

next in thread | previous in thread | raw e-mail | index | archive | help

--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On 2004-05-26 21:15 +0200, Ivan Voras <ivoras@fer.hr> wrote:
> This has been really nagging me for a long time: Why aren't softupdates 
> made a mount option (like 'sync' and 'async')? Do I remember correctly that 
> it is done so in NetBSD (where it's called softdeps), so it's doable?

It definitely is doable, you may want to give the following patches a try.
I just generated on a -CURRENT system as of today. I've been running a 
number of FreeBSD systems with softdep as a mount option over some 4 years
now, and I think it is very convenient. The only change I did consider (but
did not bother to implement before generating the attached diffs was to make
softdep the default, with these patches applied you need to have "rw,softdep"
in column 4 of /etc/fstab, instead of just "rw").

With these patches applied (and a new kernel and mount command), you can even
enable soft-updates on a running system. Just remount the filesystem R/O and
the immediately remount R/W with -o softdep (or the other way around: both
are supported on a R/O filesystem). There is no risk involved in using these
patches. The effect of mounting a filesystem with "-o softdep" is identical to
performing a "tunefs -n enable" immediately before the mount, "-o nosoftdep" 
clears that flag. You can use "tunefs -p" to check the current softdep setting,
but you also get it from "mount -v" and "mount -p" with the modified mount 
command. All other commands (including fsck) are unaffected and work as before.

Just give it a try, you'll like it ;-)

Regards, STefan




List of modified files (most have just one line added or changed):

/usr/src/sys/sys/mount.h
/usr/src/sys/ufs/ffs/ffs_vfsops.c
/usr/src/sys/ufs/ffs/ffs_softdep.c
/usr/src/sys/ufs/ffs/ffs_softdep_stub.c

/usr/src/sbin/mount/mntopts.h
/usr/src/sbin/mount/mount.c
/usr/src/sbin/mount/mount_ufs.c


Index: /usr/src/sys/sys/mount.h
--- /usr/src/sys/sys/mount.h	11 Apr 2004 21:36:31 -0000	1.161
+++ /usr/src/sys/sys/mount.h	12 Apr 2004 09:51:01 -0000
@@ -232,6 +232,7 @@
 			MNT_SYNCHRONOUS	| MNT_UNION	| MNT_ASYNC	| \
 			MNT_NOATIME | \
 			MNT_NOSYMFOLLOW	| MNT_IGNORE	| MNT_JAILDEVFS	| \
+			MNT_SOFTDEP | \
 			MNT_NOCLUSTERR	| MNT_NOCLUSTERW | MNT_SUIDDIR	| \
 			MNT_ACLS	| MNT_USER)
 
Index: /usr/src/sys/ufs/ffs/ffs_vfsops.c
--- /usr/src/sys/ufs/ffs/ffs_vfsops.c	29 Apr 2004 15:10:42 -0000	1.232
+++ /usr/src/sys/ufs/ffs/ffs_vfsops.c	28 May 2004 20:52:43 -0000
@@ -189,6 +189,17 @@
 		ump = VFSTOUFS(mp);
 		fs = ump->um_fs;
 		devvp = ump->um_devvp;
+		if (fs->fs_ronly == 0) {
+			/*
+			 * preserve current softdep status,
+			 * unless mounted read-only
+			 */
+			if (fs->fs_flags & FS_DOSOFTDEP) {
+				mp->mnt_flag |= MNT_SOFTDEP;
+			} else {
+				mp->mnt_flag &= ~MNT_SOFTDEP;
+			}
+		}
 		if (fs->fs_ronly == 0 && (mp->mnt_flag & MNT_RDONLY)) {
 			if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
 				return (error);
@@ -277,7 +288,7 @@
 				return (error);
 			}
 			/* check to see if we need to start softdep */
-			if ((fs->fs_flags & FS_DOSOFTDEP) &&
+			if ((mp->mnt_flag & MNT_SOFTDEP) &&
 			    (error = softdep_mount(devvp, mp, fs, td->td_ucred))){
 				vn_finished_write(mp);
 				return (error);
@@ -674,6 +685,9 @@
 		fs->fs_pendingblocks = 0;
 		fs->fs_pendinginodes = 0;
 	}
+	/* clear softdep flag in superblock, if not a softdep mount */
+	if ((mp->mnt_flag & MNT_SOFTDEP) == 0)
+		fs->fs_flags &= ~FS_DOSOFTDEP;
 	ump = malloc(sizeof *ump, M_UFSMNT, M_WAITOK | M_ZERO);
 	ump->um_fs = malloc((u_long)fs->fs_sbsize, M_UFSMNT,
 	    M_WAITOK);
@@ -785,7 +799,7 @@
 	}
 
 	if (ronly == 0) {
-		if ((fs->fs_flags & FS_DOSOFTDEP) &&
+		if ((mp->mnt_flag & MNT_SOFTDEP) &&
 		    (error = softdep_mount(devvp, mp, fs, cred)) != 0) {
 			free(fs->fs_csp, M_UFSMNT);
 			goto out;
Index: /usr/src/sys/ufs/ffs/ffs_softdep.c
--- /usr/src/sys/ufs/ffs/ffs_softdep.c	6 Apr 2004 19:20:24 -0000	1.153
+++ /usr/src/sys/ufs/ffs/ffs_softdep.c	26 May 2004 21:57:29 -0000
@@ -1193,7 +1193,7 @@
 	int error, cyl;
 
 	mp->mnt_flag &= ~MNT_ASYNC;
-	mp->mnt_flag |= MNT_SOFTDEP;
+	fs->fs_flags |= FS_DOSOFTDEP;
 	/*
 	 * When doing soft updates, the counters in the
 	 * superblock may have gotten out of sync, so we have
Index: /usr/src/sys/ufs/ffs/ffs_softdep_stub.c
--- /usr/src/sys/ufs/ffs/ffs_softdep_stub.c	11 Jun 2003 06:31:28 -0000	1.27
+++ /usr/src/sys/ufs/ffs/ffs_softdep_stub.c	26 May 2004 21:57:29 -0000
@@ -72,6 +72,7 @@
 	struct fs *fs;
 	struct ucred *cred;
 {
+	mp->mnt_flag &= ~MNT_SOFTDEP;
 
 	return (0);
 }
Index: /usr/src/sbin/mount/mount.c
--- /usr/src/sbin/mount/mount.c	26 Apr 2004 15:13:45 -0000	1.66
+++ /usr/src/sbin/mount/mount.c	28 May 2004 21:36:50 -0000
@@ -758,6 +758,7 @@
 	if (flags & MNT_NOCLUSTERW)	res = catopt(res, "noclusterw");
 	if (flags & MNT_NOSYMFOLLOW)	res = catopt(res, "nosymfollow");
 	if (flags & MNT_SUIDDIR)	res = catopt(res, "suiddir");
+	if (flags & MNT_SOFTDEP)	res = catopt(res, "softdep");
 	if (flags & MNT_MULTILABEL)	res = catopt(res, "multilabel");
 	if (flags & MNT_ACLS)		res = catopt(res, "acls");
 
Index: /usr/src/sbin/mount/mount_ufs.c
--- /usr/src/sbin/mount/mount_ufs.c	9 Apr 2004 19:58:31 -0000	1.24
+++ /usr/src/sbin/mount/mount_ufs.c	28 May 2004 21:37:24 -0000
@@ -64,6 +64,7 @@
 	MOPT_SYNC,
 	MOPT_UPDATE,
 	MOPT_SNAPSHOT,
+	MOPT_SOFTDEP,
 	{ NULL }
 };
 
Index: /usr/src/sbin/mount/mntopts.h
--- /usr/src/sbin/mount/mntopts.h	9 Apr 2004 19:58:30 -0000	1.21
+++ /usr/src/sbin/mount/mntopts.h	28 May 2004 21:35:56 -0000
@@ -53,6 +53,7 @@
 #define MOPT_NOCLUSTERW		{ "clusterw",	1, MNT_NOCLUSTERW, 0 }
 #define MOPT_SUIDDIR		{ "suiddir",	0, MNT_SUIDDIR, 0 }
 #define MOPT_SNAPSHOT		{ "snapshot",	0, MNT_SNAPSHOT, 0 }
+#define MOPT_SOFTDEP		{ "softdep",	0, MNT_SOFTDEP, 0 }
 #define MOPT_MULTILABEL		{ "multilabel",	0, MNT_MULTILABEL, 0 }
 #define MOPT_ACLS		{ "acls",	0, MNT_ACLS, 0 }
 

--bg08WKrSYDhXBjb5--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040528221259.GA1526>