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