[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH] fstrim: new applet
From:       souf <souf_oued () yahoo ! fr>
Date:       2012-03-24 13:06:37
Message-ID: 4F6DC6DD.4020203 () yahoo ! fr
[Download RAW message or body]

Hi list,

This patch adds a new applet: fstrim.

fstrim is used on a mounted filesystem to discard (or "trim") blocks 
which are not in use by the filesystem. This is useful for solid-state 
drives (SSDs) and thinly-provisioned storage.

function                                             old     new   delta
.rodata                                           147233  147545    +312
fstrim_main                                            -     276    +276
fstrim_sfx                                             -     128    +128
packed_usage                                       28175   28251     +76
applet_main                                         2768    2776      +8
applet_names                                        2368    2375      +7
applet_nameofs                                       692     694      +2
applet_install_loc                                   173     174      +1
------------------------------------------------------------------------------
(add/remove: 3/0 grow/shrink: 6/0 up/down: 810/0)       Total: 810 bytes

Regards.

["fstrim.patch" (text/x-patch)]

diff -U 3 -H -d -p -r -N -- busybox.orig/include/applets.src.h busybox/include/applets.src.h
--- busybox.orig/include/applets.src.h	2012-03-19 12:22:57.000000000 +0100
+++ busybox/include/applets.src.h	2012-03-20 21:15:15.639036183 +0100
@@ -161,6 +161,7 @@ IF_FSCK(APPLET(fsck, BB_DIR_SBIN, BB_SUI
 //IF_E2FSCK(APPLET_ODDNAME(fsck.ext2, e2fsck, BB_DIR_SBIN, BB_SUID_DROP, fsck_ext2))
 //IF_E2FSCK(APPLET_ODDNAME(fsck.ext3, e2fsck, BB_DIR_SBIN, BB_SUID_DROP, fsck_ext3))
 IF_FSCK_MINIX(APPLET_ODDNAME(fsck.minix, fsck_minix, BB_DIR_SBIN, BB_SUID_DROP, fsck_minix))
+IF_FSTRIM(APPLET(fstrim, BB_DIR_SBIN, BB_SUID_DROP))
 IF_FSYNC(APPLET_NOFORK(fsync, fsync, BB_DIR_BIN, BB_SUID_DROP, fsync))
 IF_FTPD(APPLET(ftpd, BB_DIR_USR_SBIN, BB_SUID_DROP))
 IF_FTPGET(APPLET_ODDNAME(ftpget, ftpgetput, BB_DIR_USR_BIN, BB_SUID_DROP, ftpget))
diff -U 3 -H -d -p -r -N -- busybox.orig/util-linux/Config.src busybox/util-linux/Config.src
--- busybox.orig/util-linux/Config.src	2012-03-19 12:22:57.000000000 +0100
+++ busybox/util-linux/Config.src	2012-03-20 21:12:03.619038140 +0100
@@ -246,6 +246,13 @@ config FSCK_MINIX
 	  check for and attempt to repair any corruption that occurs to a minix
 	  filesystem.
 
+config FSTRIM
+	bool "fstrim"
+	default y
+	select PLATFORM_LINUX
+	help
+	  discard unused blocks on a mounted filesystem.
+
 config MKFS_EXT2
 	bool "mkfs_ext2"
 	default y
diff -U 3 -H -d -p -r -N -- busybox.orig/util-linux/Kbuild.src busybox/util-linux/Kbuild.src
--- busybox.orig/util-linux/Kbuild.src	2012-03-19 12:22:57.000000000 +0100
+++ busybox/util-linux/Kbuild.src	2012-03-20 21:13:04.175037526 +0100
@@ -18,6 +18,7 @@ lib-$(CONFIG_FINDFS)            += findf
 lib-$(CONFIG_FLOCK)             += flock.o
 lib-$(CONFIG_FREERAMDISK)       += freeramdisk.o
 lib-$(CONFIG_FSCK_MINIX)        += fsck_minix.o
+lib-$(CONFIG_FSTRIM)            += fstrim.o
 lib-$(CONFIG_GETOPT)            += getopt.o
 lib-$(CONFIG_HEXDUMP)           += hexdump.o
 lib-$(CONFIG_HWCLOCK)           += hwclock.o
diff -U 3 -H -d -p -r -N -- busybox.orig/util-linux/fstrim.c busybox/util-linux/fstrim.c
--- busybox.orig/util-linux/fstrim.c	1970-01-01 01:00:00.000000000 +0100
+++ busybox/util-linux/fstrim.c	2012-03-20 20:36:14.000000000 +0100
@@ -0,0 +1,116 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * fstrim.c - discard the part (or whole) of mounted filesystem.
+ *
+ * 03 March 2012 - Malek Degachi <malek-degachi@laposte.net>
+ * Adapted for busybox from util-linux-2.12a.
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+
+//usage:#define fstrim_trivial_usage
+//usage:       "[Options] <mountpoint>"
+//usage:#define fstrim_full_usage "\n\n"
+//usage:       "Options:"
+//usage:	IF_LONG_OPTS(
+//usage:     "\n	-o,--offset=offset	offset in bytes to discard from"
+//usage:     "\n	-l,--length=length	length of bytes to discard from the offset"
+//usage:     "\n	-m,--minimum=minimum	minimum extent length to discard"
+//usage:     "\n	-v,--verbose		print number of discarded bytes"
+//usage:	)
+//usage:	IF_NOT_LONG_OPTS(
+//usage:     "\n	-o offset	offset in bytes to discard from"
+//usage:     "\n	-l length	length of bytes to discard from the offset"
+//usage:     "\n	-m minimum	minimum extent length to discard"
+//usage:     "\n	-v,		print number of discarded bytes"
+//usage:	)
+
+#include "libbb.h"
+#include <linux/fs.h>
+
+#ifndef FITRIM
+struct fstrim_range {
+	uint64_t start;
+	uint64_t len;
+	uint64_t minlen;
+};
+#define FITRIM		_IOWR('X', 121, struct fstrim_range)
+#endif
+
+static const struct suffix_mult fstrim_sfx[] = {
+	{ "KiB", 1024 },
+	{ "kiB", 1024 },
+	{ "K", 1024 },
+	{ "k", 1024 },
+	{ "MiB", 1048576 },
+	{ "miB", 1048576 },
+	{ "M", 1048576 },
+	{ "m", 1048576 },
+	{ "GiB", 1073741824 },
+	{ "giB", 1073741824 },
+	{ "G", 1073741824 },
+	{ "g", 1073741824 },
+	{ "KB", 1000 },
+	{ "MB", 1000000 },
+	{ "GB", 1000000000 },
+	{ "", 0 }
+};
+
+int fstrim_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int fstrim_main(int argc UNUSED_PARAM, char **argv)
+{
+	struct fstrim_range range;
+	char *arg_o;
+	char *arg_l;
+	char *arg_m;
+	unsigned opts;
+	int fd;
+
+	enum {
+		OPT_o = (1 << 0),
+		OPT_l = (1 << 1),
+		OPT_m = (1 << 2),
+		OPT_v = (1 << 3),
+	};
+
+#if ENABLE_LONG_OPTS
+	static const char getopt_longopts[] ALIGN1 =
+		"offset\0"    Required_argument    "o"
+		"length\0"    Required_argument    "l"
+		"minimum\0"   Required_argument    "m"
+		"verbose\0"   No_argument          "v"
+		;
+	applet_long_options = getopt_longopts;
+#endif
+
+	opt_complementary = "=1";
+	opts = getopt32(argv, "o:l:m:v", &arg_o, &arg_l, &arg_m);
+
+	memset(&range, 0, sizeof(range));
+	range.len = ULLONG_MAX;
+
+	if (opts & OPT_o) {
+		range.start = xatoull_sfx(arg_o, fstrim_sfx);
+	}
+
+	if (opts & OPT_l) {
+		range.len = xatoull_sfx(arg_l, fstrim_sfx);
+	}
+
+	if (opts & OPT_m) {
+		range.minlen = xatoull_sfx(arg_m, fstrim_sfx);
+	}
+
+	if (find_block_device(argv[optind])) {
+		fd = xopen_nonblocking(argv[optind]);
+		xioctl(fd, FITRIM, &range);
+		close(fd);
+
+		if (opts & OPT_v)
+			printf("%s: %llu bytes was trimmed\n", argv[optind], range.len);
+//			printf("%s: %s bytes was trimmed\n", argv[optind], make_human_readable_str(range.len, 1, 0));
+	}
+
+	return EXIT_SUCCESS;
+}
+


_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic