Skip to content

Commit

Permalink
fallocate: add insert range support
Browse files Browse the repository at this point in the history
Based on patch 83cc932
("fallocate: introduce an option -c to support COLLAPSE_RANGE")

This patch includes FALLOC_FL_INSERT_RANGE flag
added to Linux kernel v4.1

Thanks to Pádraig Brady for insert range definition

Signed-off-by: Fabian Frederick <fabf@skynet.be>
  • Loading branch information
Fabian Frederick authored and karelzak committed Dec 2, 2016
1 parent 01544c5 commit b439065
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
3 changes: 3 additions & 0 deletions sys-utils/fallocate.1
Expand Up @@ -60,6 +60,9 @@ the destination file to the original, without the need for extra disk space.
.sp
See \fB\-\-punch\-hole\fP for a list of supported filesystems.
.TP
.BR \-i , " \-\-insert\-range"
Insert a hole of \fIlength\fR bytes from \fIoffset\fR, shifting existing data.
.TP
.BR \-l , " \-\-length " \fIlength
Specifies the length of the range, in bytes.
.TP
Expand Down
14 changes: 12 additions & 2 deletions sys-utils/fallocate.c
Expand Up @@ -40,7 +40,8 @@

#if defined(HAVE_LINUX_FALLOC_H) && \
(!defined(FALLOC_FL_KEEP_SIZE) || !defined(FALLOC_FL_PUNCH_HOLE) || \
!defined(FALLOC_FL_COLLAPSE_RANGE) || !defined(FALLOC_FL_ZERO_RANGE))
!defined(FALLOC_FL_COLLAPSE_RANGE) || !defined(FALLOC_FL_ZERO_RANGE) || \
!defined(FALLOC_FL_INSERT_RANGE))
# include <linux/falloc.h> /* non-libc fallback for FALLOC_FL_* flags */
#endif

Expand All @@ -61,6 +62,10 @@
# define FALLOC_FL_ZERO_RANGE 0x10
#endif

#ifndef FALLOC_FL_INSERT_RANGE
# define FALLOC_FL_INSERT_RANGE 0x20
#endif

#include "nls.h"
#include "strutils.h"
#include "c.h"
Expand All @@ -83,6 +88,7 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
fputs(USAGE_OPTIONS, out);
fputs(_(" -c, --collapse-range remove a range from the file\n"), out);
fputs(_(" -d, --dig-holes detect zeroes and replace with holes\n"), out);
fputs(_(" -i, --insert-range insert a hole at range, shifting existing data\n"), out);
fputs(_(" -l, --length <num> length for range operations, in bytes\n"), out);
fputs(_(" -n, --keep-size maintain the apparent size of the file\n"), out);
fputs(_(" -o, --offset <num> offset for range operations, in bytes\n"), out);
Expand Down Expand Up @@ -281,6 +287,7 @@ int main(int argc, char **argv)
{ "punch-hole", 0, 0, 'p' },
{ "collapse-range", 0, 0, 'c' },
{ "dig-holes", 0, 0, 'd' },
{ "insert-range", 0, 0, 'i' },
{ "zero-range", 0, 0, 'z' },
{ "offset", 1, 0, 'o' },
{ "length", 1, 0, 'l' },
Expand All @@ -300,7 +307,7 @@ int main(int argc, char **argv)
textdomain(PACKAGE);
atexit(close_stdout);

while ((c = getopt_long(argc, argv, "hvVncpdzl:o:", longopts, NULL))
while ((c = getopt_long(argc, argv, "hvVncpdizl:o:", longopts, NULL))
!= -1) {

err_exclusive_options(c, longopts, excl, excl_st);
Expand All @@ -315,6 +322,9 @@ int main(int argc, char **argv)
case 'd':
dig = 1;
break;
case 'i':
mode |= FALLOC_FL_INSERT_RANGE;
break;
case 'l':
length = cvtnum(optarg);
break;
Expand Down

0 comments on commit b439065

Please sign in to comment.