Module Name:    src
Committed By:   hannken
Date:           Thu Feb 24 09:38:58 UTC 2011

Modified Files:
        src/sbin/dump: snapshot.c
        src/share/man/man4: fss.4
        src/sys/dev: fss.c fssvar.h
        src/sys/ufs/ffs: ffs_snapshot.c
        src/usr.sbin/fssconfig: fssconfig.c

Log Message:
fss(4): Allow FSSIOCSET to set the initial flags.  Add a new flag
        "FSS_UNLINK_ON_CREATE" to unlink the backing store before
        the snapshot gets created.

With this change dump(8) no longer dumps the zero-sized, but named
snapshot it is working on.  Same applies to fsck_ffs(8).


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sbin/dump/snapshot.c
cvs rdiff -u -r1.14 -r1.15 src/share/man/man4/fss.4
cvs rdiff -u -r1.72 -r1.73 src/sys/dev/fss.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/fssvar.h
cvs rdiff -u -r1.109 -r1.110 src/sys/ufs/ffs/ffs_snapshot.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/fssconfig/fssconfig.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/dump/snapshot.c
diff -u src/sbin/dump/snapshot.c:1.5 src/sbin/dump/snapshot.c:1.6
--- src/sbin/dump/snapshot.c:1.5	Sun Apr 11 08:23:51 2010
+++ src/sbin/dump/snapshot.c	Thu Feb 24 09:38:57 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: snapshot.c,v 1.5 2010/04/11 08:23:51 hannken Exp $	*/
+/*	$NetBSD: snapshot.c,v 1.6 2011/02/24 09:38:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -56,7 +56,7 @@
 int
 snap_open(char *file, char *backup, time_t *snap_date, char **snap_dev)
 {
-	int i, n, fd, israw, fsinternal, dounlink, flags;
+	int i, n, fd, israw, fsinternal, dounlink;
 	char path[MAXPATHLEN], fss_dev[14], *cp;
 	dev_t mountdev;
 	struct fss_set fss;
@@ -144,6 +144,9 @@
 	if (close(fd) < 0)
 		goto fail;
 
+	fss.fss_flags = FSS_UNCONFIG_ON_CLOSE;
+	if (dounlink)
+		fss.fss_flags |= FSS_UNLINK_ON_CREATE;
 	/*
 	 * Create the snapshot on the first free snapshot device.
 	 */
@@ -152,9 +155,6 @@
 		if ((fd = open(fss_dev, O_RDWR, 0)) < 0)
 			goto fail;
 
-		if (ioctl(fd, FSSIOFGET, &flags) < 0)
-			goto fail;
-
 		if (ioctl(fd, FSSIOCSET, &fss) < 0) {
 			if (errno != EBUSY)
 				goto fail;
@@ -162,6 +162,7 @@
 			fd = -1;
 			continue;
 		}
+		dounlink = 0;
 
 		if (snap_dev != NULL) {
 			*snap_dev = strdup(fss_dev);
@@ -171,10 +172,7 @@
 			}
 		}
 
-		flags |= FSS_UNCONFIG_ON_CLOSE;
-		if (ioctl(fd, FSSIOCGET, &fsg) < 0 ||
-		    ioctl(fd, FSSIOFSET, &flags) < 0 ||
-		    (!israw && unlink(fss.fss_bstore) < 0)) {
+		if (ioctl(fd, FSSIOCGET, &fsg) < 0) {
 			ioctl(fd, FSSIOCCLR);
 			goto fail;
 		}

Index: src/share/man/man4/fss.4
diff -u src/share/man/man4/fss.4:1.14 src/share/man/man4/fss.4:1.15
--- src/share/man/man4/fss.4:1.14	Fri Nov  5 10:02:53 2010
+++ src/share/man/man4/fss.4	Thu Feb 24 09:38:57 2011
@@ -1,4 +1,4 @@
-.\"	$NetBSD: fss.4,v 1.14 2010/11/05 10:02:53 hannken Exp $	*/
+.\"	$NetBSD: fss.4,v 1.15 2011/02/24 09:38:57 hannken Exp $	*/
 .\"
 .\"
 .\" Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 5, 2010
+.Dd February 24, 2011
 .Dt FSS 4
 .Os
 .Sh NAME
@@ -65,6 +65,7 @@
 	char *fss_mount;
 	char *fss_bstore;
 	blksize_t fss_csize;
+	int fss_flags;
 };
 .Ed
 .Pp
@@ -78,6 +79,9 @@
 The struct element
 .Va fss_csize
 is the preferred size of this data.
+The struct element
+.Va fss_flags
+is the initial set of flags.
 .It Dv FSSIOCGET(struct fss_get)
 Gets the status of a
 .Nm
@@ -120,6 +124,10 @@
 Unconfigure the
 .Nm
 device on the last close.
+.It Dv FSS_UNLINK_ON_CREATE
+Unlink the backing file before the
+.Nm
+device is created.
 .El
 .It Dv FSSIOFGET(int)
 Gets the flags of a

Index: src/sys/dev/fss.c
diff -u src/sys/dev/fss.c:1.72 src/sys/dev/fss.c:1.73
--- src/sys/dev/fss.c:1.72	Mon Dec 27 18:41:07 2010
+++ src/sys/dev/fss.c	Thu Feb 24 09:38:57 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fss.c,v 1.72 2010/12/27 18:41:07 hannken Exp $	*/
+/*	$NetBSD: fss.c,v 1.73 2011/02/24 09:38:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.72 2010/12/27 18:41:07 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.73 2011/02/24 09:38:57 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -58,6 +58,7 @@
 #include <sys/kthread.h>
 #include <sys/fstrans.h>
 #include <sys/simplelock.h>
+#include <sys/vfs_syscalls.h>		/* For do_sys_unlink(). */
 
 #include <miscfs/specfs/specdev.h>
 
@@ -303,6 +304,9 @@
 	struct fss_get *fsg = (struct fss_get *)data;
 
 	switch (cmd) {
+	case FSSIOCSET50:
+		fss->fss_flags = 0;
+		/* Fall through */
 	case FSSIOCSET:
 		mutex_enter(&sc->sc_lock);
 		if ((flag & FWRITE) == 0)
@@ -311,6 +315,8 @@
 			error = EBUSY;
 		else
 			error = fss_create_snapshot(sc, fss, l);
+		if (error == 0)
+			sc->sc_uflags = fss->fss_flags;
 		mutex_exit(&sc->sc_lock);
 		break;
 
@@ -613,11 +619,6 @@
 				NSM_FOLLOW_NOEMULROOT, &vp);
 	if (error != 0)
 		return error;
-	error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
-	if (error != 0) {
-		vrele(vp);
-		return error;
-	}
 
 	if (vp->v_type == VREG && vp->v_mount == sc->sc_mount) {
 		sc->sc_flags |= FSS_PERSISTENT;
@@ -629,14 +630,20 @@
 		    sc->sc_bs_bshift++)
 			if (FSS_FSBSIZE(sc) == fsbsize)
 				break;
-		if (sc->sc_bs_bshift >= bits) {
-			VOP_UNLOCK(sc->sc_bs_vp);
+		if (sc->sc_bs_bshift >= bits)
 			return EINVAL;
-		}
 
 		sc->sc_bs_bmask = FSS_FSBSIZE(sc)-1;
 		sc->sc_clshift = 0;
 
+		if ((fss->fss_flags & FSS_UNLINK_ON_CREATE) != 0) {
+			error = do_sys_unlink(fss->fss_bstore, UIO_USERSPACE);
+			if (error)
+				return error;
+		}
+		error = vn_lock(vp, LK_EXCLUSIVE);
+		if (error != 0)
+			return error;
 		error = VFS_SNAPSHOT(sc->sc_mount, sc->sc_bs_vp, &ts);
 		TIMESPEC_TO_TIMEVAL(&sc->sc_time, &ts);
 
@@ -644,7 +651,7 @@
 
 		return error;
 	}
-	vput(vp);
+	vrele(vp);
 
 	/*
 	 * Get the block device it is mounted on.
@@ -696,6 +703,11 @@
 	}
 	pathbuf_destroy(pb2);
 
+	if ((fss->fss_flags & FSS_UNLINK_ON_CREATE) != 0) {
+		error = do_sys_unlink(fss->fss_bstore, UIO_USERSPACE);
+		if (error)
+			return error;
+	}
 	if (sc->sc_bs_vp->v_type == VREG) {
 		fsbsize = sc->sc_bs_vp->v_mount->mnt_stat.f_iosize;
 		if (fsbsize & (fsbsize-1))	/* No power of two */
@@ -817,7 +829,7 @@
 	fss_softc_free(sc);
 	if (sc->sc_bs_vp != NULL) {
 		if (sc->sc_flags & FSS_PERSISTENT)
-			vn_close(sc->sc_bs_vp, FREAD, l->l_cred);
+			vrele(sc->sc_bs_vp);
 		else
 			vn_close(sc->sc_bs_vp, FREAD|FWRITE, l->l_cred);
 	}
@@ -844,7 +856,7 @@
 
 	fss_softc_free(sc);
 	if (sc->sc_flags & FSS_PERSISTENT)
-		vn_close(sc->sc_bs_vp, FREAD, l->l_cred);
+		vrele(sc->sc_bs_vp);
 	else
 		vn_close(sc->sc_bs_vp, FREAD|FWRITE, l->l_cred);
 	sc->sc_bs_vp = NULL;

Index: src/sys/dev/fssvar.h
diff -u src/sys/dev/fssvar.h:1.24 src/sys/dev/fssvar.h:1.25
--- src/sys/dev/fssvar.h:1.24	Mon Apr  5 09:30:46 2010
+++ src/sys/dev/fssvar.h	Thu Feb 24 09:38:57 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fssvar.h,v 1.24 2010/04/05 09:30:46 hannken Exp $	*/
+/*	$NetBSD: fssvar.h,v 1.25 2011/02/24 09:38:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -35,11 +35,13 @@
 #include <sys/simplelock.h>
 
 #define FSS_UNCONFIG_ON_CLOSE	0x01	/* Unconfigure on last close */
+#define FSS_UNLINK_ON_CREATE	0x02	/* Unlink backing store on create */
 
 struct fss_set {
 	char		*fss_mount;	/* Mount point of file system */
 	char		*fss_bstore;	/* Path of backing store */
 	blksize_t	fss_csize;	/* Preferred cluster size */
+	int		fss_flags;	/* Initial flags */
 };
 
 struct fss_get {
@@ -50,11 +52,12 @@
 	blkcnt_t	fsg_bs_size;	/* # clusters on backing store */
 };
 
-#define FSSIOCSET	_IOW('F', 0, struct fss_set)	/* Configure */
+#define FSSIOCSET	_IOW('F', 5, struct fss_set)	/* Configure */
 #define FSSIOCGET	_IOR('F', 1, struct fss_get)	/* Status */
 #define FSSIOCCLR	_IO('F', 2)			/* Unconfigure */
 #define FSSIOFSET	_IOW('F', 3, int)		/* Set flags */
 #define FSSIOFGET	_IOR('F', 4, int)		/* Get flags */
+#define FSSIOCSET50	_IOW('F', 0, struct fss_set)	/* Old configure */
 
 #ifdef _KERNEL
 

Index: src/sys/ufs/ffs/ffs_snapshot.c
diff -u src/sys/ufs/ffs/ffs_snapshot.c:1.109 src/sys/ufs/ffs/ffs_snapshot.c:1.110
--- src/sys/ufs/ffs/ffs_snapshot.c:1.109	Wed Feb 23 17:05:33 2011
+++ src/sys/ufs/ffs/ffs_snapshot.c	Thu Feb 24 09:38:57 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_snapshot.c,v 1.109 2011/02/23 17:05:33 dyoung Exp $	*/
+/*	$NetBSD: ffs_snapshot.c,v 1.110 2011/02/24 09:38:57 hannken Exp $	*/
 
 /*
  * Copyright 2000 Marshall Kirk McKusick. All Rights Reserved.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.109 2011/02/23 17:05:33 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.110 2011/02/24 09:38:57 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -275,7 +275,8 @@
 	 * Record snapshot inode. Since this is the newest snapshot,
 	 * it must be placed at the end of the list.
 	 */
-	fs->fs_snapinum[snaploc] = ip->i_number;
+	if (ip->i_nlink > 0)
+		fs->fs_snapinum[snaploc] = ip->i_number;
 
 	mutex_enter(&si->si_lock);
 	if (is_active_snapshot(si, ip))
@@ -389,7 +390,7 @@
 			(void) ffs_truncate(vp, (off_t)0, 0, NOCRED);
 			UFS_WAPBL_END(mp);
 		}
-	} else
+	} else if (ip->i_nlink > 0)
 		vref(vp);
 	return (error);
 }
@@ -721,11 +722,11 @@
 	struct snap_info *si = VFSTOUFS(mp)->um_snapinfo;
 
 	TAILQ_FOREACH(xp, &si->si_snapshots, i_nextsnap) {
-		if (xp == ip)
-			break;
-		error = expunge(vp, xp, fs, snapacct, BLK_SNAP);
-		if (error)
-			break;
+		if (xp != ip) {
+			error = expunge(vp, xp, fs, snapacct, BLK_SNAP);
+			if (error)
+				break;
+		}
 		if (xp->i_nlink != 0)
 			continue;
 		error = UFS_WAPBL_BEGIN(mp);

Index: src/usr.sbin/fssconfig/fssconfig.c
diff -u src/usr.sbin/fssconfig/fssconfig.c:1.6 src/usr.sbin/fssconfig/fssconfig.c:1.7
--- src/usr.sbin/fssconfig/fssconfig.c:1.6	Mon Apr 28 20:24:16 2008
+++ src/usr.sbin/fssconfig/fssconfig.c	Thu Feb 24 09:38:58 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fssconfig.c,v 1.6 2008/04/28 20:24:16 martin Exp $	*/
+/*	$NetBSD: fssconfig.c,v 1.7 2011/02/24 09:38:58 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -168,15 +168,16 @@
 		err(1, "open: %s", argv[0]);
 	}
 
+	if ((xflag || istmp) && isreg)
+		fss.fss_flags |= FSS_UNLINK_ON_CREATE;
+	else
+		fss.fss_flags = 0;
 	if (ioctl(fd, FSSIOCSET, &fss) < 0) {
 		if (istmp)
 			unlink(fss.fss_bstore);
 		err(1, "%s: FSSIOCSET", full);
 	}
 
-	if ((xflag || istmp) && isreg && unlink(fss.fss_bstore) < 0)
-		err(1, "unlink: %s", fss.fss_bstore);
-
 	if (vflag)
 		list(1, argv);
 }

Reply via email to