Re: [Qemu-devel] [PATCH 3/3] cow: use qemu block API
On Mon, Jun 07, 2010 at 02:27:40PM +0200, Markus Armbruster wrote: Christoph Hellwig h...@lst.de writes: 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 h...@lst.de In my (admittedly limited) understanding, we need this for sane protocol handling in -blockdev friends. Yes - not just in -blockdev but also in general.
Re: [Qemu-devel] [PATCH 3/3] cow: use qemu block API
Am 07.06.2010 12:06, schrieb Christoph Hellwig: 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 h...@lst.de Thanks, applied all to the block branch. Kevin
[Qemu-devel] [PATCH 3/3] cow: 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 h...@lst.de Index: qemu/block/cow.c === --- qemu.orig/block/cow.c 2010-05-07 17:07:56.0 +0200 +++ qemu/block/cow.c2010-05-07 17:11:11.498255489 +0200 @@ -42,7 +42,6 @@ struct cow_header_v2 { }; typedef struct BDRVCowState { -int fd; int64_t cow_sectors_offset; } BDRVCowState; @@ -58,23 +57,16 @@ static int cow_probe(const uint8_t *buf, return 0; } -static int cow_open(BlockDriverState *bs, const char *filename, int flags) +static int cow_open(BlockDriverState *bs, int flags) { BDRVCowState *s = bs-opaque; -int fd; struct cow_header_v2 cow_header; int bitmap_size; int64_t size; -fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE); -if (fd 0) { -fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE); -if (fd 0) -return -1; -} -s-fd = fd; /* see if it is a cow image */ -if (pread(fd, cow_header, sizeof(cow_header), 0) != sizeof(cow_header)) { +if (bdrv_pread(bs-file, 0, cow_header, sizeof(cow_header)) != +sizeof(cow_header)) { goto fail; } @@ -94,7 +86,6 @@ static int cow_open(BlockDriverState *bs s-cow_sectors_offset = (bitmap_size + 511) ~511; return 0; fail: -close(fd); return -1; } @@ -104,18 +95,17 @@ static int cow_open(BlockDriverState *bs */ static inline int cow_set_bit(BlockDriverState *bs, int64_t bitnum) { -BDRVCowState *s = bs-opaque; uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8; uint8_t bitmap; -if (pread(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pread(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } bitmap |= (1 (bitnum % 8)); -if (pwrite(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pwrite(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } @@ -124,11 +114,10 @@ static inline int cow_set_bit(BlockDrive static inline int is_bit_set(BlockDriverState *bs, int64_t bitnum) { -BDRVCowState *s = bs-opaque; uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8; uint8_t bitmap; -if (pread(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pread(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } @@ -186,8 +175,9 @@ static int cow_read(BlockDriverState *bs while (nb_sectors 0) { if (cow_is_allocated(bs, sector_num, nb_sectors, n)) { -ret = pread(s-fd, buf, n * 512, -s-cow_sectors_offset + sector_num * 512); +ret = bdrv_pread(bs-file, +s-cow_sectors_offset + sector_num * 512, +buf, n * 512); if (ret != n * 512) return -1; } else { @@ -213,8 +203,8 @@ static int cow_write(BlockDriverState *b BDRVCowState *s = bs-opaque; int ret; -ret = pwrite(s-fd, buf, nb_sectors * 512, - s-cow_sectors_offset + sector_num * 512); +ret = bdrv_pwrite(bs-file, s-cow_sectors_offset + sector_num * 512, + buf, nb_sectors * 512); if (ret != nb_sectors * 512) return -1; @@ -223,8 +213,6 @@ static int cow_write(BlockDriverState *b static void cow_close(BlockDriverState *bs) { -BDRVCowState *s = bs-opaque; -close(s-fd); } static int cow_create(const char *filename, QEMUOptionParameter *options) @@ -294,8 +282,7 @@ exit: static void cow_flush(BlockDriverState *bs) { -BDRVCowState *s = bs-opaque; -qemu_fdatasync(s-fd); +bdrv_flush(bs-file); } static QEMUOptionParameter cow_create_options[] = { @@ -316,7 +303,7 @@ static BlockDriver bdrv_cow = { .format_name = cow, .instance_size = sizeof(BDRVCowState), .bdrv_probe= cow_probe, -.bdrv_file_open= cow_open, +.bdrv_open = cow_open, .bdrv_read = cow_read, .bdrv_write= cow_write, .bdrv_close= cow_close,
Re: [Qemu-devel] [PATCH 3/3] cow: use qemu block API
Christoph Hellwig h...@lst.de writes: 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 h...@lst.de In my (admittedly limited) understanding, we need this for sane protocol handling in -blockdev friends.
[Qemu-devel] [PATCH 3/3] cow: 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 h...@lst.de Index: qemu/block/cow.c === --- qemu.orig/block/cow.c 2010-05-07 17:07:56.0 +0200 +++ qemu/block/cow.c2010-05-07 17:11:11.498255489 +0200 @@ -42,7 +42,6 @@ struct cow_header_v2 { }; typedef struct BDRVCowState { -int fd; int64_t cow_sectors_offset; } BDRVCowState; @@ -58,23 +57,16 @@ static int cow_probe(const uint8_t *buf, return 0; } -static int cow_open(BlockDriverState *bs, const char *filename, int flags) +static int cow_open(BlockDriverState *bs, int flags) { BDRVCowState *s = bs-opaque; -int fd; struct cow_header_v2 cow_header; int bitmap_size; int64_t size; -fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE); -if (fd 0) { -fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE); -if (fd 0) -return -1; -} -s-fd = fd; /* see if it is a cow image */ -if (pread(fd, cow_header, sizeof(cow_header), 0) != sizeof(cow_header)) { +if (bdrv_pread(bs-file, 0, cow_header, sizeof(cow_header)) != +sizeof(cow_header)) { goto fail; } @@ -94,7 +86,6 @@ static int cow_open(BlockDriverState *bs s-cow_sectors_offset = (bitmap_size + 511) ~511; return 0; fail: -close(fd); return -1; } @@ -104,18 +95,17 @@ static int cow_open(BlockDriverState *bs */ static inline int cow_set_bit(BlockDriverState *bs, int64_t bitnum) { -BDRVCowState *s = bs-opaque; uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8; uint8_t bitmap; -if (pread(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pread(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } bitmap |= (1 (bitnum % 8)); -if (pwrite(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pwrite(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } @@ -124,11 +114,10 @@ static inline int cow_set_bit(BlockDrive static inline int is_bit_set(BlockDriverState *bs, int64_t bitnum) { -BDRVCowState *s = bs-opaque; uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8; uint8_t bitmap; -if (pread(s-fd, bitmap, sizeof(bitmap), offset) != +if (bdrv_pread(bs-file, offset, bitmap, sizeof(bitmap)) != sizeof(bitmap)) { return -errno; } @@ -186,8 +175,9 @@ static int cow_read(BlockDriverState *bs while (nb_sectors 0) { if (cow_is_allocated(bs, sector_num, nb_sectors, n)) { -ret = pread(s-fd, buf, n * 512, -s-cow_sectors_offset + sector_num * 512); +ret = bdrv_pread(bs-file, +s-cow_sectors_offset + sector_num * 512, +buf, n * 512); if (ret != n * 512) return -1; } else { @@ -213,8 +203,8 @@ static int cow_write(BlockDriverState *b BDRVCowState *s = bs-opaque; int ret; -ret = pwrite(s-fd, buf, nb_sectors * 512, - s-cow_sectors_offset + sector_num * 512); +ret = bdrv_pwrite(bs-file, s-cow_sectors_offset + sector_num * 512, + buf, nb_sectors * 512); if (ret != nb_sectors * 512) return -1; @@ -223,8 +213,6 @@ static int cow_write(BlockDriverState *b static void cow_close(BlockDriverState *bs) { -BDRVCowState *s = bs-opaque; -close(s-fd); } static int cow_create(const char *filename, QEMUOptionParameter *options) @@ -294,8 +282,7 @@ exit: static void cow_flush(BlockDriverState *bs) { -BDRVCowState *s = bs-opaque; -qemu_fdatasync(s-fd); +bdrv_flush(bs-file); } static QEMUOptionParameter cow_create_options[] = { @@ -316,7 +303,7 @@ static BlockDriver bdrv_cow = { .format_name = cow, .instance_size = sizeof(BDRVCowState), .bdrv_probe= cow_probe, -.bdrv_file_open= cow_open, +.bdrv_open = cow_open, .bdrv_read = cow_read, .bdrv_write= cow_write, .bdrv_close= cow_close,