fallocate: introduce an option -c to support COLLAPSE_RANGE
Introduce a new option -c (or --collapse-range) to support a new flag FALLOC_FL_COLLAPSE_RANGE for fallocate(2). It will nullify a particular range [offset, offset+len] by shifting extents beyond the range to the beginning of the hole. Cc: Lukas Czerner <lczerner@redhat.com> Cc: Namjae Jeon <namjae.jeon@samsung.com> Cc: Ashish Sangwan <a.sangwan@samsung.com> Signed-off-by: Dongsu Park <dongsu.park@profitbricks.com>
This commit is contained in:
parent
2dc0c6283b
commit
83cc932d74
|
@ -6,6 +6,7 @@ fallocate \- preallocate or deallocate space to a file
|
|||
.B fallocate
|
||||
.RB [ \-n ]
|
||||
.RB [ \-p ]
|
||||
.RB [ \-c ]
|
||||
.RB [ \-o
|
||||
.IR offset ]
|
||||
.B \-l
|
||||
|
@ -54,6 +55,12 @@ implied.
|
|||
.IP
|
||||
You can think of this as doing a "\fBcp --sparse\fP" and
|
||||
renaming the dest file as the original, without the need for extra disk space.
|
||||
.IP "\fB\-c, \-\-collapse-range\fP"
|
||||
Collapse a particular file range to nullify the hole. Extents beyond the range
|
||||
[offset, offset+length] will be shifted to the beginning of hole. Hence this
|
||||
command does not leave a hole, while \fI\-\-punch-hole\fP leaves a hole
|
||||
instead of shifting extents. Both offset and length should be aligned to
|
||||
the block size of filesystem.
|
||||
.IP "\fB\-o, \-\-offset\fP \fIoffset\fP
|
||||
Specifies the beginning offset of the allocation, in bytes.
|
||||
.IP "\fB\-l, \-\-length\fP \fIlength\fP
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
#endif
|
||||
|
||||
#if defined(HAVE_LINUX_FALLOC_H) && \
|
||||
(!defined(FALLOC_FL_KEEP_SIZE) || !defined(FALLOC_FL_PUNCH_HOLE))
|
||||
(!defined(FALLOC_FL_KEEP_SIZE) || !defined(FALLOC_FL_PUNCH_HOLE) || \
|
||||
!defined(FALLOC_FL_COLLAPSE_RANGE))
|
||||
# include <linux/falloc.h> /* non-libc fallback for FALLOC_FL_* flags */
|
||||
#endif
|
||||
|
||||
|
@ -51,6 +52,10 @@
|
|||
# define FALLOC_FL_PUNCH_HOLE 2
|
||||
#endif
|
||||
|
||||
#ifndef FALLOC_FL_COLLAPSE_RANGE
|
||||
# define FALLOC_FL_COLLAPSE_RANGE 8
|
||||
#endif
|
||||
|
||||
#include "nls.h"
|
||||
#include "strutils.h"
|
||||
#include "c.h"
|
||||
|
@ -66,6 +71,7 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
|
|||
fprintf(out,
|
||||
_(" %s [options] <filename>\n"), program_invocation_short_name);
|
||||
fputs(USAGE_OPTIONS, out);
|
||||
fputs(_(" -c, --collapse-range collapse space in the file\n"), out);
|
||||
fputs(_(" -d, --dig-holes detect and dig holes\n"), out);
|
||||
fputs(_(" -l, --length <num> length of the (de)allocation, in bytes\n"), out);
|
||||
fputs(_(" -n, --keep-size don't modify the length of the file\n"), out);
|
||||
|
@ -262,6 +268,7 @@ int main(int argc, char **argv)
|
|||
{ "version", 0, 0, 'V' },
|
||||
{ "keep-size", 0, 0, 'n' },
|
||||
{ "punch-hole", 0, 0, 'p' },
|
||||
{ "collapse-range", 0, 0, 'c' },
|
||||
{ "dig-holes", 0, 0, 'd' },
|
||||
{ "offset", 1, 0, 'o' },
|
||||
{ "length", 1, 0, 'l' },
|
||||
|
@ -274,7 +281,8 @@ int main(int argc, char **argv)
|
|||
textdomain(PACKAGE);
|
||||
atexit(close_stdout);
|
||||
|
||||
while ((c = getopt_long(argc, argv, "hvVnpdl:o:", longopts, NULL)) != -1) {
|
||||
while ((c = getopt_long(argc, argv, "hvVncpdl:o:", longopts, NULL))
|
||||
!= -1) {
|
||||
switch(c) {
|
||||
case 'h':
|
||||
usage(stdout);
|
||||
|
@ -282,6 +290,9 @@ int main(int argc, char **argv)
|
|||
case 'V':
|
||||
printf(UTIL_LINUX_VERSION);
|
||||
return EXIT_SUCCESS;
|
||||
case 'c':
|
||||
mode |= FALLOC_FL_COLLAPSE_RANGE;
|
||||
break;
|
||||
case 'p':
|
||||
mode |= FALLOC_FL_PUNCH_HOLE;
|
||||
/* fall through */
|
||||
|
|
Loading…
Reference in New Issue