Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 May 2004 23:48:22 +0200
From:      Stefan =?iso-8859-1?Q?E=DFer?= <se@FreeBSD.org>
To:        Ivan Voras <ivoras@fer.hr>
Cc:        current@freebsd.org
Subject:   Re: Softupdates a mount option?
Message-ID:  <20040526214822.GA12171@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
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?

I prepared and posted patches to make soft updates a mount option several
years ago (June 2000, in fact). I'll just append the message I received
from Kirk McKusick to the end of this Mail. In case you are interested, 
I'll prepare a patch against a recent -current, tomorrow (the diff I add
to this mail is as of 4 years ago).

I'd be happy to commit my diffs (which I have kept in my system, all the
years) to -current, especially if NetBSD got that mount option 3 years ago.

Regards, STefan




>>From mckusick@mckusick.com Sat Jul  1 13:49:15 2000
Received: by hub.freebsd.org (Postfix)
	id CB4A437B9B7; Wed, 28 Jun 2000 13:51:08 -0700 (PDT)
Delivered-To: se@freebsd.org
Received: from beastie.mckusick.com (beastie.mckusick.com [209.31.233.184])
	by hub.freebsd.org (Postfix) with ESMTP
	id 8134937C1C5; Wed, 28 Jun 2000 13:51:01 -0700 (PDT)
	(envelope-from mckusick@mckusick.com)
Received: from beastie.mckusick.com (localhost [127.0.0.1])
	by beastie.mckusick.com (8.9.3/8.9.3) with ESMTP id NAA05776;
	Wed, 28 Jun 2000 13:51:01 -0700 (PDT)
	(envelope-from mckusick@beastie.mckusick.com)
Message-Id: <200006282051.NAA05776@beastie.mckusick.com>
To: arch@freebsd.org
Subject: Re: Soft updates mount change
Cc: Stefan Esser <se@freebsd.org>
Date: Wed, 28 Jun 2000 13:51:00 -0700
From: Kirk McKusick <mckusick@mckusick.com>
Content-Type: text
Status: RO
Content-Length: 12566
Lines: 301

After a long discussion (see below) with Stefan Esser, I have
agreed that it is reasonable to make soft updates a mount option
once we flip over to making them on by default. If you do not
want soft updates, you will add the option `nosoftdep' to your
fstab entry. That makes the extra options in /etc/fstab the
exception rather than the rule and generally does not require
naive administrators to know about them. It also avoids having
a flag day when all the entries in /etc/fstab need to be flipped
over as adding them now would do. I do not anticipate making 
them default on until they have had wider operational experience
from the new licensing and until I resolve the problems with
using them on nearly full filesystems (writes failing because
space has not yet been freed from recently deleted files).

	Kirk McKusick

=-=-=-=-=-=-=-=

Date: Wed, 28 Jun 2000 00:38:24 +0200
From: Stefan Esser <se@freebsd.org>
To: Kirk McKusick <mckusick@mckusick.com>
Cc: Stefan Esser <se@freebsd.org>, Stefan.Esser@o-tel-o.de
Subject: Re: Soft updates mount change
Reply-To: Stefan Esser <se@freebsd.org>

On 2000-06-24 12:00 -0700, Kirk McKusick <mckusick@mckusick.com> wrote:

Please grant me a last chance to state my reasons, why I think that 
soft-updates might become a mount option:

1) The pre-dominant reason to store the soft-updates status in the
   super-block is for FSCK.

2) File system update policy decisions are per file-system, not per 
   medium.

3) It should not be neccessary to have single-user console access to
   change the soft-updates enable bit. (Yes, I know about tunefs on
   a partition that is mounted R/O, but that will not work in all
   situations.)


Regarding 1:

There is a requirement, that fsck is able to determine whether 
the file-system was previously mounted with or with soft-updates.

This asks for a way to keep that information in a place where it
can't be deleted by accident, if the file system was not unmounted
in a clean state. Tunefs operates on unmounted file-systems, whether
clean or not. That means, that the SOFTDEP but in fs_flags can be 
modified either way on an unclean file system, as long as it is
not mounted.

The decision to use soft-updates should not share a bit with the
status flag that controls fsck's operation.


Regarding 2:

My policy to use or not use soft-updates depends on the file-system,
not the partition or medium (consider removable media). How about a
ZIP drive that is used with soft-updates in my system, but is written
to and disconnected without a clean unmount on a system, that does not
have soft-updates in the kernel (e.g. FreeBSD-2.2.8). The medium will 
require a fsck on my system, and fsck must assume it was last written
to with soft-update dependencies enforced, when in reality it was not.

This is a constructed case (I do not even own a ZIP drive), but meant 
to explain my point of view, that the use of soft-updates does not 
depend on the medium but rather on the file system.

My policy currently states, that soft-updates be used on all file
systems except "/" (since I had bad luck with /bin being only partly
populated after a "make installworld", which had required three times
the free space required by the new binaries).

I might have a policy, that requires /var to be written "sync", which
kind of conflicts with soft-updates.

I may have removable media that are moved between a number of systems
and mounted on different mount points, with changing access and usage
policies incl. whether async, sync or soft-updates are suitable for 
some particular use.

All these points aks for soft-updates to be configured per mount-point,
not per disk partition (i.e. *not* in the super-block).


Regarding 3:

I have a lot of systems in remote locations, some with only limited
access to the console. (For example, there may be a modem that is 
switched off, unless activated for the duration of a remote access.)

If I want to enable soft-updates on tens of machines, I'd rather only
distribute a configuration file, than connect to each machine, boot 
into single-user mode, enable soft-updates on each file-system with 
tunefs, and then let the system go back to multi-user.

There are other scenarios, where a system may receive a completely new
kernel, without an administrator present, who knows how to use tunefs.
(Think about PicoBSD: It should be possible to have soft-updates enabled
or disabled by a configuration file delivered with the boot floppy.)

The natural place for persistent per file-system configuration is either
the super-block, where disklabel or newfs store immutable parameters, 
that can't be modified without loosing all data on a partition.

The other place where such information is kept is /etc/fstab, which 
holds the usage, security and update policy decisions of a system in
per records per mount-point. (Even if the first column in fstab is the 
partition name, I consider fstab to specify what to mount on a *mount
point* and how to do it. but I admit that this is just my personal POV ;-)

It is of course possible the have /etc/rc (or one of the rc.* sub-tasks)
modify soft-updates before the "mount -a". But that would be more complex 
than my proposed solution.

> Your above proposal would work, though that is not how NetBSD
> implemented it. I feel that it is a lot of extra mechanism for very
> little gain. Administrators generally make a one-time decision to
> run soft updates on a filesystem. It is not the sort of thing that
> they want to change on a regular basis. It is possible to run tunefs

Agreed. But there are multiple places where this information may be 
stored. One is to hide it in the super-block, the other to expose it
in /etc/fstab. Since mount reports the soft-updates state, I think the
POLA asks for mount to be able to choose between softdep/nosoftdep.

> on a filesystem that is mounted read-only, so it no more difficult
> to use tunefs than it is to make it a mount-time option (i.e., they
> still have to down-grade to read-only, set the option, then upgrade).

This is not easily possible for some file-systems (like /var), where 
some processes keep files open for writing at all times and may fail,
if the file system mode is forced to R/O.

> Finally, I expect that soft updates will eventually just be defaulted
> to `on' when a filesystem is built, and in a few rare instances an
> administrator will want to turn it off. I do not want to have an
> option that needs to be added to nearly every fstab entry to get
> the default behavior.

I fully agree that the default should not have to be added to each 
line in fstab. But then it could still default to on in the kernel,
and a "nosoftdep" could disable it for selected file systems. But I
see your point. 

Hmmm, I still do not think that the command character of FS_DOSOFTDEP 
and the reporting character (was previously mounted with soft-updates) 
of the same bit are a good design choice. The two functions should be
separated. One way to do this is by  making soft-updates a mount option
as I propose, the other to have two flag bits in the super-block, one
enable soft-updates, the other to report to fsck whether it was enabled.

>                       Plus it is just one more bit of trivia that
> new system administrators need to learn to make their systems run
> well. The more of those details that need not be learned because
> they just do the right thing, the better.

But the tunefs method is anything but obvious. Well, if the next version 
of "sysinstall" offers to enable soft-updates in the partition editor, 
it will not be missed as easily as currently ...

I think that soft-updates should be on by default, except possibly on the
root file-system (which may happen to be too small: at least 15MB of free 
space are required for a "make installworld" or part of the programs in 
/bin and /sbin will be lost). There should of course not be different
defaults for / and other file-systems, since this would violate the POLA.
I'm still not convinced. I think that soft-updates should be enabled by
default, and some people may want to disable it on the root fs ...



I am writing this message on a system, which is modified to make softdep a 
mount option. This required a total of some 10 additional lines (incl. 
comments) to be added to ffs_vfsops.c, plus a few lines that changed from 
fs_flags to mnt_flag. A total of 3 lines had to be added to the mount program 
(two to enable/disable softdep, one to print its state for "mount -p").

Patches are appended below, just to show that this is a very minor change.
Please consider adding these patches at least at the time, when soft-updates
defaults to "on" ...

Best regards, STefan

*****************************************************************************
Patches to make softdep a "mount" option:

-> Initial mount (no update mount, file system currently not mounted):

The following patches make ffs_mount() perform a soft-updates mount
(which sets the FS_DOSOFTDEP bit in fs->fs_flags, if successful), if
all of the following conditions are true:

1) the MNT_SOFTDEP flag is set in mp->mnt_flag
2) soft-updates is compiled into the kernel
3) the file system is unmounted or mounted read-only

The FS_DOSOFTDEP bit is cleared, if the mount succeeds without 
MNT_SOFTDEP being set. This can be caused by either of:

1) a successful mount without the "-o softdep" option (or the 
   nosoftdep option, if softdep is to become the default).
2) a mount on a system without soft-updates support



-> Update mount (typically: read-only -> read-write):

If this is an update mount and the file-system is not clean, then the 
soft-updates enable status is "locked" (which is an even stronger 
condition than the requirement, that the file system be unmounted 
for "tunefs -n enable", which doesn't prevent changing an un-clean
file system and mis-directing a subsequent fsck run ...).

(If the file system is mounted R/O, the situation is identical to
the "Initial mount" case above.)


--- /sys/ufs/ffs/ffs_softdep.c	2000/06/22 00:29:53	1.69
+++ /sys/ufs/ffs/ffs_softdep.c	2000/06/27 18:22:49
@@ -962,5 +962,5 @@
 
 	mp->mnt_flag &= ~MNT_ASYNC;
-	mp->mnt_flag |= MNT_SOFTDEP;
+	fs->fs_flags |= FS_DOSOFTDEP;
 	/*
 	 * When doing soft updates, the counters in the
--- /sys/ufs/ffs/ffs_softdep_stub.c	2000/06/16 13:00:33	1.11
+++ /sys/ufs/ffs/ffs_softdep_stub.c	2000/06/27 18:15:44
@@ -72,4 +72,5 @@
 	struct ucred *cred;
 {
+	mp->mnt_flag &= ~MNT_SOFTDEP;
 
 	return (0);
--- /sys/ufs/ffs/ffs_vfsops.c	2000/06/04 04:50:36	1.122
+++ /sys/ufs/ffs/ffs_vfsops.c	2000/06/27 20:33:37
@@ -196,4 +196,12 @@
 		err = 0;
 		ronly = fs->fs_ronly;	/* MNT_RELOAD might change this */
+		if (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 (ronly == 0 && (mp->mnt_flag & MNT_RDONLY)) {
 			flags = WRITECLOSE;
@@ -244,5 +252,5 @@
 
 			/* check to see if we need to start softdep */
-			if (fs->fs_flags & FS_DOSOFTDEP) {
+			if (mp->mnt_flag & MNT_SOFTDEP) {
 				err = softdep_mount(devvp, mp, fs, p->p_ucred);
 				if (err)
@@ -658,4 +666,7 @@
 		goto out;
 	}
+	/* 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);
 	bzero((caddr_t)ump, sizeof *ump);
@@ -746,5 +757,5 @@
 		fs->fs_maxfilesize = maxfilesize;		/* XXX */
 	if (ronly == 0) {
-		if ((fs->fs_flags & FS_DOSOFTDEP) &&
+		if ((mp->mnt_flag & MNT_SOFTDEP) &&
 		    (error = softdep_mount(devvp, mp, fs, cred)) != 0) {
 			free(base, M_UFSMNT);


--- /usr/src/sbin/mount/mntopts.h	1999/10/09 11:54:07	1.16
+++ /usr/src/sbin/mount/mntopts.h	2000/06/27 19:06:19
@@ -57,4 +57,5 @@
 #define MOPT_NOCLUSTERW		{ "clusterw",	1, MNT_NOCLUSTERW, 0 }
 #define MOPT_SUIDDIR		{ "suiddir",	0, MNT_SUIDDIR, 0 }
+#define MOPT_SOFTDEP		{ "softdep",	0, MNT_SOFTDEP, 0 }
 
 /* Control flags. */
--- /usr/src/sbin/mount/mount.c	2000/01/15 14:28:13	1.39
+++ /usr/src/sbin/mount/mount.c	2000/06/27 20:14:39
@@ -741,4 +741,5 @@
 	if (flags & MNT_NOSYMFOLLOW)	res = catopt(res, "nosymfollow");
 	if (flags & MNT_SUIDDIR)	res = catopt(res, "suiddir");
+	if (flags & MNT_SOFTDEP)	res = catopt(res, "softdep");
 
 	return res;
--- /usr/src/sbin/mount/mount_ufs.c	1999/08/28 00:13:27	1.16
+++ /usr/src/sbin/mount/mount_ufs.c	2000/06/27 17:26:50
@@ -67,4 +67,5 @@
 	MOPT_SYNC,
 	MOPT_UPDATE,
+	MOPT_SOFTDEP,
 	{ NULL }
 };



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