Date: Sat, 22 Jun 2019 20:09:42 +0300 From: Konstantin Belousov <kostikbel@gmail.com> To: Doug Moore <dougm@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r349286 - in head: sbin/swapon share/man/man5 Message-ID: <20190622170942.GN8697@kib.kiev.ua> In-Reply-To: <201906220316.x5M3G2sp095548@repo.freebsd.org> References: <201906220316.x5M3G2sp095548@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jun 22, 2019 at 03:16:02AM +0000, Doug Moore wrote: > Author: dougm > Date: Sat Jun 22 03:16:01 2019 > New Revision: 349286 > URL: https://svnweb.freebsd.org/changeset/base/349286 > > Log: > Modify swapon(8) to invoke BIO_DELETE to trim swap devices, either if > '-E' appears on the swapon command line, or if "trimonce" appears as > an fstab option. > > Discussed at: BSDCAN > Tested by: markj > Reviewed by: markj > Approved by: markj (mentor) > Differential Revision:https://reviews.freebsd.org/D20599 > > Modified: > head/sbin/swapon/swapon.8 > head/sbin/swapon/swapon.c > head/share/man/man5/fstab.5 > > Modified: head/sbin/swapon/swapon.8 > ============================================================================== > --- head/sbin/swapon/swapon.8 Sat Jun 22 01:20:45 2019 (r349285) > +++ head/sbin/swapon/swapon.8 Sat Jun 22 03:16:01 2019 (r349286) > @@ -28,7 +28,7 @@ > .\" @(#)swapon.8 8.1 (Berkeley) 6/5/93 > .\" $FreeBSD$ > .\" > -.Dd October 21, 2016 > +.Dd June 21, 2019 > .Dt SWAPON 8 > .Os > .Sh NAME > @@ -38,7 +38,7 @@ > .Nm swapon > .Oo Fl F Ar fstab > .Oc > -.Fl aLq | Ar > +.Fl aLq | E Ar > .Nm swapoff > .Oo Fl F Ar fstab > .Oc > @@ -86,6 +86,11 @@ If the > option is used, > informational messages will not be > written to standard output when a swap device is added. > +The > +.Fl E > +option causes each of following devices to receive a > +.Dv BIO_DELETE > +command to mark all blocks as unused. > .Pp > The > .Nm swapoff > > Modified: head/sbin/swapon/swapon.c > ============================================================================== > --- head/sbin/swapon/swapon.c Sat Jun 22 01:20:45 2019 (r349285) > +++ head/sbin/swapon/swapon.c Sat Jun 22 03:16:01 2019 (r349286) > @@ -43,6 +43,7 @@ static char sccsid[] = "@(#)swapon.c 8.1 (Berkeley) 6/ > #include <sys/cdefs.h> > __FBSDID("$FreeBSD$"); > > +#include <sys/disk.h> > #include <sys/param.h> > #include <sys/types.h> > #include <sys/mdioctl.h> > @@ -77,7 +78,7 @@ static int run_cmd(int *, const char *, ...) __printfl > > static enum { SWAPON, SWAPOFF, SWAPCTL } orig_prog, which_prog = SWAPCTL; > > -static int qflag; > +static int Eflag, qflag; > > int > main(int argc, char **argv) > @@ -100,7 +101,7 @@ main(int argc, char **argv) > > doall = 0; > etc_fstab = NULL; > - while ((ch = getopt(argc, argv, "AadghklLmqsUF:")) != -1) { > + while ((ch = getopt(argc, argv, "AadEghklLmqsUF:")) != -1) { > switch(ch) { > case 'A': > if (which_prog == SWAPCTL) { > @@ -121,6 +122,12 @@ main(int argc, char **argv) > else > usage(); > break; > + case 'E': > + if (which_prog == SWAPON) > + Eflag = 2; > + else > + usage(); > + break; > case 'g': > hflag = 'G'; > break; > @@ -182,8 +189,10 @@ main(int argc, char **argv) > strstr(fsp->fs_mntops, "late") == NULL && > late != 0) > continue; > + Eflag |= (strstr(fsp->fs_mntops, "trimonce") != NULL); > swfile = swap_on_off(fsp->fs_spec, 1, > fsp->fs_mntops); > + Eflag &= ~1; > if (swfile == NULL) { > ret = 1; > continue; > @@ -378,12 +387,22 @@ swap_on_geli_args(const char *mntops) > return (NULL); > } > } else if (strcmp(token, "notrim") == 0) { > + if (Eflag) { > + warn("Options \"notrim\" and " > + "\"trimonce\" conflict"); > + free(ops); > + return (NULL); > + } > Tflag = " -T "; > } else if (strcmp(token, "late") == 0) { > /* ignore known option */ > } else if (strcmp(token, "noauto") == 0) { > /* ignore known option */ > - } else if (strcmp(token, "sw") != 0) { > + } else if (strcmp(token, "sw") == 0) { > + /* ignore known option */ > + } else if (strcmp(token, "trimonce") == 0) { > + /* ignore known option */ > + } else { > warnx("Invalid option: %s", token); > free(ops); > return (NULL); > @@ -721,14 +740,42 @@ run_cmd(int *ofd, const char *cmdline, ...) > return (WEXITSTATUS(status)); > } > > +static void > +swap_trim(const char *name) > +{ > + struct stat sb; > + off_t ioarg[2], sz; > + int fd; > + > + fd = open(name, O_WRONLY); > + if (fd < 0) > + errx(1, "Cannot open %s", name); > + if (fstat(fd, &sb) < 0) > + errx(1, "Cannot stat %s", name); > + if (S_ISREG(sb.st_mode)) > + sz = sb.st_size; > + else if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) { S_ISBLK check is useless or even wrong. > + if (ioctl(fd, DIOCGMEDIASIZE, &sz) != 0) > + err(1, "ioctl(DIOCGMEDIASIZE)"); > + } else > + errx(1, "%s has an invalid file type", name); > + ioarg[0] = 0; > + ioarg[1] = sz; > + if (ioctl(fd, DIOCGDELETE, ioarg) != 0) > + warn("ioctl(DIOCGDELETE)"); > + close(fd); > +} > + > static const char * > swap_on_off_sfile(const char *name, int doingall) > { > int error; > > - if (which_prog == SWAPON) > + if (which_prog == SWAPON) { > + if (Eflag) > + swap_trim(name); > error = swapon(name); > - else /* SWAPOFF */ > + } else /* SWAPOFF */ > error = swapoff(name); > > if (error == -1) { > @@ -759,6 +806,8 @@ usage(void) > fprintf(stderr, "usage: %s ", getprogname()); > switch(orig_prog) { > case SWAPON: > + fprintf(stderr, "[-F fstab] -aLq | [-E] file ...\n"); > + break; > case SWAPOFF: > fprintf(stderr, "[-F fstab] -aLq | file ...\n"); > break; > > Modified: head/share/man/man5/fstab.5 > ============================================================================== > --- head/share/man/man5/fstab.5 Sat Jun 22 01:20:45 2019 (r349285) > +++ head/share/man/man5/fstab.5 Sat Jun 22 03:16:01 2019 (r349286) > @@ -216,6 +216,12 @@ then the special file is made available as a piece of > space by the > .Xr swapon 8 > command at the end of the system reboot procedure. > +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. > For vnode-backed swap spaces, > .Dq file > is supported in the
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190622170942.GN8697>