Author: trasz
Date: Sun Nov 18 19:01:00 2012
New Revision: 243246
URL: http://svnweb.freebsd.org/changeset/base/243246

Log:
  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:
  head/sbin/growfs/growfs.8
  head/sbin/growfs/growfs.c

Modified: head/sbin/growfs/growfs.8
==============================================================================
--- head/sbin/growfs/growfs.8   Sun Nov 18 18:57:19 2012        (r243245)
+++ head/sbin/growfs/growfs.8   Sun Nov 18 19:01:00 2012        (r243246)
@@ -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 c...@freebsd.org
 .An Thomas-Henning von Kamptz Aq toms...@freebsd.org
 .An The GROWFS team Aq gro...@tomsoft.com
 .An Edward Tomasz Napierala Aq tr...@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
 Normally
 .Nm

Modified: head/sbin/growfs/growfs.c
==============================================================================
--- head/sbin/growfs/growfs.c   Sun Nov 18 18:57:19 2012        (r243245)
+++ head/sbin/growfs/growfs.c   Sun Nov 18 19:01:00 2012        (r243246)
@@ -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>
@@ -1525,8 +1526,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);
@@ -1555,9 +1557,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);
+               }
        }
 
        /*
@@ -1627,12 +1638,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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to