version 1.1.1.2, 2018/04/24 16:42:27
|
version 1.1.1.3, 2018/04/24 16:44:39
|
Line 62 static int cow_probe(const uint8_t *buf,
|
Line 62 static int cow_probe(const uint8_t *buf,
|
return 0; |
return 0; |
} |
} |
|
|
static int cow_open(BlockDriverState *bs, const char *filename) |
static int cow_open(BlockDriverState *bs, const char *filename, int flags) |
{ |
{ |
BDRVCowState *s = bs->opaque; |
BDRVCowState *s = bs->opaque; |
int fd; |
int fd; |
Line 93 static int cow_open(BlockDriverState *bs
|
Line 93 static int cow_open(BlockDriverState *bs
|
pstrcpy(bs->backing_file, sizeof(bs->backing_file), |
pstrcpy(bs->backing_file, sizeof(bs->backing_file), |
cow_header.backing_file); |
cow_header.backing_file); |
|
|
#if 0 |
|
if (cow_header.backing_file[0] != '\0') { |
|
if (stat(cow_header.backing_file, &st) != 0) { |
|
fprintf(stderr, "%s: could not find original disk image '%s'\n", filename, cow_header.backing_file); |
|
goto fail; |
|
} |
|
if (st.st_mtime != be32_to_cpu(cow_header.mtime)) { |
|
fprintf(stderr, "%s: original raw disk image '%s' does not match saved timestamp\n", filename, cow_header.backing_file); |
|
goto fail; |
|
} |
|
fd = open(cow_header.backing_file, O_RDONLY | O_LARGEFILE); |
|
if (fd < 0) |
|
goto fail; |
|
bs->fd = fd; |
|
} |
|
#endif |
|
/* mmap the bitmap */ |
/* mmap the bitmap */ |
s->cow_bitmap_size = ((bs->total_sectors + 7) >> 3) + sizeof(cow_header); |
s->cow_bitmap_size = ((bs->total_sectors + 7) >> 3) + sizeof(cow_header); |
s->cow_bitmap_addr = mmap(get_mmap_addr(s->cow_bitmap_size), |
s->cow_bitmap_addr = mmap(get_mmap_addr(s->cow_bitmap_size), |
Line 179 static int cow_read(BlockDriverState *bs
|
Line 163 static int cow_read(BlockDriverState *bs
|
if (ret != n * 512) |
if (ret != n * 512) |
return -1; |
return -1; |
} else { |
} else { |
|
if (bs->backing_hd) { |
|
/* read from the base image */ |
|
ret = bdrv_read(bs->backing_hd, sector_num, buf, n); |
|
if (ret < 0) |
|
return -1; |
|
} else { |
memset(buf, 0, n * 512); |
memset(buf, 0, n * 512); |
} |
} |
|
} |
nb_sectors -= n; |
nb_sectors -= n; |
sector_num += n; |
sector_num += n; |
buf += n * 512; |
buf += n * 512; |
Line 220 static int cow_create(const char *filena
|
Line 211 static int cow_create(const char *filena
|
if (flags) |
if (flags) |
return -ENOTSUP; |
return -ENOTSUP; |
|
|
cow_fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE, |
cow_fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, |
0644); |
0644); |
if (cow_fd < 0) |
if (cow_fd < 0) |
return -1; |
return -1; |
Line 228 static int cow_create(const char *filena
|
Line 219 static int cow_create(const char *filena
|
cow_header.magic = cpu_to_be32(COW_MAGIC); |
cow_header.magic = cpu_to_be32(COW_MAGIC); |
cow_header.version = cpu_to_be32(COW_VERSION); |
cow_header.version = cpu_to_be32(COW_VERSION); |
if (image_filename) { |
if (image_filename) { |
|
/* Note: if no file, we put a dummy mtime */ |
|
cow_header.mtime = cpu_to_be32(0); |
|
|
fd = open(image_filename, O_RDONLY | O_BINARY); |
fd = open(image_filename, O_RDONLY | O_BINARY); |
if (fd < 0) { |
if (fd < 0) { |
close(cow_fd); |
close(cow_fd); |
return -1; |
goto mtime_fail; |
} |
} |
if (fstat(fd, &st) != 0) { |
if (fstat(fd, &st) != 0) { |
close(fd); |
close(fd); |
return -1; |
goto mtime_fail; |
} |
} |
close(fd); |
close(fd); |
cow_header.mtime = cpu_to_be32(st.st_mtime); |
cow_header.mtime = cpu_to_be32(st.st_mtime); |
realpath(image_filename, cow_header.backing_file); |
mtime_fail: |
|
pstrcpy(cow_header.backing_file, sizeof(cow_header.backing_file), |
|
image_filename); |
} |
} |
cow_header.sectorsize = cpu_to_be32(512); |
cow_header.sectorsize = cpu_to_be32(512); |
cow_header.size = cpu_to_be64(image_sectors * 512); |
cow_header.size = cpu_to_be64(image_sectors * 512); |