Commit b71d1c2e1135328301a763a6c91db0556c00b913
1 parent
1fa79228
block-vpc: Use the qemu block layer (Kevin Wolf)
Instead of accessing the file directly, use the qemu block layer. Signed-off-by: Kevin Wolf <kwolf@suse.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6457 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
32 additions
and
27 deletions
block-vpc.c
| @@ -105,7 +105,7 @@ struct vhd_dyndisk_header { | @@ -105,7 +105,7 @@ struct vhd_dyndisk_header { | ||
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| 107 | typedef struct BDRVVPCState { | 107 | typedef struct BDRVVPCState { |
| 108 | - int fd; | 108 | + BlockDriverState *hd; |
| 109 | 109 | ||
| 110 | int max_table_entries; | 110 | int max_table_entries; |
| 111 | uint32_t *pagetable; | 111 | uint32_t *pagetable; |
| @@ -130,20 +130,18 @@ static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename) | @@ -130,20 +130,18 @@ static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename) | ||
| 130 | static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | 130 | static int vpc_open(BlockDriverState *bs, const char *filename, int flags) |
| 131 | { | 131 | { |
| 132 | BDRVVPCState *s = bs->opaque; | 132 | BDRVVPCState *s = bs->opaque; |
| 133 | - int fd, i; | 133 | + int ret, i; |
| 134 | struct vhd_footer* footer; | 134 | struct vhd_footer* footer; |
| 135 | struct vhd_dyndisk_header* dyndisk_header; | 135 | struct vhd_dyndisk_header* dyndisk_header; |
| 136 | uint8_t buf[HEADER_SIZE]; | 136 | uint8_t buf[HEADER_SIZE]; |
| 137 | 137 | ||
| 138 | - fd = open(filename, O_RDONLY | O_BINARY); | ||
| 139 | - if (fd < 0) | ||
| 140 | - return -1; | ||
| 141 | - | ||
| 142 | bs->read_only = 1; // no write support yet | 138 | bs->read_only = 1; // no write support yet |
| 143 | 139 | ||
| 144 | - s->fd = fd; | 140 | + ret = bdrv_file_open(&s->hd, filename, flags); |
| 141 | + if (ret < 0) | ||
| 142 | + return ret; | ||
| 145 | 143 | ||
| 146 | - if (read(fd, buf, HEADER_SIZE) != HEADER_SIZE) | 144 | + if (bdrv_pread(s->hd, 0, buf, HEADER_SIZE) != HEADER_SIZE) |
| 147 | goto fail; | 145 | goto fail; |
| 148 | 146 | ||
| 149 | footer = (struct vhd_footer*) buf; | 147 | footer = (struct vhd_footer*) buf; |
| @@ -156,8 +154,8 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | @@ -156,8 +154,8 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | ||
| 156 | bs->total_sectors = (int64_t) | 154 | bs->total_sectors = (int64_t) |
| 157 | be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl; | 155 | be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl; |
| 158 | 156 | ||
| 159 | - lseek(s->fd, be64_to_cpu(footer->data_offset), SEEK_SET); | ||
| 160 | - if (read(fd, buf, HEADER_SIZE) != HEADER_SIZE) | 157 | + if (bdrv_pread(s->hd, be64_to_cpu(footer->data_offset), buf, HEADER_SIZE) |
| 158 | + != HEADER_SIZE) | ||
| 161 | goto fail; | 159 | goto fail; |
| 162 | 160 | ||
| 163 | footer = NULL; | 161 | footer = NULL; |
| @@ -166,15 +164,16 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | @@ -166,15 +164,16 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | ||
| 166 | if (strncmp(dyndisk_header->magic, "cxsparse", 8)) | 164 | if (strncmp(dyndisk_header->magic, "cxsparse", 8)) |
| 167 | goto fail; | 165 | goto fail; |
| 168 | 166 | ||
| 169 | - lseek(s->fd, be64_to_cpu(dyndisk_header->table_offset), SEEK_SET); | ||
| 170 | 167 | ||
| 171 | s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries); | 168 | s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries); |
| 172 | s->pagetable = qemu_malloc(s->max_table_entries * 4); | 169 | s->pagetable = qemu_malloc(s->max_table_entries * 4); |
| 173 | if (!s->pagetable) | 170 | if (!s->pagetable) |
| 174 | - goto fail; | ||
| 175 | - if (read(s->fd, s->pagetable, s->max_table_entries * 4) != | ||
| 176 | - s->max_table_entries * 4) | ||
| 177 | - goto fail; | 171 | + goto fail; |
| 172 | + | ||
| 173 | + if (bdrv_pread(s->hd, be64_to_cpu(dyndisk_header->table_offset), | ||
| 174 | + s->pagetable, s->max_table_entries * 4) != s->max_table_entries * 4) | ||
| 175 | + goto fail; | ||
| 176 | + | ||
| 178 | for (i = 0; i < s->max_table_entries; i++) | 177 | for (i = 0; i < s->max_table_entries; i++) |
| 179 | be32_to_cpus(&s->pagetable[i]); | 178 | be32_to_cpus(&s->pagetable[i]); |
| 180 | 179 | ||
| @@ -190,11 +189,15 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | @@ -190,11 +189,15 @@ static int vpc_open(BlockDriverState *bs, const char *filename, int flags) | ||
| 190 | 189 | ||
| 191 | return 0; | 190 | return 0; |
| 192 | fail: | 191 | fail: |
| 193 | - close(fd); | 192 | + bdrv_delete(s->hd); |
| 194 | return -1; | 193 | return -1; |
| 195 | } | 194 | } |
| 196 | 195 | ||
| 197 | -static inline int seek_to_sector(BlockDriverState *bs, int64_t sector_num) | 196 | +/* |
| 197 | + * Returns the absolute byte offset of the given sector in the image file. | ||
| 198 | + * If the sector is not allocated, -1 is returned instead. | ||
| 199 | + */ | ||
| 200 | +static inline int64_t get_sector_offset(BlockDriverState *bs, int64_t sector_num) | ||
| 198 | { | 201 | { |
| 199 | BDRVVPCState *s = bs->opaque; | 202 | BDRVVPCState *s = bs->opaque; |
| 200 | uint64_t offset = sector_num * 512; | 203 | uint64_t offset = sector_num * 512; |
| @@ -241,9 +244,8 @@ static inline int seek_to_sector(BlockDriverState *bs, int64_t sector_num) | @@ -241,9 +244,8 @@ static inline int seek_to_sector(BlockDriverState *bs, int64_t sector_num) | ||
| 241 | return -1; // not allocated | 244 | return -1; // not allocated |
| 242 | #endif | 245 | #endif |
| 243 | #endif | 246 | #endif |
| 244 | - lseek(s->fd, block_offset, SEEK_SET); | ||
| 245 | 247 | ||
| 246 | - return 0; | 248 | + return block_offset; |
| 247 | } | 249 | } |
| 248 | 250 | ||
| 249 | static int vpc_read(BlockDriverState *bs, int64_t sector_num, | 251 | static int vpc_read(BlockDriverState *bs, int64_t sector_num, |
| @@ -251,16 +253,19 @@ static int vpc_read(BlockDriverState *bs, int64_t sector_num, | @@ -251,16 +253,19 @@ static int vpc_read(BlockDriverState *bs, int64_t sector_num, | ||
| 251 | { | 253 | { |
| 252 | BDRVVPCState *s = bs->opaque; | 254 | BDRVVPCState *s = bs->opaque; |
| 253 | int ret; | 255 | int ret; |
| 256 | + int64_t offset; | ||
| 254 | 257 | ||
| 255 | while (nb_sectors > 0) { | 258 | while (nb_sectors > 0) { |
| 256 | - if (!seek_to_sector(bs, sector_num)) | ||
| 257 | - { | ||
| 258 | - ret = read(s->fd, buf, 512); | ||
| 259 | - if (ret != 512) | ||
| 260 | - return -1; | ||
| 261 | - } | ||
| 262 | - else | 259 | + offset = get_sector_offset(bs, sector_num); |
| 260 | + | ||
| 261 | + if (offset == -1) { | ||
| 263 | memset(buf, 0, 512); | 262 | memset(buf, 0, 512); |
| 263 | + } else { | ||
| 264 | + ret = bdrv_pread(s->hd, offset, buf, 512); | ||
| 265 | + if (ret != 512) | ||
| 266 | + return -1; | ||
| 267 | + } | ||
| 268 | + | ||
| 264 | nb_sectors--; | 269 | nb_sectors--; |
| 265 | sector_num++; | 270 | sector_num++; |
| 266 | buf += 512; | 271 | buf += 512; |
| @@ -275,7 +280,7 @@ static void vpc_close(BlockDriverState *bs) | @@ -275,7 +280,7 @@ static void vpc_close(BlockDriverState *bs) | ||
| 275 | #ifdef CACHE | 280 | #ifdef CACHE |
| 276 | qemu_free(s->pageentry_u8); | 281 | qemu_free(s->pageentry_u8); |
| 277 | #endif | 282 | #endif |
| 278 | - close(s->fd); | 283 | + bdrv_delete(s->hd); |
| 279 | } | 284 | } |
| 280 | 285 | ||
| 281 | BlockDriver bdrv_vpc = { | 286 | BlockDriver bdrv_vpc = { |