Skip to content

Commit e253d98

Browse files
committed
Merge branch 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull nowait read support from Al Viro: "Support IOCB_NOWAIT for buffered reads and block devices" * 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: block_dev: support RFW_NOWAIT on block device nodes fs: support RWF_NOWAIT for buffered reads fs: support IOCB_NOWAIT in generic_file_buffered_read fs: pass iocb to do_generic_file_read
2 parents 0f0d127 + c35fc7a commit e253d98

File tree

7 files changed

+42
-22
lines changed

7 files changed

+42
-22
lines changed

fs/aio.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,12 +1606,6 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
16061606
goto out_put_req;
16071607
}
16081608

1609-
if ((req->common.ki_flags & IOCB_NOWAIT) &&
1610-
!(req->common.ki_flags & IOCB_DIRECT)) {
1611-
ret = -EOPNOTSUPP;
1612-
goto out_put_req;
1613-
}
1614-
16151609
ret = put_user(KIOCB_KEY, &user_iocb->aio_key);
16161610
if (unlikely(ret)) {
16171611
pr_debug("EFAULT: aio_key\n");

fs/block_dev.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,8 @@ static int blkdev_open(struct inode * inode, struct file * filp)
17401740
*/
17411741
filp->f_flags |= O_LARGEFILE;
17421742

1743+
filp->f_mode |= FMODE_NOWAIT;
1744+
17431745
if (filp->f_flags & O_NDELAY)
17441746
filp->f_mode |= FMODE_NDELAY;
17451747
if (filp->f_flags & O_EXCL)
@@ -1892,6 +1894,9 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
18921894
if (iocb->ki_pos >= size)
18931895
return -ENOSPC;
18941896

1897+
if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT)
1898+
return -EOPNOTSUPP;
1899+
18951900
iov_iter_truncate(from, size - iocb->ki_pos);
18961901

18971902
blk_start_plug(&plug);

fs/btrfs/file.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1886,6 +1886,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
18861886
loff_t oldsize;
18871887
int clean_page = 0;
18881888

1889+
if (!(iocb->ki_flags & IOCB_DIRECT) &&
1890+
(iocb->ki_flags & IOCB_NOWAIT))
1891+
return -EOPNOTSUPP;
1892+
18891893
if (!inode_trylock(inode)) {
18901894
if (iocb->ki_flags & IOCB_NOWAIT)
18911895
return -EAGAIN;
@@ -3112,7 +3116,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence)
31123116

31133117
static int btrfs_file_open(struct inode *inode, struct file *filp)
31143118
{
3115-
filp->f_mode |= FMODE_AIO_NOWAIT;
3119+
filp->f_mode |= FMODE_NOWAIT;
31163120
return generic_file_open(inode, filp);
31173121
}
31183122

fs/ext4/file.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
223223
if (IS_DAX(inode))
224224
return ext4_dax_write_iter(iocb, from);
225225
#endif
226+
if (!o_direct && (iocb->ki_flags & IOCB_NOWAIT))
227+
return -EOPNOTSUPP;
226228

227229
if (!inode_trylock(inode)) {
228230
if (iocb->ki_flags & IOCB_NOWAIT)
@@ -431,9 +433,7 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
431433
return ret;
432434
}
433435

434-
/* Set the flags to support nowait AIO */
435-
filp->f_mode |= FMODE_AIO_NOWAIT;
436-
436+
filp->f_mode |= FMODE_NOWAIT;
437437
return dquot_file_open(inode, filp);
438438
}
439439

fs/xfs/xfs_file.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,11 @@ xfs_file_buffered_aio_read(
259259

260260
trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos);
261261

262-
xfs_ilock(ip, XFS_IOLOCK_SHARED);
262+
if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) {
263+
if (iocb->ki_flags & IOCB_NOWAIT)
264+
return -EAGAIN;
265+
xfs_ilock(ip, XFS_IOLOCK_SHARED);
266+
}
263267
ret = generic_file_read_iter(iocb, to);
264268
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
265269

@@ -636,6 +640,9 @@ xfs_file_buffered_aio_write(
636640
int enospc = 0;
637641
int iolock;
638642

643+
if (iocb->ki_flags & IOCB_NOWAIT)
644+
return -EOPNOTSUPP;
645+
639646
write_retry:
640647
iolock = XFS_IOLOCK_EXCL;
641648
xfs_ilock(ip, iolock);
@@ -912,7 +919,7 @@ xfs_file_open(
912919
return -EFBIG;
913920
if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
914921
return -EIO;
915-
file->f_mode |= FMODE_AIO_NOWAIT;
922+
file->f_mode |= FMODE_NOWAIT;
916923
return 0;
917924
}
918925

include/linux/fs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
148148
/* File was opened by fanotify and shouldn't generate fanotify events */
149149
#define FMODE_NONOTIFY ((__force fmode_t)0x4000000)
150150

151-
/* File is capable of returning -EAGAIN if AIO will block */
152-
#define FMODE_AIO_NOWAIT ((__force fmode_t)0x8000000)
151+
/* File is capable of returning -EAGAIN if I/O will block */
152+
#define FMODE_NOWAIT ((__force fmode_t)0x8000000)
153153

154154
/*
155155
* Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector
@@ -3194,7 +3194,7 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags)
31943194
return -EOPNOTSUPP;
31953195

31963196
if (flags & RWF_NOWAIT) {
3197-
if (!(ki->ki_filp->f_mode & FMODE_AIO_NOWAIT))
3197+
if (!(ki->ki_filp->f_mode & FMODE_NOWAIT))
31983198
return -EOPNOTSUPP;
31993199
ki->ki_flags |= IOCB_NOWAIT;
32003200
}

mm/filemap.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,9 +1917,8 @@ static void shrink_readahead_size_eio(struct file *filp,
19171917
}
19181918

19191919
/**
1920-
* do_generic_file_read - generic file read routine
1921-
* @filp: the file to read
1922-
* @ppos: current file position
1920+
* generic_file_buffered_read - generic file read routine
1921+
* @iocb: the iocb to read
19231922
* @iter: data destination
19241923
* @written: already copied
19251924
*
@@ -1929,12 +1928,14 @@ static void shrink_readahead_size_eio(struct file *filp,
19291928
* This is really ugly. But the goto's actually try to clarify some
19301929
* of the logic when it comes to error handling etc.
19311930
*/
1932-
static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
1931+
static ssize_t generic_file_buffered_read(struct kiocb *iocb,
19331932
struct iov_iter *iter, ssize_t written)
19341933
{
1934+
struct file *filp = iocb->ki_filp;
19351935
struct address_space *mapping = filp->f_mapping;
19361936
struct inode *inode = mapping->host;
19371937
struct file_ra_state *ra = &filp->f_ra;
1938+
loff_t *ppos = &iocb->ki_pos;
19381939
pgoff_t index;
19391940
pgoff_t last_index;
19401941
pgoff_t prev_index;
@@ -1967,6 +1968,8 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
19671968

19681969
page = find_get_page(mapping, index);
19691970
if (!page) {
1971+
if (iocb->ki_flags & IOCB_NOWAIT)
1972+
goto would_block;
19701973
page_cache_sync_readahead(mapping,
19711974
ra, filp,
19721975
index, last_index - index);
@@ -1980,6 +1983,11 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
19801983
index, last_index - index);
19811984
}
19821985
if (!PageUptodate(page)) {
1986+
if (iocb->ki_flags & IOCB_NOWAIT) {
1987+
put_page(page);
1988+
goto would_block;
1989+
}
1990+
19831991
/*
19841992
* See comment in do_read_cache_page on why
19851993
* wait_on_page_locked is used to avoid unnecessarily
@@ -2161,6 +2169,8 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
21612169
goto readpage;
21622170
}
21632171

2172+
would_block:
2173+
error = -EAGAIN;
21642174
out:
21652175
ra->prev_pos = prev_index;
21662176
ra->prev_pos <<= PAGE_SHIFT;
@@ -2182,14 +2192,14 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
21822192
ssize_t
21832193
generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
21842194
{
2185-
struct file *file = iocb->ki_filp;
2186-
ssize_t retval = 0;
21872195
size_t count = iov_iter_count(iter);
2196+
ssize_t retval = 0;
21882197

21892198
if (!count)
21902199
goto out; /* skip atime */
21912200

21922201
if (iocb->ki_flags & IOCB_DIRECT) {
2202+
struct file *file = iocb->ki_filp;
21932203
struct address_space *mapping = file->f_mapping;
21942204
struct inode *inode = mapping->host;
21952205
loff_t size;
@@ -2230,7 +2240,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
22302240
goto out;
22312241
}
22322242

2233-
retval = do_generic_file_read(file, &iocb->ki_pos, iter, retval);
2243+
retval = generic_file_buffered_read(iocb, iter, retval);
22342244
out:
22352245
return retval;
22362246
}

0 commit comments

Comments
 (0)