xref: /kvmtool/disk/blk.c (revision 87ee33c8e924461317658a87d1cc3cd9b306c908)
1708dc6cbSAsias He #include "kvm/disk-image.h"
2708dc6cbSAsias He 
3708dc6cbSAsias He /*
4708dc6cbSAsias He  * raw image and blk dev are similar, so reuse raw image ops.
5708dc6cbSAsias He  */
6*87ee33c8SAsias He static struct disk_image_operations raw_image_ops = {
7*87ee33c8SAsias He 	.read_sector		= raw_image__read_sector,
8*87ee33c8SAsias He 	.write_sector		= raw_image__write_sector,
9*87ee33c8SAsias He 	.close			= raw_image__close,
10708dc6cbSAsias He };
11708dc6cbSAsias He 
12708dc6cbSAsias He struct disk_image *blkdev__probe(const char *filename, struct stat *st)
13708dc6cbSAsias He {
14708dc6cbSAsias He 	u64 size;
15708dc6cbSAsias He 	int fd;
16708dc6cbSAsias He 
17708dc6cbSAsias He 	if (!S_ISBLK(st->st_mode))
18708dc6cbSAsias He 		return NULL;
19708dc6cbSAsias He 
20708dc6cbSAsias He 	fd		= open(filename, O_RDONLY);
21708dc6cbSAsias He 	if (fd < 0)
22708dc6cbSAsias He 		return NULL;
23708dc6cbSAsias He 
24708dc6cbSAsias He 	if (ioctl(fd, BLKGETSIZE64, &size) < 0) {
25708dc6cbSAsias He 		close(fd);
26708dc6cbSAsias He 		return NULL;
27708dc6cbSAsias He 	}
28708dc6cbSAsias He 
29*87ee33c8SAsias He 	return disk_image__new(fd, size, &raw_image_ops, DISK_IMAGE_MMAP);
30708dc6cbSAsias He }
31