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

+42 -22
-6
fs/aio.c
··· 1606 1606 goto out_put_req; 1607 1607 } 1608 1608 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 - 1615 1609 ret = put_user(KIOCB_KEY, &user_iocb->aio_key); 1616 1610 if (unlikely(ret)) { 1617 1611 pr_debug("EFAULT: aio_key\n");
+5
fs/block_dev.c
··· 1740 1740 */ 1741 1741 filp->f_flags |= O_LARGEFILE; 1742 1742 1743 + filp->f_mode |= FMODE_NOWAIT; 1744 + 1743 1745 if (filp->f_flags & O_NDELAY) 1744 1746 filp->f_mode |= FMODE_NDELAY; 1745 1747 if (filp->f_flags & O_EXCL) ··· 1893 1891 1894 1892 if (iocb->ki_pos >= size) 1895 1893 return -ENOSPC; 1894 + 1895 + if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT) 1896 + return -EOPNOTSUPP; 1896 1897 1897 1898 iov_iter_truncate(from, size - iocb->ki_pos); 1898 1899
+5 -1
fs/btrfs/file.c
··· 1886 1886 loff_t oldsize; 1887 1887 int clean_page = 0; 1888 1888 1889 + if (!(iocb->ki_flags & IOCB_DIRECT) && 1890 + (iocb->ki_flags & IOCB_NOWAIT)) 1891 + return -EOPNOTSUPP; 1892 + 1889 1893 if (!inode_trylock(inode)) { 1890 1894 if (iocb->ki_flags & IOCB_NOWAIT) 1891 1895 return -EAGAIN; ··· 3116 3112 3117 3113 static int btrfs_file_open(struct inode *inode, struct file *filp) 3118 3114 { 3119 - filp->f_mode |= FMODE_AIO_NOWAIT; 3115 + filp->f_mode |= FMODE_NOWAIT; 3120 3116 return generic_file_open(inode, filp); 3121 3117 } 3122 3118
+3 -3
fs/ext4/file.c
··· 223 223 if (IS_DAX(inode)) 224 224 return ext4_dax_write_iter(iocb, from); 225 225 #endif 226 + if (!o_direct && (iocb->ki_flags & IOCB_NOWAIT)) 227 + return -EOPNOTSUPP; 226 228 227 229 if (!inode_trylock(inode)) { 228 230 if (iocb->ki_flags & IOCB_NOWAIT) ··· 433 431 return ret; 434 432 } 435 433 436 - /* Set the flags to support nowait AIO */ 437 - filp->f_mode |= FMODE_AIO_NOWAIT; 438 - 434 + filp->f_mode |= FMODE_NOWAIT; 439 435 return dquot_file_open(inode, filp); 440 436 } 441 437
+9 -2
fs/xfs/xfs_file.c
··· 259 259 260 260 trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos); 261 261 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 + } 263 267 ret = generic_file_read_iter(iocb, to); 264 268 xfs_iunlock(ip, XFS_IOLOCK_SHARED); 265 269 ··· 640 636 int enospc = 0; 641 637 int iolock; 642 638 639 + if (iocb->ki_flags & IOCB_NOWAIT) 640 + return -EOPNOTSUPP; 641 + 643 642 write_retry: 644 643 iolock = XFS_IOLOCK_EXCL; 645 644 xfs_ilock(ip, iolock); ··· 919 912 return -EFBIG; 920 913 if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb))) 921 914 return -EIO; 922 - file->f_mode |= FMODE_AIO_NOWAIT; 915 + file->f_mode |= FMODE_NOWAIT; 923 916 return 0; 924 917 } 925 918
+3 -3
include/linux/fs.h
··· 148 148 /* File was opened by fanotify and shouldn't generate fanotify events */ 149 149 #define FMODE_NONOTIFY ((__force fmode_t)0x4000000) 150 150 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) 153 153 154 154 /* 155 155 * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector ··· 3194 3194 return -EOPNOTSUPP; 3195 3195 3196 3196 if (flags & RWF_NOWAIT) { 3197 - if (!(ki->ki_filp->f_mode & FMODE_AIO_NOWAIT)) 3197 + if (!(ki->ki_filp->f_mode & FMODE_NOWAIT)) 3198 3198 return -EOPNOTSUPP; 3199 3199 ki->ki_flags |= IOCB_NOWAIT; 3200 3200 }
+17 -7
mm/filemap.c
··· 1917 1917 } 1918 1918 1919 1919 /** 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 1923 1922 * @iter: data destination 1924 1923 * @written: already copied 1925 1924 * ··· 1928 1929 * This is really ugly. But the goto's actually try to clarify some 1929 1930 * of the logic when it comes to error handling etc. 1930 1931 */ 1931 - static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos, 1932 + static ssize_t generic_file_buffered_read(struct kiocb *iocb, 1932 1933 struct iov_iter *iter, ssize_t written) 1933 1934 { 1935 + struct file *filp = iocb->ki_filp; 1934 1936 struct address_space *mapping = filp->f_mapping; 1935 1937 struct inode *inode = mapping->host; 1936 1938 struct file_ra_state *ra = &filp->f_ra; 1939 + loff_t *ppos = &iocb->ki_pos; 1937 1940 pgoff_t index; 1938 1941 pgoff_t last_index; 1939 1942 pgoff_t prev_index; ··· 1968 1967 1969 1968 page = find_get_page(mapping, index); 1970 1969 if (!page) { 1970 + if (iocb->ki_flags & IOCB_NOWAIT) 1971 + goto would_block; 1971 1972 page_cache_sync_readahead(mapping, 1972 1973 ra, filp, 1973 1974 index, last_index - index); ··· 1983 1980 index, last_index - index); 1984 1981 } 1985 1982 if (!PageUptodate(page)) { 1983 + if (iocb->ki_flags & IOCB_NOWAIT) { 1984 + put_page(page); 1985 + goto would_block; 1986 + } 1987 + 1986 1988 /* 1987 1989 * See comment in do_read_cache_page on why 1988 1990 * wait_on_page_locked is used to avoid unnecessarily ··· 2169 2161 goto readpage; 2170 2162 } 2171 2163 2164 + would_block: 2165 + error = -EAGAIN; 2172 2166 out: 2173 2167 ra->prev_pos = prev_index; 2174 2168 ra->prev_pos <<= PAGE_SHIFT; ··· 2192 2182 ssize_t 2193 2183 generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) 2194 2184 { 2195 - struct file *file = iocb->ki_filp; 2196 - ssize_t retval = 0; 2197 2185 size_t count = iov_iter_count(iter); 2186 + ssize_t retval = 0; 2198 2187 2199 2188 if (!count) 2200 2189 goto out; /* skip atime */ 2201 2190 2202 2191 if (iocb->ki_flags & IOCB_DIRECT) { 2192 + struct file *file = iocb->ki_filp; 2203 2193 struct address_space *mapping = file->f_mapping; 2204 2194 struct inode *inode = mapping->host; 2205 2195 loff_t size; ··· 2240 2230 goto out; 2241 2231 } 2242 2232 2243 - retval = do_generic_file_read(file, &iocb->ki_pos, iter, retval); 2233 + retval = generic_file_buffered_read(iocb, iter, retval); 2244 2234 out: 2245 2235 return retval; 2246 2236 }