From 83cc932d7412cb9d23bf9f06a9a54c8566e1a788 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Thu, 27 Feb 2014 11:35:07 +0100 Subject: 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 Cc: Namjae Jeon Cc: Ashish Sangwan Signed-off-by: Dongsu Park --- sys-utils/fallocate.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'sys-utils/fallocate.c') diff --git a/sys-utils/fallocate.c b/sys-utils/fallocate.c index d8a74bf91..f9c00e006 100644 --- a/sys-utils/fallocate.c +++ b/sys-utils/fallocate.c @@ -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 /* 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,12 +71,13 @@ static void __attribute__((__noreturn__)) usage(FILE *out) fprintf(out, _(" %s [options] \n"), program_invocation_short_name); fputs(USAGE_OPTIONS, out); - fputs(_(" -d, --dig-holes detect and dig holes\n"), out); - fputs(_(" -l, --length length of the (de)allocation, in bytes\n"), out); - fputs(_(" -n, --keep-size don't modify the length of the file\n"), out); - fputs(_(" -o, --offset offset of the (de)allocation, in bytes\n"), out); - fputs(_(" -p, --punch-hole punch holes in the file\n"), out); - fputs(_(" -v, --verbose verbose mode\n"), 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 length of the (de)allocation, in bytes\n"), out); + fputs(_(" -n, --keep-size don't modify the length of the file\n"), out); + fputs(_(" -o, --offset offset of the (de)allocation, in bytes\n"), out); + fputs(_(" -p, --punch-hole punch holes in the file\n"), out); + fputs(_(" -v, --verbose verbose mode\n"), out); fputs(USAGE_SEPARATOR, out); fputs(USAGE_HELP, out); @@ -258,15 +264,16 @@ int main(int argc, char **argv) loff_t offset = 0; static const struct option longopts[] = { - { "help", 0, 0, 'h' }, - { "version", 0, 0, 'V' }, - { "keep-size", 0, 0, 'n' }, - { "punch-hole", 0, 0, 'p' }, - { "dig-holes", 0, 0, 'd' }, - { "offset", 1, 0, 'o' }, - { "length", 1, 0, 'l' }, - { "verbose", 0, 0, 'v' }, - { NULL, 0, 0, 0 } + { "help", 0, 0, 'h' }, + { "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' }, + { "verbose", 0, 0, 'v' }, + { NULL, 0, 0, 0 } }; setlocale(LC_ALL, ""); @@ -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 */ -- cgit v1.2.3-55-g7522