diff --git a/disk-image.c b/disk-image.c index 595d407..908a744 100644 --- a/disk-image.c +++ b/disk-image.c @@ -13,7 +13,7 @@ #include #include -struct disk_image *disk_image__new(int fd, uint64_t size, struct disk_image_operations *ops, bool readonly) +struct disk_image *disk_image__new(int fd, uint64_t size, struct disk_image_operations *ops) { struct disk_image *self; @@ -24,16 +24,24 @@ struct disk_image *disk_image__new(int fd, uint64_t size, struct disk_image_oper self->fd = fd; self->size = size; self->ops = ops; - if (readonly) { - self->priv = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_NORESERVE, fd, 0); - if (self->priv == MAP_FAILED) - die("mmap() failed"); - } else - self->priv = MAP_FAILED; - return self; } +struct disk_image *disk_image__new_readonly(int fd, uint64_t size, struct disk_image_operations *ops) +{ + struct disk_image *self; + + self = disk_image__new(fd, size, ops); + if (!self) + return NULL; + + self->priv = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_NORESERVE, fd, 0); + if (self->priv == MAP_FAILED) + die("mmap() failed"); + return self; +} + + static int raw_image__read_sector(struct disk_image *self, uint64_t sector, void *dst, uint32_t dst_len) { uint64_t offset = sector << SECTOR_SHIFT; @@ -101,7 +109,10 @@ static struct disk_image *raw_image__probe(int fd, bool readonly) if (fstat(fd, &st) < 0) return NULL; - return disk_image__new(fd, st.st_size, readonly ? &raw_image_ro_mmap_ops : &raw_image_ops, readonly); + if (readonly) + return disk_image__new_readonly(fd, st.st_size, &raw_image_ro_mmap_ops); + else + return disk_image__new(fd, st.st_size, &raw_image_ops); } struct disk_image *disk_image__open(const char *filename, bool readonly) diff --git a/include/kvm/disk-image.h b/include/kvm/disk-image.h index 91240c2..33962c6 100644 --- a/include/kvm/disk-image.h +++ b/include/kvm/disk-image.h @@ -23,7 +23,8 @@ struct disk_image { }; struct disk_image *disk_image__open(const char *filename, bool readonly); -struct disk_image *disk_image__new(int fd, uint64_t size, struct disk_image_operations *ops, bool readonly); +struct disk_image *disk_image__new(int fd, uint64_t size, struct disk_image_operations *ops); +struct disk_image *disk_image__new_readonly(int fd, uint64_t size, struct disk_image_operations *ops); void disk_image__close(struct disk_image *self); static inline int disk_image__read_sector(struct disk_image *self, uint64_t sector, void *dst, uint32_t dst_len)