parallels: use qemu block API
Use bdrv_pwrite to access the backing device instead of pread, and convert the driver to implementing the bdrv_open method which gives it an already opened BlockDriverState for the underlying device. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									9d8b88f68c
								
							
						
					
					
						commit
						1dec5a7097
					
				@ -46,7 +46,6 @@ struct parallels_header {
 | 
				
			|||||||
} __attribute__((packed));
 | 
					} __attribute__((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct BDRVParallelsState {
 | 
					typedef struct BDRVParallelsState {
 | 
				
			||||||
    int fd;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t *catalog_bitmap;
 | 
					    uint32_t *catalog_bitmap;
 | 
				
			||||||
    int catalog_size;
 | 
					    int catalog_size;
 | 
				
			||||||
@ -68,22 +67,15 @@ static int parallels_probe(const uint8_t *buf, int buf_size, const char *filenam
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int parallels_open(BlockDriverState *bs, const char *filename, int flags)
 | 
					static int parallels_open(BlockDriverState *bs, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BDRVParallelsState *s = bs->opaque;
 | 
					    BDRVParallelsState *s = bs->opaque;
 | 
				
			||||||
    int fd, i;
 | 
					    int i;
 | 
				
			||||||
    struct parallels_header ph;
 | 
					    struct parallels_header ph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
 | 
					 | 
				
			||||||
    if (fd < 0) {
 | 
					 | 
				
			||||||
        return -1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bs->read_only = 1; // no write support yet
 | 
					    bs->read_only = 1; // no write support yet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s->fd = fd;
 | 
					    if (bdrv_pread(bs->file, 0, &ph, sizeof(ph)) != sizeof(ph))
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pread(fd, &ph, sizeof(ph), 0) != sizeof(ph))
 | 
					 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (memcmp(ph.magic, HEADER_MAGIC, 16) ||
 | 
					    if (memcmp(ph.magic, HEADER_MAGIC, 16) ||
 | 
				
			||||||
@ -97,7 +89,7 @@ static int parallels_open(BlockDriverState *bs, const char *filename, int flags)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    s->catalog_size = le32_to_cpu(ph.catalog_entries);
 | 
					    s->catalog_size = le32_to_cpu(ph.catalog_entries);
 | 
				
			||||||
    s->catalog_bitmap = qemu_malloc(s->catalog_size * 4);
 | 
					    s->catalog_bitmap = qemu_malloc(s->catalog_size * 4);
 | 
				
			||||||
    if (pread(s->fd, s->catalog_bitmap, s->catalog_size * 4, 64) !=
 | 
					    if (bdrv_pread(bs->file, 64, s->catalog_bitmap, s->catalog_size * 4) !=
 | 
				
			||||||
	s->catalog_size * 4)
 | 
						s->catalog_size * 4)
 | 
				
			||||||
	goto fail;
 | 
						goto fail;
 | 
				
			||||||
    for (i = 0; i < s->catalog_size; i++)
 | 
					    for (i = 0; i < s->catalog_size; i++)
 | 
				
			||||||
@ -107,7 +99,6 @@ static int parallels_open(BlockDriverState *bs, const char *filename, int flags)
 | 
				
			|||||||
fail:
 | 
					fail:
 | 
				
			||||||
    if (s->catalog_bitmap)
 | 
					    if (s->catalog_bitmap)
 | 
				
			||||||
	qemu_free(s->catalog_bitmap);
 | 
						qemu_free(s->catalog_bitmap);
 | 
				
			||||||
    close(fd);
 | 
					 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -128,12 +119,10 @@ static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)
 | 
				
			|||||||
static int parallels_read(BlockDriverState *bs, int64_t sector_num,
 | 
					static int parallels_read(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
                    uint8_t *buf, int nb_sectors)
 | 
					                    uint8_t *buf, int nb_sectors)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BDRVParallelsState *s = bs->opaque;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (nb_sectors > 0) {
 | 
					    while (nb_sectors > 0) {
 | 
				
			||||||
        int64_t position = seek_to_sector(bs, sector_num);
 | 
					        int64_t position = seek_to_sector(bs, sector_num);
 | 
				
			||||||
        if (position >= 0) {
 | 
					        if (position >= 0) {
 | 
				
			||||||
            if (pread(s->fd, buf, 512, position) != 512)
 | 
					            if (bdrv_pread(bs->file, position, buf, 512) != 512)
 | 
				
			||||||
                return -1;
 | 
					                return -1;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            memset(buf, 0, 512);
 | 
					            memset(buf, 0, 512);
 | 
				
			||||||
@ -149,14 +138,13 @@ static void parallels_close(BlockDriverState *bs)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    BDRVParallelsState *s = bs->opaque;
 | 
					    BDRVParallelsState *s = bs->opaque;
 | 
				
			||||||
    qemu_free(s->catalog_bitmap);
 | 
					    qemu_free(s->catalog_bitmap);
 | 
				
			||||||
    close(s->fd);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BlockDriver bdrv_parallels = {
 | 
					static BlockDriver bdrv_parallels = {
 | 
				
			||||||
    .format_name	= "parallels",
 | 
					    .format_name	= "parallels",
 | 
				
			||||||
    .instance_size	= sizeof(BDRVParallelsState),
 | 
					    .instance_size	= sizeof(BDRVParallelsState),
 | 
				
			||||||
    .bdrv_probe		= parallels_probe,
 | 
					    .bdrv_probe		= parallels_probe,
 | 
				
			||||||
    .bdrv_file_open	= parallels_open,
 | 
					    .bdrv_open		= parallels_open,
 | 
				
			||||||
    .bdrv_read		= parallels_read,
 | 
					    .bdrv_read		= parallels_read,
 | 
				
			||||||
    .bdrv_close		= parallels_close,
 | 
					    .bdrv_close		= parallels_close,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user