@@ -2116,6 +2116,26 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
end >> PAGE_SHIFT);
}
+static int blkdev_ioinfo(struct file *file, struct fcntl_ioinfo *fio)
+{
+ struct block_device *bdev = I_BDEV(bdev_file_inode(file));
+ struct request_queue *q = bdev_get_queue(bdev);
+ unsigned int atomic_sectors = queue_max_atomic_write_sectors(q);
+
+ if (file->f_flags & O_DIRECT) {
+ fio->fio_alignment = bdev_logical_block_size(bdev);
+
+ if ((file->f_flags & O_ATOMIC) && atomic_sectors) {
+ fio->fio_flags = FIO_FL_ATOMIC_OSYNC;
+ fio->fio_max_atomic = (atomic_sectors << 9);
+ if (fio->fio_alignment)
+ fio->fio_max_atomic &= ~(fio->fio_alignment - 1);
+ }
+ }
+
+ return 0;
+};
+
const struct file_operations def_blk_fops = {
.open = blkdev_open,
.release = blkdev_close,
@@ -2131,6 +2151,7 @@ const struct file_operations def_blk_fops = {
.splice_read = generic_file_splice_read,
.splice_write = iter_file_splice_write,
.fallocate = blkdev_fallocate,
+ .ioinfo = blkdev_ioinfo,
};
int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/block_dev.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)