Loading block/bochs.c +20 −43 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) s->fd = fd; if (read(fd, &bochs, sizeof(bochs)) != sizeof(bochs)) { if (pread(fd, &bochs, sizeof(bochs), 0) != sizeof(bochs)) { goto fail; } Loading @@ -144,14 +144,10 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512; } if (lseek(s->fd, le32_to_cpu(bochs.header), SEEK_SET) == (off_t)-1) { goto fail; } s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog); s->catalog_bitmap = qemu_malloc(s->catalog_size * 4); if (read(s->fd, s->catalog_bitmap, s->catalog_size * 4) != s->catalog_size * 4) if (pread(s->fd, s->catalog_bitmap, s->catalog_size * 4, le32_to_cpu(bochs.header)) != s->catalog_size * 4) goto fail; for (i = 0; i < s->catalog_size; i++) le32_to_cpus(&s->catalog_bitmap[i]); Loading @@ -169,54 +165,35 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) return -1; } static inline int seek_to_sector(BlockDriverState *bs, int64_t sector_num) static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num) { BDRVBochsState *s = bs->opaque; int64_t offset = sector_num * 512; int64_t extent_index, extent_offset, bitmap_offset, block_offset; int64_t extent_index, extent_offset, bitmap_offset; char bitmap_entry; // seek to sector extent_index = offset / s->extent_size; extent_offset = (offset % s->extent_size) / 512; if (s->catalog_bitmap[extent_index] == 0xffffffff) { // fprintf(stderr, "page not allocated [%x - %x:%x]\n", // sector_num, extent_index, extent_offset); return -1; // not allocated if (s->catalog_bitmap[extent_index] == 0xffffffff) { return -1; /* not allocated */ } bitmap_offset = s->data_offset + (512 * s->catalog_bitmap[extent_index] * (s->extent_blocks + s->bitmap_blocks)); block_offset = bitmap_offset + (512 * (s->bitmap_blocks + extent_offset)); // fprintf(stderr, "sect: %x [ext i: %x o: %x] -> %x bitmap: %x block: %x\n", // sector_num, extent_index, extent_offset, // le32_to_cpu(s->catalog_bitmap[extent_index]), // bitmap_offset, block_offset); // read in bitmap for current extent if (lseek(s->fd, bitmap_offset + (extent_offset / 8), SEEK_SET) == (off_t)-1) { /* read in bitmap for current extent */ if (pread(s->fd, &bitmap_entry, 1, bitmap_offset + (extent_offset / 8)) != 1) { return -1; } if (read(s->fd, &bitmap_entry, 1) != 1) return -1; if (!((bitmap_entry >> (extent_offset % 8)) & 1)) { // fprintf(stderr, "sector (%x) in bitmap not allocated\n", // sector_num); return -1; // not allocated } if (lseek(s->fd, block_offset, SEEK_SET) == (off_t)-1) { return -1; if (!((bitmap_entry >> (extent_offset % 8)) & 1)) { return -1; /* not allocated */ } return 0; return bitmap_offset + (512 * (s->bitmap_blocks + extent_offset)); } static int bochs_read(BlockDriverState *bs, int64_t sector_num, Loading @@ -226,13 +203,13 @@ static int bochs_read(BlockDriverState *bs, int64_t sector_num, int ret; while (nb_sectors > 0) { if (!seek_to_sector(bs, sector_num)) { ret = read(s->fd, buf, 512); if (ret != 512) int64_t block_offset = seek_to_sector(bs, sector_num); if (block_offset >= 0) { ret = pread(s->fd, buf, 512, block_offset); if (ret != 512) { return -1; } else } else memset(buf, 0, 512); nb_sectors--; sector_num++; Loading Loading
block/bochs.c +20 −43 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) s->fd = fd; if (read(fd, &bochs, sizeof(bochs)) != sizeof(bochs)) { if (pread(fd, &bochs, sizeof(bochs), 0) != sizeof(bochs)) { goto fail; } Loading @@ -144,14 +144,10 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512; } if (lseek(s->fd, le32_to_cpu(bochs.header), SEEK_SET) == (off_t)-1) { goto fail; } s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog); s->catalog_bitmap = qemu_malloc(s->catalog_size * 4); if (read(s->fd, s->catalog_bitmap, s->catalog_size * 4) != s->catalog_size * 4) if (pread(s->fd, s->catalog_bitmap, s->catalog_size * 4, le32_to_cpu(bochs.header)) != s->catalog_size * 4) goto fail; for (i = 0; i < s->catalog_size; i++) le32_to_cpus(&s->catalog_bitmap[i]); Loading @@ -169,54 +165,35 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) return -1; } static inline int seek_to_sector(BlockDriverState *bs, int64_t sector_num) static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num) { BDRVBochsState *s = bs->opaque; int64_t offset = sector_num * 512; int64_t extent_index, extent_offset, bitmap_offset, block_offset; int64_t extent_index, extent_offset, bitmap_offset; char bitmap_entry; // seek to sector extent_index = offset / s->extent_size; extent_offset = (offset % s->extent_size) / 512; if (s->catalog_bitmap[extent_index] == 0xffffffff) { // fprintf(stderr, "page not allocated [%x - %x:%x]\n", // sector_num, extent_index, extent_offset); return -1; // not allocated if (s->catalog_bitmap[extent_index] == 0xffffffff) { return -1; /* not allocated */ } bitmap_offset = s->data_offset + (512 * s->catalog_bitmap[extent_index] * (s->extent_blocks + s->bitmap_blocks)); block_offset = bitmap_offset + (512 * (s->bitmap_blocks + extent_offset)); // fprintf(stderr, "sect: %x [ext i: %x o: %x] -> %x bitmap: %x block: %x\n", // sector_num, extent_index, extent_offset, // le32_to_cpu(s->catalog_bitmap[extent_index]), // bitmap_offset, block_offset); // read in bitmap for current extent if (lseek(s->fd, bitmap_offset + (extent_offset / 8), SEEK_SET) == (off_t)-1) { /* read in bitmap for current extent */ if (pread(s->fd, &bitmap_entry, 1, bitmap_offset + (extent_offset / 8)) != 1) { return -1; } if (read(s->fd, &bitmap_entry, 1) != 1) return -1; if (!((bitmap_entry >> (extent_offset % 8)) & 1)) { // fprintf(stderr, "sector (%x) in bitmap not allocated\n", // sector_num); return -1; // not allocated } if (lseek(s->fd, block_offset, SEEK_SET) == (off_t)-1) { return -1; if (!((bitmap_entry >> (extent_offset % 8)) & 1)) { return -1; /* not allocated */ } return 0; return bitmap_offset + (512 * (s->bitmap_blocks + extent_offset)); } static int bochs_read(BlockDriverState *bs, int64_t sector_num, Loading @@ -226,13 +203,13 @@ static int bochs_read(BlockDriverState *bs, int64_t sector_num, int ret; while (nb_sectors > 0) { if (!seek_to_sector(bs, sector_num)) { ret = read(s->fd, buf, 512); if (ret != 512) int64_t block_offset = seek_to_sector(bs, sector_num); if (block_offset >= 0) { ret = pread(s->fd, buf, 512, block_offset); if (ret != 512) { return -1; } else } else memset(buf, 0, 512); nb_sectors--; sector_num++; Loading