In trimming on startup, invoke swapon before closing the fd used for

trimming so that a geli device isn't detached before swapon is
invoked.

Submitted by: sigsys_gmail.com
Discussed with: alc
Approved by: markj (mentor)
Differential Revision:	https://reviews.freebsd.org/D21006
This commit is contained in:
Doug Moore 2019-07-20 20:47:07 +00:00
parent b16e57a6c9
commit 6d5685c762
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=350183

View file

@ -739,12 +739,12 @@ run_cmd(int *ofd, const char *cmdline, ...)
return (WEXITSTATUS(status));
}
static void
swap_trim(const char *name)
static int
swapon_trim(const char *name)
{
struct stat sb;
off_t ioarg[2], sz;
int fd;
int error, fd;
fd = open(name, O_WRONLY);
if (fd < 0)
@ -762,7 +762,16 @@ swap_trim(const char *name)
ioarg[1] = sz;
if (ioctl(fd, DIOCGDELETE, ioarg) != 0)
warn("ioctl(DIOCGDELETE)");
/*
* swapon is invoked after trimming, so that the trimming doesn't happen
* after the device is in use for swapping, but before the fd is closed,
* for the benefit of geli, which could otherwise detach the device,
* before swapon, on close.
*/
error = swapon(name);
close(fd);
return (error);
}
static const char *
@ -770,11 +779,9 @@ swap_on_off_sfile(const char *name, int doingall)
{
int error;
if (which_prog == SWAPON) {
if (Eflag)
swap_trim(name);
error = swapon(name);
} else /* SWAPOFF */
if (which_prog == SWAPON)
error = Eflag ? swapon_trim(name) : swapon(name);
else /* SWAPOFF */
error = swapoff(name);
if (error == -1) {