svn commit: r246235 - stable/9/sbin/growfs

Edward Tomasz Napierala trasz at FreeBSD.org
Sat Feb 2 10:00:47 UTC 2013


Author: trasz
Date: Sat Feb  2 10:00:46 2013
New Revision: 246235
URL: http://svnweb.freebsd.org/changeset/base/246235

Log:
  MFC r243246:
  
  Make it possible to resize filesystems mounted read-write, using newly
  introduced UFS write suspension mechanism.
  
  Reviewed by:	kib, mckusick
  Sponsored by:	FreeBSD Foundation

Modified:
  stable/9/sbin/growfs/growfs.8
  stable/9/sbin/growfs/growfs.c
Directory Properties:
  stable/9/sbin/growfs/   (props changed)

Modified: stable/9/sbin/growfs/growfs.8
==============================================================================
--- stable/9/sbin/growfs/growfs.8	Sat Feb  2 09:57:34 2013	(r246234)
+++ stable/9/sbin/growfs/growfs.8	Sat Feb  2 10:00:46 2013	(r246235)
@@ -115,11 +115,17 @@ The
 .Nm
 utility first appeared in
 .Fx 4.4 .
+The ability to resize mounted filesystems was added in
+.Fx 10.0 .
 .Sh AUTHORS
 .An Christoph Herrmann Aq chm at FreeBSD.org
 .An Thomas-Henning von Kamptz Aq tomsoft at FreeBSD.org
 .An The GROWFS team Aq growfs at Tomsoft.COM
 .An Edward Tomasz Napierala Aq trasz at FreeBSD.org
+.Sh CAVEATS
+.Pp
+When expanding a file system mounted read-write, any writes to that file system
+will be temporarily suspended until the expansion is finished.
 .Sh BUGS
 .Pp
 Normally

Modified: stable/9/sbin/growfs/growfs.c
==============================================================================
--- stable/9/sbin/growfs/growfs.c	Sat Feb  2 09:57:34 2013	(r246234)
+++ stable/9/sbin/growfs/growfs.c	Sat Feb  2 10:00:46 2013	(r246235)
@@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$");
 #include <inttypes.h>
 #include <limits.h>
 #include <mntopts.h>
+#include <paths.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
@@ -1523,8 +1524,9 @@ main(int argc, char **argv)
 
 	if (yflag == 0 && Nflag == 0) {
 		if (statfsp != NULL && (statfsp->f_flags & MNT_RDONLY) == 0)
-			errx(1, "%s is mounted read-write on %s",
-			    statfsp->f_mntfromname, statfsp->f_mntonname);
+			printf("Device is mounted read-write; resizing will "
+			    "result in temporary write suspension for %s.\n",
+			    statfsp->f_mntonname);
 		printf("It's strongly recommended to make a backup "
 		    "before growing the file system.\n"
 		    "OK to grow filesystem on %s", device);
@@ -1553,9 +1555,18 @@ main(int argc, char **argv)
 	if (Nflag) {
 		fso = -1;
 	} else {
-		fso = open(device, O_WRONLY);
-		if (fso < 0)
-			err(1, "%s", device);
+		if (statfsp != NULL && (statfsp->f_flags & MNT_RDONLY) == 0) {
+			fso = open(_PATH_UFSSUSPEND, O_RDWR);
+			if (fso == -1)
+				err(1, "unable to open %s", _PATH_UFSSUSPEND);
+			error = ioctl(fso, UFSSUSPEND, &statfsp->f_fsid);
+			if (error != 0)
+				err(1, "UFSSUSPEND");
+		} else {
+			fso = open(device, O_WRONLY);
+			if (fso < 0)
+				err(1, "%s", device);
+		}
 	}
 
 	/*
@@ -1625,12 +1636,17 @@ main(int argc, char **argv)
 
 	close(fsi);
 	if (fso > -1) {
+		if (statfsp != NULL && (statfsp->f_flags & MNT_RDONLY) == 0) {
+			error = ioctl(fso, UFSRESUME);
+			if (error != 0)
+				err(1, "UFSRESUME");
+		}
 		error = close(fso);
 		if (error != 0)
 			err(1, "close");
+		if (statfsp != NULL && (statfsp->f_flags & MNT_RDONLY) != 0)
+			mount_reload(statfsp);
 	}
-	if (statfsp != NULL)
-		mount_reload(statfsp);
 
 	DBG_CLOSE;
 


More information about the svn-src-stable-9 mailing list