summaryrefslogtreecommitdiffstats
path: root/sbin/tunefs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-12-29 12:31:18 +0000
committerkib <kib@FreeBSD.org>2010-12-29 12:31:18 +0000
commitd69a17ac0a884f83a0d321fb56d071796e6a1568 (patch)
tree8ab612371e7500ee1c3bac44a09208490c294417 /sbin/tunefs
parent17dccd1898b6a0ddd49fcd77d7314ddc494cbac8 (diff)
downloadFreeBSD-src-d69a17ac0a884f83a0d321fb56d071796e6a1568.zip
FreeBSD-src-d69a17ac0a884f83a0d321fb56d071796e6a1568.tar.gz
Add support for FS_TRIM to user-mode UFS utilities.
Reviewed by: mckusick, pjd, pho Tested by: pho MFC after: 1 month
Diffstat (limited to 'sbin/tunefs')
-rw-r--r--sbin/tunefs/tunefs.811
-rw-r--r--sbin/tunefs/tunefs.c44
2 files changed, 50 insertions, 5 deletions
diff --git a/sbin/tunefs/tunefs.8 b/sbin/tunefs/tunefs.8
index a883cd4..a8904db 100644
--- a/sbin/tunefs/tunefs.8
+++ b/sbin/tunefs/tunefs.8
@@ -28,7 +28,7 @@
.\" @(#)tunefs.8 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
.\"
-.Dd March 6, 2010
+.Dd December 9, 2010
.Dt TUNEFS 8
.Os
.Sh NAME
@@ -51,6 +51,7 @@
.Op Fl p
.Op Fl s Ar avgfpdir
.Op Fl S Ar size
+.Op Fl t Cm enable | disable
.Ar special | filesystem
.Sh DESCRIPTION
The
@@ -143,6 +144,14 @@ Specify the expected number of files per directory.
.It Fl S Ar size
Specify the softdep journal size in bytes.
The minimum is 4M.
+.It Fl t Cm enable | disable
+Turn on/off the TRIM enable flag.
+If enabled, and if the underlying device supports the BIO_DELETE
+command, the file system will send a delete request to the underlying
+device for each freed block.
+The trim enable flag is typically set when the underlying device
+uses flash-memory as the device can use the delete command to
+pre-zero or at least avoid copying blocks that have been deleted.
.El
.Pp
At least one of the above flags is required.
diff --git a/sbin/tunefs/tunefs.c b/sbin/tunefs/tunefs.c
index b2ea602..08c127d 100644
--- a/sbin/tunefs/tunefs.c
+++ b/sbin/tunefs/tunefs.c
@@ -82,11 +82,13 @@ int
main(int argc, char *argv[])
{
char *avalue, *jvalue, *Jvalue, *Lvalue, *lvalue, *Nvalue, *nvalue;
+ char *tvalue;
const char *special, *on;
const char *name;
int active;
int Aflag, aflag, eflag, evalue, fflag, fvalue, jflag, Jflag, Lflag;
int lflag, mflag, mvalue, Nflag, nflag, oflag, ovalue, pflag, sflag;
+ int tflag;
int svalue, Sflag, Svalue;
int ch, found_arg, i;
const char *chg[2];
@@ -96,12 +98,13 @@ main(int argc, char *argv[])
if (argc < 3)
usage();
Aflag = aflag = eflag = fflag = jflag = Jflag = Lflag = lflag = 0;
- mflag = Nflag = nflag = oflag = pflag = sflag = 0;
+ mflag = Nflag = nflag = oflag = pflag = sflag = tflag = 0;
avalue = jvalue = Jvalue = Lvalue = lvalue = Nvalue = nvalue = NULL;
evalue = fvalue = mvalue = ovalue = svalue = Svalue = 0;
active = 0;
found_arg = 0; /* At least one arg is required. */
- while ((ch = getopt(argc, argv, "Aa:e:f:j:J:L:l:m:N:n:o:ps:S:")) != -1)
+ while ((ch = getopt(argc, argv, "Aa:e:f:j:J:L:l:m:N:n:o:ps:S:t:"))
+ != -1)
switch (ch) {
case 'A':
@@ -268,6 +271,18 @@ main(int argc, char *argv[])
Sflag = 1;
break;
+ case 't':
+ found_arg = 1;
+ name = "trim";
+ tvalue = optarg;
+ if (strcmp(tvalue, "enable") != 0 &&
+ strcmp(tvalue, "disable") != 0) {
+ errx(10, "bad %s (options are %s)",
+ name, "`enable' or `disable'");
+ }
+ tflag = 1;
+ break;
+
default:
usage();
}
@@ -493,6 +508,24 @@ main(int argc, char *argv[])
sblock.fs_avgfpdir = svalue;
}
}
+ if (tflag) {
+ name = "issue TRIM to the disk";
+ if (strcmp(tvalue, "enable") == 0) {
+ if (sblock.fs_flags & FS_TRIM)
+ warnx("%s remains unchanged as enabled", name);
+ else {
+ sblock.fs_flags |= FS_TRIM;
+ warnx("%s set", name);
+ }
+ } else if (strcmp(tvalue, "disable") == 0) {
+ if ((~sblock.fs_flags & FS_TRIM) == FS_TRIM)
+ warnx("%s remains unchanged as disabled", name);
+ else {
+ sblock.fs_flags &= ~FS_TRIM;
+ warnx("%s cleared", name);
+ }
+ }
+ }
if (sbwrite(&disk, Aflag) == -1)
goto err;
@@ -1011,12 +1044,13 @@ out:
void
usage(void)
{
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
+ fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
"usage: tunefs [-A] [-a enable | disable] [-e maxbpg] [-f avgfilesize]",
" [-J enable | disable] [-j enable | disable]",
" [-L volname] [-l enable | disable] [-m minfree]",
" [-N enable | disable] [-n enable | disable]",
-" [-o space | time] [-p] [-s avgfpdir] special | filesystem");
+" [-o space | time] [-p] [-s avgfpdir] [-t enable | disable]",
+" special | filesystem");
exit(2);
}
@@ -1035,6 +1069,8 @@ printfs(void)
(sblock.fs_flags & FS_SUJ)? "enabled" : "disabled");
warnx("gjournal: (-J) %s",
(sblock.fs_flags & FS_GJOURNAL)? "enabled" : "disabled");
+ warnx("trim: (-t) %s",
+ (sblock.fs_flags & FS_TRIM)? "enabled" : "disabled");
warnx("maximum blocks per file in a cylinder group: (-e) %d",
sblock.fs_maxbpg);
warnx("average file size: (-f) %d",
OpenPOWER on IntegriCloud