Windows sparse file support (Frediano Ziglio)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2027 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
3587d7e69c
commit
beac80cd43
@ -10,6 +10,7 @@ version 0.8.2:
|
|||||||
- USB updates (Paul Brook)
|
- USB updates (Paul Brook)
|
||||||
- UDP character devices (Jason Wessel)
|
- UDP character devices (Jason Wessel)
|
||||||
- TCP character devices
|
- TCP character devices
|
||||||
|
- Windows sparse file support (Frediano Ziglio)
|
||||||
|
|
||||||
version 0.8.1:
|
version 0.8.1:
|
||||||
|
|
||||||
|
46
block.c
46
block.c
@ -761,6 +761,51 @@ static void raw_close(BlockDriverState *bs)
|
|||||||
close(s->fd);
|
close(s->fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winioctl.h>
|
||||||
|
|
||||||
|
int qemu_ftruncate64(int fd, int64_t length)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER li;
|
||||||
|
LONG high;
|
||||||
|
HANDLE h;
|
||||||
|
BOOL res;
|
||||||
|
|
||||||
|
if ((GetVersion() & 0x80000000UL) && (length >> 32) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
h = (HANDLE)_get_osfhandle(fd);
|
||||||
|
|
||||||
|
/* get current position, ftruncate do not change position */
|
||||||
|
li.HighPart = 0;
|
||||||
|
li.LowPart = SetFilePointer (h, 0, &li.HighPart, FILE_CURRENT);
|
||||||
|
if (li.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
high = length >> 32;
|
||||||
|
if (!SetFilePointer(h, (DWORD) length, &high, FILE_BEGIN))
|
||||||
|
return -1;
|
||||||
|
res = SetEndOfFile(h);
|
||||||
|
|
||||||
|
/* back to old position */
|
||||||
|
SetFilePointer(h, li.LowPart, &li.HighPart, FILE_BEGIN);
|
||||||
|
return res ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_sparse(int fd)
|
||||||
|
{
|
||||||
|
DWORD returned;
|
||||||
|
return (int) DeviceIoControl((HANDLE)_get_osfhandle(fd), FSCTL_SET_SPARSE,
|
||||||
|
NULL, 0, NULL, 0, &returned, NULL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int set_sparse(int fd)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int raw_create(const char *filename, int64_t total_size,
|
static int raw_create(const char *filename, int64_t total_size,
|
||||||
const char *backing_file, int flags)
|
const char *backing_file, int flags)
|
||||||
{
|
{
|
||||||
@ -773,6 +818,7 @@ static int raw_create(const char *filename, int64_t total_size,
|
|||||||
0644);
|
0644);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
set_sparse(fd);
|
||||||
ftruncate(fd, total_size * 512);
|
ftruncate(fd, total_size * 512);
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
5
vl.h
5
vl.h
@ -51,8 +51,9 @@
|
|||||||
#define fsync _commit
|
#define fsync _commit
|
||||||
#define lseek _lseeki64
|
#define lseek _lseeki64
|
||||||
#define ENOTSUP 4096
|
#define ENOTSUP 4096
|
||||||
/* XXX: find 64 bit version */
|
extern int qemu_ftruncate64(int, int64_t);
|
||||||
#define ftruncate chsize
|
#define ftruncate qemu_ftruncate64
|
||||||
|
|
||||||
|
|
||||||
static inline char *realpath(const char *path, char *resolved_path)
|
static inline char *realpath(const char *path, char *resolved_path)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user