svn commit: r274410 - head/usr.bin/mkimg
Marcel Moolenaar
marcel at FreeBSD.org
Wed Nov 12 00:10:28 UTC 2014
Author: marcel
Date: Wed Nov 12 00:10:27 2014
New Revision: 274410
URL: https://svnweb.freebsd.org/changeset/base/274410
Log:
SEEK_DATA has interesting behaviour for sparse files on ZFS. A sparse file
with 128K of random data and truncated to 800K can have SEEK_DATA return -1
when given an offset of 128K. On UFS, the SEEK_DATA returns 800K (the size
of the file). SEEK_HOLE on ZFS seems to behave the same as UFS.
To handle this, map -1 to the size of the file (`end') when lseek returns
this for either SEEK_HOLE or SEEK_DATA. When sparse files are not supported
by the file system both `hole' and `data' will now be equal to `end' and we
will treat the entire file as data. This way, the -1 return for SEEK_DATA
on ZFS will end up doing the right thing.
Reported by: gjb@
MFC after: 3 days
Modified:
head/usr.bin/mkimg/image.c
Modified: head/usr.bin/mkimg/image.c
==============================================================================
--- head/usr.bin/mkimg/image.c Tue Nov 11 23:55:37 2014 (r274409)
+++ head/usr.bin/mkimg/image.c Wed Nov 12 00:10:27 2014 (r274410)
@@ -405,16 +405,18 @@ image_copyin_mapped(lba_t blk, int fd, u
error = 0;
while (!error && cur < end) {
hole = lseek(fd, cur, SEEK_HOLE);
+ if (hole == -1)
+ hole = end;
data = lseek(fd, cur, SEEK_DATA);
+ if (data == -1)
+ data = end;
/*
* Treat the entire file as data if sparse files
* are not supported by the underlying file system.
*/
- if (hole == -1 && data == -1) {
+ if (hole == end && data == end)
data = cur;
- hole = end;
- }
if (cur == hole && data > hole) {
hole = pos;
More information about the svn-src-head
mailing list