bch2_trans_exit(&trans);
}
- qcow2_write_image(ca->disk_sb.bdev->bd_fd, fd, &data,
+ qcow2_write_image(ca->disk_sb.bdev->bd_buffered_fd, fd, &data,
max_t(unsigned, btree_bytes(c) / 8, block_bytes(c)));
darray_exit(&data);
}
void *holder)
{
struct block_device *bdev;
- int fd, sync_fd, flags = O_DIRECT;
+ int fd, sync_fd, buffered_fd, flags = 0;
if ((mode & (FMODE_READ|FMODE_WRITE)) == (FMODE_READ|FMODE_WRITE))
flags = O_RDWR;
flags |= O_EXCL;
#endif
- fd = open(path, flags);
+ fd = open(path, flags|O_DIRECT);
if (fd < 0)
return ERR_PTR(-errno);
- sync_fd = open(path, flags|O_SYNC);
- if (sync_fd < 0) {
- assert(0);
- close(fd);
- return ERR_PTR(-errno);
- }
+ sync_fd = xopen(path, flags|O_DIRECT|O_SYNC);
+ buffered_fd = xopen(path, flags);
bdev = malloc(sizeof(*bdev));
memset(bdev, 0, sizeof(*bdev));
bdev->bd_dev = xfstat(fd).st_rdev;
bdev->bd_fd = fd;
bdev->bd_sync_fd = sync_fd;
+ bdev->bd_buffered_fd = buffered_fd;
bdev->bd_holder = holder;
bdev->bd_disk = &bdev->__bd_disk;
bdev->bd_disk->bdi = &bdev->bd_disk->__bdi;