summaryrefslogtreecommitdiffstats
path: root/sbin/newfs
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/newfs
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/newfs')
-rw-r--r--sbin/newfs/mkfs.c2
-rw-r--r--sbin/newfs/newfs.812
-rw-r--r--sbin/newfs/newfs.c7
-rw-r--r--sbin/newfs/newfs.h1
4 files changed, 19 insertions, 3 deletions
diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c
index 8092290..96fa9eb 100644
--- a/sbin/newfs/mkfs.c
+++ b/sbin/newfs/mkfs.c
@@ -151,6 +151,8 @@ mkfs(struct partition *pp, char *fsys)
sblock.fs_flags |= FS_GJOURNAL;
if (lflag)
sblock.fs_flags |= FS_MULTILABEL;
+ if (tflag)
+ sblock.fs_flags |= FS_TRIM;
/*
* Validate the given file system size.
* Verify that its last block can actually be accessed.
diff --git a/sbin/newfs/newfs.8 b/sbin/newfs/newfs.8
index 10631f9..b542739 100644
--- a/sbin/newfs/newfs.8
+++ b/sbin/newfs/newfs.8
@@ -28,7 +28,7 @@
.\" @(#)newfs.8 8.6 (Berkeley) 5/3/95
.\" $FreeBSD$
.\"
-.Dd September 14, 2010
+.Dd December 9, 2010
.Dt NEWFS 8
.Os
.Sh NAME
@@ -36,7 +36,7 @@
.Nd construct a new UFS1/UFS2 file system
.Sh SYNOPSIS
.Nm
-.Op Fl EJNUln
+.Op Fl EJNUlnt
.Op Fl L Ar volname
.Op Fl O Ar filesystem-type
.Op Fl S Ar sector-size
@@ -241,6 +241,14 @@ A valid
.Ar size
value cannot be larger than the default one,
which means that the file system cannot extend into the reserved space.
+.It Fl t
+Turn on 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
The following options override the standard sizes for the disk geometry.
diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c
index b66e1ec..0e5b7da 100644
--- a/sbin/newfs/newfs.c
+++ b/sbin/newfs/newfs.c
@@ -91,6 +91,7 @@ int Xflag = 0; /* exit in middle of newfs for testing */
int Jflag; /* enable gjournal for file system */
int lflag; /* enable multilabel for file system */
int nflag; /* do not create .snap directory */
+int tflag; /* enable TRIM */
intmax_t fssize; /* file system size */
int sectorsize; /* bytes/sector */
int realsectorsize; /* bytes/sector in hardware */
@@ -139,7 +140,7 @@ main(int argc, char *argv[])
part_name = 'c';
reserved = 0;
while ((ch = getopt(argc, argv,
- "EJL:NO:RS:T:UXa:b:c:d:e:f:g:h:i:lm:no:p:r:s:")) != -1)
+ "EJL:NO:RS:T:UXa:b:c:d:e:f:g:h:i:lm:no:p:r:s:t")) != -1)
switch (ch) {
case 'E':
Eflag = 1;
@@ -279,6 +280,9 @@ main(int argc, char *argv[])
*cp != '\0' || fssize < 0)
errx(1, "%s: bad file system size", optarg);
break;
+ case 't':
+ tflag = 1;
+ break;
case '?':
default:
usage();
@@ -495,6 +499,7 @@ usage()
fprintf(stderr, "\t-p partition name (a..h)\n");
fprintf(stderr, "\t-r reserved sectors at the end of device\n");
fprintf(stderr, "\t-s file system size (sectors)\n");
+ fprintf(stderr, "\t-t enable TRIM\n");
exit(1);
}
diff --git a/sbin/newfs/newfs.h b/sbin/newfs/newfs.h
index 9da3226..8c826b1 100644
--- a/sbin/newfs/newfs.h
+++ b/sbin/newfs/newfs.h
@@ -85,6 +85,7 @@ extern int Xflag; /* exit in middle of newfs for testing */
extern int Jflag; /* enable gjournal for file system */
extern int lflag; /* enable multilabel MAC for file system */
extern int nflag; /* do not create .snap directory */
+extern int tflag; /* enable TRIM */
extern intmax_t fssize; /* file system size */
extern int sectorsize; /* bytes/sector */
extern int realsectorsize; /* bytes/sector in hardware*/
OpenPOWER on IntegriCloud