summaryrefslogtreecommitdiffstats
path: root/src/server/helper.c
diff options
context:
space:
mode:
authorSimon Rettberg2013-08-01 19:35:48 +0200
committerSimon Rettberg2013-08-01 19:35:48 +0200
commite7ad62c1b1627f7bab2524a4c30f1833f6b6767d (patch)
tree090473456331c3fa25eafc2db60e4c2808d808a9 /src/server/helper.c
parent[SERVER] Add command line options to create empty image of certain size with ... (diff)
downloaddnbd3-e7ad62c1b1627f7bab2524a4c30f1833f6b6767d.tar.gz
dnbd3-e7ad62c1b1627f7bab2524a4c30f1833f6b6767d.tar.xz
dnbd3-e7ad62c1b1627f7bab2524a4c30f1833f6b6767d.zip
[SERVER] Fix create_image() by adding fallback solutions for fallocate()
Diffstat (limited to 'src/server/helper.c')
-rw-r--r--src/server/helper.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/server/helper.c b/src/server/helper.c
index b028ad1..65239ea 100644
--- a/src/server/helper.c
+++ b/src/server/helper.c
@@ -162,3 +162,12 @@ int mkdir_p(const char* path)
if ( mkdir( buffer, 0750 ) != 0 && errno != EEXIST ) return FALSE;
return TRUE;
}
+
+int file_alloc(int fd, uint64_t offset, uint64_t size)
+{
+ if ( fallocate( fd, 0, offset, size ) == 0 ) return TRUE; // fast way
+ if ( posix_fallocate( fd, offset, size ) == 0 ) return TRUE; // slow way
+ if ( lseek( fd, offset + size - 1, SEEK_SET ) != offset ) return FALSE; // dumb way
+ if ( write( fd, "", 1 ) != 1 ) return FALSE;
+ return TRUE;
+}