svn commit: r352365 - in stable/12: sbin/swapon share/man/man5 sys/vm

Doug Moore dougm at FreeBSD.org
Sun Sep 15 20:13:48 UTC 2019


Author: dougm
Date: Sun Sep 15 20:13:46 2019
New Revision: 352365
URL: https://svnweb.freebsd.org/changeset/base/352365

Log:
  MFC 351064
  Don't let swapon trimming wipe the bsd label.
  
  Reviewed by: alc
  Approved by: markj (mentor, implicit)

Modified:
  stable/12/sbin/swapon/swapon.8
  stable/12/sbin/swapon/swapon.c
  stable/12/share/man/man5/fstab.5
  stable/12/sys/vm/swap_pager.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sbin/swapon/swapon.8
==============================================================================
--- stable/12/sbin/swapon/swapon.8	Sun Sep 15 19:41:54 2019	(r352364)
+++ stable/12/sbin/swapon/swapon.8	Sun Sep 15 20:13:46 2019	(r352365)
@@ -90,7 +90,17 @@ The
 .Fl E
 option causes each of following devices to receive a
 .Dv BIO_DELETE
-command to mark all blocks as unused.
+command.
+This command marks the device's blocks as unused, except those that
+might store a disk label.
+This marking can erase a crash dump.
+To delay
+.Nm swapon
+for a device until after
+.Nm savecore
+has copied the crash dump to another location, use the 
+.Dq late
+option.
 .Pp
 The
 .Nm swapoff

Modified: stable/12/sbin/swapon/swapon.c
==============================================================================
--- stable/12/sbin/swapon/swapon.c	Sun Sep 15 19:41:54 2019	(r352364)
+++ stable/12/sbin/swapon/swapon.c	Sun Sep 15 20:13:46 2019	(r352365)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/disk.h>
+#include <sys/disklabel.h>
 #include <sys/mdioctl.h>
 #include <sys/stat.h>
 #include <sys/sysctl.h>
@@ -761,8 +762,8 @@ swapon_trim(const char *name)
 	} else
 		errx(1, "%s has an invalid file type", name);
 	/* Trim the device. */
-	ioarg[0] = 0;
-	ioarg[1] = sz;
+	ioarg[0] = BBSIZE;
+	ioarg[1] = sz - BBSIZE;
 	if (ioctl(fd, DIOCGDELETE, ioarg) != 0)
 		warn("ioctl(DIOCGDELETE)");
 

Modified: stable/12/share/man/man5/fstab.5
==============================================================================
--- stable/12/share/man/man5/fstab.5	Sun Sep 15 19:41:54 2019	(r352364)
+++ stable/12/share/man/man5/fstab.5	Sun Sep 15 20:13:46 2019	(r352365)
@@ -220,8 +220,17 @@ For swap devices, the keyword
 .Dq trimonce
 triggers the delivery of a
 .Dv BIO_DELETE
-command to the device to mark
-all blocks as unused.
+command to the device.
+This command marks the device's blocks as unused, except those that
+might store a disk label.
+This marking can erase a crash dump.
+To delay
+.Nm swapon
+for a device until after
+.Nm savecore
+has copied the crash dump to another location, use the 
+.Dq late
+option.
 For vnode-backed swap spaces,
 .Dq file
 is supported in the

Modified: stable/12/sys/vm/swap_pager.c
==============================================================================
--- stable/12/sys/vm/swap_pager.c	Sun Sep 15 19:41:54 2019	(r352364)
+++ stable/12/sys/vm/swap_pager.c	Sun Sep 15 20:13:46 2019	(r352365)
@@ -83,6 +83,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/bio.h>
 #include <sys/buf.h>
 #include <sys/disk.h>
+#include <sys/disklabel.h>
 #include <sys/fcntl.h>
 #include <sys/mount.h>
 #include <sys/namei.h>
@@ -2240,10 +2241,11 @@ swaponsomething(struct vnode *vp, void *id, u_long nbl
 
 	sp->sw_blist = blist_create(nblks, M_WAITOK);
 	/*
-	 * Do not free the first two block in order to avoid overwriting
+	 * Do not free the first blocks in order to avoid overwriting
 	 * any bsd label at the front of the partition
 	 */
-	blist_free(sp->sw_blist, 2, nblks - 2);
+	blist_free(sp->sw_blist, howmany(BBSIZE, PAGE_SIZE),
+	    nblks - howmany(BBSIZE, PAGE_SIZE));
 
 	dvbase = 0;
 	mtx_lock(&sw_dev_mtx);
@@ -2261,7 +2263,7 @@ swaponsomething(struct vnode *vp, void *id, u_long nbl
 	sp->sw_end = dvbase + nblks;
 	TAILQ_INSERT_TAIL(&swtailq, sp, sw_list);
 	nswapdev++;
-	swap_pager_avail += nblks - 2;
+	swap_pager_avail += nblks - howmany(BBSIZE, PAGE_SIZE);
 	swap_total += nblks;
 	swapon_check_swzone();
 	swp_sizecheck();


More information about the svn-src-all mailing list