Skip to content

Commit f4c48b4

Browse files
committed
Revert "btrfs: split btrfs_direct_IO to read and write part"
This reverts commit d8f3e73. The patch is a cleanup of direct IO port to iomap infrastructure, which gets reverted. Signed-off-by: David Sterba <[email protected]>
1 parent 2166e5e commit f4c48b4

File tree

3 files changed

+90
-83
lines changed

3 files changed

+90
-83
lines changed

fs/btrfs/ctree.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include <linux/dynamic_debug.h>
2929
#include <linux/refcount.h>
3030
#include <linux/crc32c.h>
31-
#include <linux/iomap.h>
3231
#include "extent-io-tree.h"
3332
#include "extent_io.h"
3433
#include "extent_map.h"
@@ -2935,8 +2934,6 @@ void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start,
29352934
u64 end, int uptodate);
29362935
extern const struct dentry_operations btrfs_dentry_operations;
29372936
ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
2938-
extern const struct iomap_ops btrfs_dio_iomap_ops;
2939-
extern const struct iomap_dio_ops btrfs_dops;
29402937

29412938
/* ioctl.c */
29422939
long btrfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);

fs/btrfs/file.c

Lines changed: 10 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,61 +1809,21 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb,
18091809
return num_written ? num_written : ret;
18101810
}
18111811

1812-
static ssize_t check_direct_IO(struct btrfs_fs_info *fs_info,
1813-
const struct iov_iter *iter, loff_t offset)
1814-
{
1815-
const unsigned int blocksize_mask = fs_info->sectorsize - 1;
1816-
1817-
if (offset & blocksize_mask)
1818-
return -EINVAL;
1819-
1820-
if (iov_iter_alignment(iter) & blocksize_mask)
1821-
return -EINVAL;
1822-
1823-
return 0;
1824-
}
1825-
1826-
static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
1812+
static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
18271813
{
18281814
struct file *file = iocb->ki_filp;
18291815
struct inode *inode = file_inode(file);
1830-
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
1831-
loff_t pos = iocb->ki_pos;
1832-
ssize_t written = 0;
1816+
loff_t pos;
1817+
ssize_t written;
18331818
ssize_t written_buffered;
18341819
loff_t endbyte;
18351820
int err;
1836-
size_t count = 0;
1837-
bool relock = false;
18381821

1839-
if (check_direct_IO(fs_info, from, pos))
1840-
goto buffered;
1841-
1842-
count = iov_iter_count(from);
1843-
/*
1844-
* If the write DIO is beyond the EOF, we need update the isize, but it
1845-
* is protected by i_mutex. So we can not unlock the i_mutex at this
1846-
* case.
1847-
*/
1848-
if (pos + count <= inode->i_size) {
1849-
inode_unlock(inode);
1850-
relock = true;
1851-
} else if (iocb->ki_flags & IOCB_NOWAIT) {
1852-
return -EAGAIN;
1853-
}
1854-
1855-
down_read(&BTRFS_I(inode)->dio_sem);
1856-
written = iomap_dio_rw(iocb, from, &btrfs_dio_iomap_ops, &btrfs_dops,
1857-
is_sync_kiocb(iocb));
1858-
up_read(&BTRFS_I(inode)->dio_sem);
1859-
1860-
if (relock)
1861-
inode_lock(inode);
1822+
written = btrfs_direct_IO(iocb, from);
18621823

18631824
if (written < 0 || !iov_iter_count(from))
18641825
return written;
18651826

1866-
buffered:
18671827
pos = iocb->ki_pos;
18681828
written_buffered = btrfs_buffered_write(iocb, from);
18691829
if (written_buffered < 0) {
@@ -2002,7 +1962,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
20021962
atomic_inc(&BTRFS_I(inode)->sync_writers);
20031963

20041964
if (iocb->ki_flags & IOCB_DIRECT) {
2005-
num_written = btrfs_direct_write(iocb, from);
1965+
num_written = __btrfs_direct_write(iocb, from);
20061966
} else {
20071967
num_written = btrfs_buffered_write(iocb, from);
20081968
if (num_written > 0)
@@ -3516,44 +3476,16 @@ static int btrfs_file_open(struct inode *inode, struct file *filp)
35163476
return generic_file_open(inode, filp);
35173477
}
35183478

3519-
static int check_direct_read(struct btrfs_fs_info *fs_info,
3520-
const struct iov_iter *iter, loff_t offset)
3521-
{
3522-
int ret;
3523-
int i, seg;
3524-
3525-
ret = check_direct_IO(fs_info, iter, offset);
3526-
if (ret < 0)
3527-
return ret;
3528-
3529-
for (seg = 0; seg < iter->nr_segs; seg++)
3530-
for (i = seg + 1; i < iter->nr_segs; i++)
3531-
if (iter->iov[seg].iov_base == iter->iov[i].iov_base)
3532-
return -EINVAL;
3533-
return 0;
3534-
}
3535-
3536-
static ssize_t btrfs_direct_read(struct kiocb *iocb, struct iov_iter *to)
3537-
{
3538-
struct inode *inode = file_inode(iocb->ki_filp);
3539-
ssize_t ret;
3540-
3541-
if (check_direct_read(btrfs_sb(inode->i_sb), to, iocb->ki_pos))
3542-
return 0;
3543-
3544-
inode_lock_shared(inode);
3545-
ret = iomap_dio_rw(iocb, to, &btrfs_dio_iomap_ops, &btrfs_dops,
3546-
is_sync_kiocb(iocb));
3547-
inode_unlock_shared(inode);
3548-
return ret;
3549-
}
3550-
35513479
static ssize_t btrfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
35523480
{
35533481
ssize_t ret = 0;
35543482

35553483
if (iocb->ki_flags & IOCB_DIRECT) {
3556-
ret = btrfs_direct_read(iocb, to);
3484+
struct inode *inode = file_inode(iocb->ki_filp);
3485+
3486+
inode_lock_shared(inode);
3487+
ret = btrfs_direct_IO(iocb, to);
3488+
inode_unlock_shared(inode);
35573489
if (ret < 0)
35583490
return ret;
35593491
}

fs/btrfs/inode.c

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <linux/swap.h>
3030
#include <linux/migrate.h>
3131
#include <linux/sched/mm.h>
32+
#include <linux/iomap.h>
3233
#include <asm/unaligned.h>
3334
#include "misc.h"
3435
#include "ctree.h"
@@ -7819,15 +7820,92 @@ static blk_qc_t btrfs_submit_direct(struct inode *inode, struct iomap *iomap,
78197820
return BLK_QC_T_NONE;
78207821
}
78217822

7822-
const struct iomap_ops btrfs_dio_iomap_ops = {
7823+
static ssize_t check_direct_IO(struct btrfs_fs_info *fs_info,
7824+
const struct iov_iter *iter, loff_t offset)
7825+
{
7826+
int seg;
7827+
int i;
7828+
unsigned int blocksize_mask = fs_info->sectorsize - 1;
7829+
ssize_t retval = -EINVAL;
7830+
7831+
if (offset & blocksize_mask)
7832+
goto out;
7833+
7834+
if (iov_iter_alignment(iter) & blocksize_mask)
7835+
goto out;
7836+
7837+
/* If this is a write we don't need to check anymore */
7838+
if (iov_iter_rw(iter) != READ || !iter_is_iovec(iter))
7839+
return 0;
7840+
/*
7841+
* Check to make sure we don't have duplicate iov_base's in this
7842+
* iovec, if so return EINVAL, otherwise we'll get csum errors
7843+
* when reading back.
7844+
*/
7845+
for (seg = 0; seg < iter->nr_segs; seg++) {
7846+
for (i = seg + 1; i < iter->nr_segs; i++) {
7847+
if (iter->iov[seg].iov_base == iter->iov[i].iov_base)
7848+
goto out;
7849+
}
7850+
}
7851+
retval = 0;
7852+
out:
7853+
return retval;
7854+
}
7855+
7856+
static const struct iomap_ops btrfs_dio_iomap_ops = {
78237857
.iomap_begin = btrfs_dio_iomap_begin,
78247858
.iomap_end = btrfs_dio_iomap_end,
78257859
};
78267860

7827-
const struct iomap_dio_ops btrfs_dops = {
7861+
static const struct iomap_dio_ops btrfs_dops = {
78287862
.submit_io = btrfs_submit_direct,
78297863
};
78307864

7865+
ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
7866+
{
7867+
struct file *file = iocb->ki_filp;
7868+
struct inode *inode = file->f_mapping->host;
7869+
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
7870+
struct extent_changeset *data_reserved = NULL;
7871+
loff_t offset = iocb->ki_pos;
7872+
size_t count = 0;
7873+
bool relock = false;
7874+
ssize_t ret;
7875+
7876+
if (check_direct_IO(fs_info, iter, offset))
7877+
return 0;
7878+
7879+
count = iov_iter_count(iter);
7880+
if (iov_iter_rw(iter) == WRITE) {
7881+
/*
7882+
* If the write DIO is beyond the EOF, we need update
7883+
* the isize, but it is protected by i_mutex. So we can
7884+
* not unlock the i_mutex at this case.
7885+
*/
7886+
if (offset + count <= inode->i_size) {
7887+
inode_unlock(inode);
7888+
relock = true;
7889+
} else if (iocb->ki_flags & IOCB_NOWAIT) {
7890+
ret = -EAGAIN;
7891+
goto out;
7892+
}
7893+
down_read(&BTRFS_I(inode)->dio_sem);
7894+
}
7895+
7896+
ret = iomap_dio_rw(iocb, iter, &btrfs_dio_iomap_ops, &btrfs_dops,
7897+
is_sync_kiocb(iocb));
7898+
7899+
if (iov_iter_rw(iter) == WRITE) {
7900+
up_read(&BTRFS_I(inode)->dio_sem);
7901+
}
7902+
out:
7903+
if (relock)
7904+
inode_lock(inode);
7905+
extent_changeset_free(data_reserved);
7906+
return ret;
7907+
}
7908+
78317909
#define BTRFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC)
78327910

78337911
static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,

0 commit comments

Comments
 (0)