aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-04-11 13:33:54 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-04-11 13:33:54 +0200
commit67918b32abb55d9ba6b329cf77660204d2385aa8 (patch)
treee0aaf741cfe39de236b43af5506b7d70b1fd7171
parentb9512fa6b32dacabdec3edf12ebfab927d1402ae (diff)
downloadbusybox-w32-67918b32abb55d9ba6b329cf77660204d2385aa8.tar.gz
busybox-w32-67918b32abb55d9ba6b329cf77660204d2385aa8.tar.bz2
busybox-w32-67918b32abb55d9ba6b329cf77660204d2385aa8.zip
fallocate: new applet
NAME fallocate - preallocate or deallocate space to a file SYNOPSIS fallocate [-c|-p|-z] [-o offset] -l length [-n] filename fallocate -d [-o offset] [-l length] filename DESCRIPTION fallocate is used to manipulate the allocated disk space for a file, either to deallocate or preallocate it. For filesystems which support the fallocate system call, preallocation is done quickly by allocating blocks and marking them as uninitialized, requiring no IO to the data blocks. This is much faster than creating a file by filling it with zeroes. function old new delta fallocate_main - 179 +179 applet_names 2597 2606 +9 applet_main 1504 1508 +4 applet_suid 94 95 +1 applet_install_loc 188 189 +1 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--util-linux/fallocate.c104
-rw-r--r--util-linux/fsfreeze.c2
2 files changed, 105 insertions, 1 deletions
diff --git a/util-linux/fallocate.c b/util-linux/fallocate.c
new file mode 100644
index 000000000..1cd851bde
--- /dev/null
+++ b/util-linux/fallocate.c
@@ -0,0 +1,104 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Copyright (C) 2017 Denys Vlasenko <vda.linux@googlemail.com>
4 *
5 * Licensed under GPLv2, see file LICENSE in this source tree.
6 */
7
8//config:config FALLOCATE
9//config: bool "fallocate"
10//config: default y
11//config: help
12//config: Preallocate space for files.
13
14//applet:IF_FALLOCATE(APPLET(fallocate, BB_DIR_USR_BIN, BB_SUID_DROP))
15
16//kbuild:lib-$(CONFIG_FALLOCATE) += fallocate.o
17
18//usage:#define fallocate_trivial_usage
19//usage: "[-o OFS] -l LEN FILE"
20// fallocate [-c|-p|-z] [-n] [-o OFS] -l LEN FILE
21// fallocate -d [-o OFS] [-l LEN] FILE
22//usage:#define fallocate_full_usage "\n\n"
23//usage: "Preallocate space for FILE\n"
24// "\n -c Remove range"
25// "\n -p Make hole"
26// "\n -z Zero and allocate range"
27// "\n -d Convert zeros to holes"
28// "\n -n Keep size"
29//usage: "\n -o OFS Offset of range"
30//usage: "\n -l LEN Length of range"
31
32//Upstream options:
33//The options --collapse-range, --dig-holes, --punch-hole and --zero-range
34//are mutually exclusive.
35//-c, --collapse-range
36// Removes a byte range from a file, without leaving a hole. The byte range
37// to be collapsed starts at offset and continues for length bytes.
38// At the completion of the operation, the contents of the file starting
39// at the location offset+length will be appended at the location offset,
40// and the file will be length bytes smaller. The option --keep-size may
41// not be specified for the collapse-range operation.
42//-d, --dig-holes
43// Detect and dig holes. This makes the file sparse in-place, without using
44// extra disk space. The minimum size of the hole depends on filesystem I/O
45// block size (usually 4096 bytes). Also,
46//-l, --length length
47// Specifies the length of the range, in bytes.
48//-n, --keep-size
49// Do not modify the apparent length of the file. This may effectively
50// allocate blocks past EOF, which can be removed with a truncate.
51//-o, --offset offset
52// Specifies the beginning offset of the range, in bytes.
53//-p, --punch-hole
54// Deallocates space (i.e., creates a hole) in the byte range starting
55// at offset and continuing for length bytes. Within the specified range,
56// partial filesystem blocks are zeroed, and whole
57// filesystem blocks are removed from the file. After a successful call,
58// subsequent reads from this range will return zeroes. This option may not
59// be specified at the same time as the
60// --zero-range option. Also, when using this option, --keep-size is implied.
61//-z, --zero-range
62// Zeroes space in the byte range starting at offset and continuing for
63// length bytes. Within the specified range, blocks are preallocated for
64// the regions that span the holes in the file. After
65// a successful call, subsequent reads from this range will return zeroes.
66// Zeroing is done within the filesystem preferably by converting the range
67// into unwritten extents. This approach means that the specified range
68// will not be physically zeroed out on the device (except for partial
69// blocks at the either end of the range), and I/O is (otherwise) required
70// only to update metadata.
71// Option --keep-size can be specified to prevent file length modification.
72
73#include "libbb.h"
74
75int fallocate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
76int fallocate_main(int argc UNUSED_PARAM, char **argv)
77{
78 const char *str_l;
79 const char *str_o = "0";
80 off_t ofs, len;
81 unsigned opts;
82 int fd;
83
84 /* exactly one non-option arg */
85 opt_complementary = "=1";
86 opts = getopt32(argv, "l:o:", &str_l, &str_o);
87 if (!(opts & 1))
88 bb_show_usage();
89
90 ofs = xatoull_sfx(str_o, kmg_i_suffixes);
91 len = xatoull_sfx(str_l, kmg_i_suffixes);
92
93 argv += optind;
94 fd = xopen3(*argv, O_RDWR | O_CREAT, 0666);
95
96 /* posix_fallocate has unusual method of returning error */
97 /* maybe use Linux-specific fallocate(int fd, int mode, off_t offset, off_t len) instead? */
98 if ((errno = posix_fallocate(fd, ofs, len)) != 0)
99 bb_perror_msg_and_die("fallocate '%s'", *argv);
100
101 /* util-linux also performs fsync(fd); */
102
103 return EXIT_SUCCESS;
104}
diff --git a/util-linux/fsfreeze.c b/util-linux/fsfreeze.c
index fb1ebdc1e..70dec24ec 100644
--- a/util-linux/fsfreeze.c
+++ b/util-linux/fsfreeze.c
@@ -13,7 +13,7 @@
13//config: help 13//config: help
14//config: Halt new accesses and flush writes on a mounted filesystem. 14//config: Halt new accesses and flush writes on a mounted filesystem.
15 15
16//applet:IF_FSFREEZE(APPLET(fsfreeze, BB_DIR_SBIN, BB_SUID_DROP)) 16//applet:IF_FSFREEZE(APPLET(fsfreeze, BB_DIR_USR_SBIN, BB_SUID_DROP))
17 17
18//kbuild:lib-$(CONFIG_FSFREEZE) += fsfreeze.o 18//kbuild:lib-$(CONFIG_FSFREEZE) += fsfreeze.o
19 19