swap_pager.c reserves 2 blocks for a bsd label. Change that 2 to the

expression howmany(BBSIZE, PAGE_SIZE), where BBSIZE is the size of the
boot block area.  That can be less than 2 if PAGE_SIZE is big.

swapon(8) has an option to trim (delete) all the blocks of a device at
startup.  However, if the first of those blocks is a bsd label, then
trimming those blocks is destructive.  Change swapon to leave the
first BBSIZE bytes untrimmed.

Update manual pages to reflect changes in how swapon and how it may be
used, espeically in association with savecore.

Reviewed by: alc
Approved by: markj (mentor)
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D21191
This commit is contained in:
Doug Moore 2019-08-15 02:30:44 +00:00
parent c06ccdd2ba
commit 504f5e294e
4 changed files with 30 additions and 8 deletions

View File

@ -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

View File

@ -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)");

View File

@ -246,8 +246,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

View File

@ -79,6 +79,7 @@ __FBSDID("$FreeBSD$");
#include <sys/buf.h>
#include <sys/conf.h>
#include <sys/disk.h>
#include <sys/disklabel.h>
#include <sys/eventhandler.h>
#include <sys/fcntl.h>
#include <sys/lock.h>
@ -2298,10 +2299,11 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks,
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);
@ -2319,7 +2321,7 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks,
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();