Reset the output file to favour appending to image in ntfsclone

When ntfsclone'ing to a file, the target file was truncated to the volume
size. This is not useful on file systems which support sparse files. In
the case of ntfs-3g this leads to prevent optimizations specific to
appending data. So when a sparse output file is detected, it is emptied
to benefit from subsequent appending of data.
edge.strict_endians
Jean-Pierre André 2014-03-11 09:54:53 +01:00
parent 7e38a29656
commit ddd3a8a329
2 changed files with 24 additions and 3 deletions

View File

@ -72,7 +72,7 @@ struct hd_geometry {
/* A few useful functions */
int ntfs_win32_set_sparse(int);
int ntfs_win32_ftruncate(int fd, s64 size);
int ntfs_win32_device_ftruncate(struct ntfs_device*, s64);
int ntfs_device_win32_ftruncate(struct ntfs_device*, s64);
#endif /* HAVE_WINDOWS_H */

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2003-2006 Szabolcs Szakacsits
* Copyright (c) 2004-2006 Anton Altaparmakov
* Copyright (c) 2010-2013 Jean-Pierre Andre
* Copyright (c) 2010-2014 Jean-Pierre Andre
* Special image format support copyright (c) 2004 Per Olofsson
*
* Clone NTFS data and/or metadata to a sparse file, image, device or stdout.
@ -388,7 +388,7 @@ static void version(void)
"Efficiently clone, image, restore or rescue an NTFS Volume.\n\n"
"Copyright (c) 2003-2006 Szabolcs Szakacsits\n"
"Copyright (c) 2004-2006 Anton Altaparmakov\n"
"Copyright (c) 2010-2013 Jean-Pierre Andre\n\n");
"Copyright (c) 2010-2014 Jean-Pierre Andre\n\n");
fprintf(stderr, "%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
exit(1);
}
@ -2299,6 +2299,27 @@ static void set_filesize(s64 filesize)
}
exit(1);
}
/*
* If truncate just created a sparse file, the ability
* to generically store big files has been checked, but no
* space has been reserved and available space has probably
* not been checked. Better reset the file so that we write
* sequentially to the end.
*/
if (!opt.no_action) {
#ifdef HAVE_WINDOWS_H
if (ftruncate(fd_out, 0))
Printf("Failed to reset the output file.\n");
#else
struct stat st;
int s;
s = fstat(fd_out, &st);
if (s || (!st.st_blocks && ftruncate(fd_out, 0)))
Printf("Failed to reset the output file.\n");
#endif
/* Proceed even if ftruncate failed */
}
}
static s64 open_image(void)