|
@@ -7433,8 +7433,7 @@ out:
|
|
}
|
|
}
|
|
|
|
|
|
static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
|
|
static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
|
|
- const struct iovec *iov, loff_t offset,
|
|
|
|
- unsigned long nr_segs)
|
|
|
|
|
|
+ struct iov_iter *iter, loff_t offset)
|
|
{
|
|
{
|
|
struct file *file = iocb->ki_filp;
|
|
struct file *file = iocb->ki_filp;
|
|
struct inode *inode = file->f_mapping->host;
|
|
struct inode *inode = file->f_mapping->host;
|
|
@@ -7444,8 +7443,8 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
|
|
bool relock = false;
|
|
bool relock = false;
|
|
ssize_t ret;
|
|
ssize_t ret;
|
|
|
|
|
|
- if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov,
|
|
|
|
- offset, nr_segs))
|
|
|
|
|
|
+ if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iter->iov,
|
|
|
|
+ offset, iter->nr_segs))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
atomic_inc(&inode->i_dio_count);
|
|
atomic_inc(&inode->i_dio_count);
|
|
@@ -7457,7 +7456,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
|
|
* we need to flush the dirty pages again to make absolutely sure
|
|
* we need to flush the dirty pages again to make absolutely sure
|
|
* that any outstanding dirty pages are on disk.
|
|
* that any outstanding dirty pages are on disk.
|
|
*/
|
|
*/
|
|
- count = iov_length(iov, nr_segs);
|
|
|
|
|
|
+ count = iov_length(iter->iov, iter->nr_segs);
|
|
if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
|
|
if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
|
|
&BTRFS_I(inode)->runtime_flags))
|
|
&BTRFS_I(inode)->runtime_flags))
|
|
filemap_fdatawrite_range(inode->i_mapping, offset, count);
|
|
filemap_fdatawrite_range(inode->i_mapping, offset, count);
|
|
@@ -7484,7 +7483,8 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
|
|
|
|
|
|
ret = __blockdev_direct_IO(rw, iocb, inode,
|
|
ret = __blockdev_direct_IO(rw, iocb, inode,
|
|
BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
|
|
BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
|
|
- iov, offset, nr_segs, btrfs_get_blocks_direct, NULL,
|
|
|
|
|
|
+ iter->iov, offset, iter->nr_segs,
|
|
|
|
+ btrfs_get_blocks_direct, NULL,
|
|
btrfs_submit_direct, flags);
|
|
btrfs_submit_direct, flags);
|
|
if (rw & WRITE) {
|
|
if (rw & WRITE) {
|
|
if (ret < 0 && ret != -EIOCBQUEUED)
|
|
if (ret < 0 && ret != -EIOCBQUEUED)
|