int blkdev_issue_discard(struct block_device *bdev,
sector_t sector, sector_t nr_sects,
- gfp_t gfp_mask, unsigned long flags)
+ gfp_t gfp_mask)
{
return 0;
}
+int blkdev_issue_zeroout(struct block_device *bdev,
+ sector_t sector, sector_t nr_sects,
+ gfp_t gfp_mask, unsigned flags)
+{
+ /* Not yet implemented: */
+ BUG();
+}
+
unsigned bdev_logical_block_size(struct block_device *bdev)
{
struct stat statbuf;
BUG_ON(ret);
if (!S_ISBLK(statbuf.st_mode))
- return statbuf.st_blksize >> 9;
+ return statbuf.st_blksize;
- ret = ioctl(bdev->bd_fd, BLKPBSZGET, &blksize);
- BUG_ON(ret);
-
- return blksize >> 9;
+ xioctl(bdev->bd_fd, BLKPBSZGET, &blksize);
+ return blksize;
}
sector_t get_capacity(struct gendisk *disk)
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;
if (mode & FMODE_EXCL)
flags |= O_EXCL;
#endif
+ buffered_fd = open(path, flags);
+ if (buffered_fd < 0)
+ return ERR_PTR(-errno);
- fd = open(path, flags);
+ fd = open(path, flags|O_DIRECT);
if (fd < 0)
+ fd = dup(buffered_fd);
+ if (fd < 0) {
+ close(buffered_fd);
return ERR_PTR(-errno);
+ }
- sync_fd = open(path, flags|O_SYNC);
+ sync_fd = open(path, flags|O_DIRECT|O_SYNC);
+ if (sync_fd < 0)
+ sync_fd = open(path, flags|O_SYNC);
if (sync_fd < 0) {
- assert(0);
close(fd);
+ close(buffered_fd);
return ERR_PTR(-errno);
}
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_bdi = &bdev->__bd_bdi;
- bdev->queue.backing_dev_info = bdev->bd_bdi;
+ bdev->bd_disk->bdi = &bdev->bd_disk->__bdi;
+ bdev->queue.backing_dev_info = bdev->bd_disk->bdi;
return bdev;
}
? bio->bi_bdev->bd_sync_fd
: bio->bi_bdev->bd_fd,
.aio_lio_opcode = opcode,
- .u.v.vec = iov,
- .u.v.nr = i,
- .u.v.offset = bio->bi_iter.bi_sector << 9,
+ .u.c.buf = iov,
+ .u.c.nbytes = i,
+ .u.c.offset = bio->bi_iter.bi_sector << 9,
}, *iocbp = &iocb;