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;
}
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;
}