Skip to content

Commit 9d645db

Browse files
committed
Merge tag 'for-5.8-part2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs updates from David Sterba: "This reverts the direct io port to iomap infrastructure of btrfs merged in the first pull request. We found problems in invalidate page that don't seem to be fixable as regressions or without changing iomap code that would not affect other filesystems. There are four reverts in total, but three of them are followup cleanups needed to revert a43a67a cleanly. The result is the buffer head based implementation of direct io. Reverts are not great, but under current circumstances I don't see better options" * tag 'for-5.8-part2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: Revert "btrfs: switch to iomap_dio_rw() for dio" Revert "fs: remove dio_end_io()" Revert "btrfs: remove BTRFS_INODE_READDIO_NEED_LOCK" Revert "btrfs: split btrfs_direct_IO to read and write part"
2 parents 96144c5 + 55e20bd commit 9d645db

File tree

7 files changed

+286
-234
lines changed

7 files changed

+286
-234
lines changed

fs/btrfs/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ config BTRFS_FS
1414
select LZO_DECOMPRESS
1515
select ZSTD_COMPRESS
1616
select ZSTD_DECOMPRESS
17-
select FS_IOMAP
1817
select RAID6_PQ
1918
select XOR_BLOCKS
2019
select SRCU

fs/btrfs/btrfs_inode.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ enum {
2828
BTRFS_INODE_NEEDS_FULL_SYNC,
2929
BTRFS_INODE_COPY_EVERYTHING,
3030
BTRFS_INODE_IN_DELALLOC_LIST,
31+
BTRFS_INODE_READDIO_NEED_LOCK,
3132
BTRFS_INODE_HAS_PROPS,
3233
BTRFS_INODE_SNAPSHOT_FLUSH,
3334
};
@@ -312,6 +313,23 @@ struct btrfs_dio_private {
312313
u8 csums[];
313314
};
314315

316+
/*
317+
* Disable DIO read nolock optimization, so new dio readers will be forced
318+
* to grab i_mutex. It is used to avoid the endless truncate due to
319+
* nonlocked dio read.
320+
*/
321+
static inline void btrfs_inode_block_unlocked_dio(struct btrfs_inode *inode)
322+
{
323+
set_bit(BTRFS_INODE_READDIO_NEED_LOCK, &inode->runtime_flags);
324+
smp_mb();
325+
}
326+
327+
static inline void btrfs_inode_resume_unlocked_dio(struct btrfs_inode *inode)
328+
{
329+
smp_mb__before_atomic();
330+
clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, &inode->runtime_flags);
331+
}
332+
315333
/* Array of bytes with variable length, hexadecimal format 0x1234 */
316334
#define CSUM_FMT "0x%*phN"
317335
#define CSUM_FMT_VALUE(size, bytes) size, bytes

fs/btrfs/ctree.h

Lines changed: 0 additions & 4 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"
@@ -2934,9 +2933,6 @@ int btrfs_writepage_cow_fixup(struct page *page, u64 start, u64 end);
29342933
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;
2937-
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;
29402936

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

fs/btrfs/file.c

Lines changed: 6 additions & 91 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 = generic_file_direct_write(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,54 +3476,9 @@ 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-
3551-
static ssize_t btrfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
3552-
{
3553-
ssize_t ret = 0;
3554-
3555-
if (iocb->ki_flags & IOCB_DIRECT) {
3556-
ret = btrfs_direct_read(iocb, to);
3557-
if (ret < 0)
3558-
return ret;
3559-
}
3560-
3561-
return generic_file_buffered_read(iocb, to, ret);
3562-
}
3563-
35643479
const struct file_operations btrfs_file_operations = {
35653480
.llseek = btrfs_file_llseek,
3566-
.read_iter = btrfs_file_read_iter,
3481+
.read_iter = generic_file_read_iter,
35673482
.splice_read = generic_file_splice_read,
35683483
.write_iter = btrfs_file_write_iter,
35693484
.mmap = btrfs_file_mmap,

0 commit comments

Comments
 (0)