xref: /kvmtool/disk/blk.c (revision 708dc6cb4d3c6e6c224fe9016c7ea005e6912ebf)
1*708dc6cbSAsias He #include "kvm/disk-image.h"
2*708dc6cbSAsias He 
3*708dc6cbSAsias He /*
4*708dc6cbSAsias He  * raw image and blk dev are similar, so reuse raw image ops.
5*708dc6cbSAsias He  */
6*708dc6cbSAsias He static struct disk_image_operations raw_image_ro_mmap_ops = {
7*708dc6cbSAsias He 	.read_sector		= raw_image__read_sector_ro_mmap,
8*708dc6cbSAsias He 	.write_sector		= raw_image__write_sector_ro_mmap,
9*708dc6cbSAsias He 	.close			= raw_image__close_ro_mmap,
10*708dc6cbSAsias He };
11*708dc6cbSAsias He 
12*708dc6cbSAsias He struct disk_image *blkdev__probe(const char *filename, struct stat *st)
13*708dc6cbSAsias He {
14*708dc6cbSAsias He 	u64 size;
15*708dc6cbSAsias He 	int fd;
16*708dc6cbSAsias He 
17*708dc6cbSAsias He 	if (!S_ISBLK(st->st_mode))
18*708dc6cbSAsias He 		return NULL;
19*708dc6cbSAsias He 
20*708dc6cbSAsias He 	fd		= open(filename, O_RDONLY);
21*708dc6cbSAsias He 	if (fd < 0)
22*708dc6cbSAsias He 		return NULL;
23*708dc6cbSAsias He 
24*708dc6cbSAsias He 	if (ioctl(fd, BLKGETSIZE64, &size) < 0) {
25*708dc6cbSAsias He 		close(fd);
26*708dc6cbSAsias He 		return NULL;
27*708dc6cbSAsias He 	}
28*708dc6cbSAsias He 
29*708dc6cbSAsias He 	return disk_image__new(fd, size, &raw_image_ro_mmap_ops, DISK_IMAGE_MMAP);
30*708dc6cbSAsias He }
31