diff options
| -rw-r--r-- | include/linux/fs.h | 1 | ||||
| -rw-r--r-- | mm/filemap.c | 23 | 
2 files changed, 22 insertions, 2 deletions
| diff --git a/include/linux/fs.h b/include/linux/fs.h index 3f881a892ea7..4b7cb76e5837 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -315,6 +315,7 @@ enum rw_hint {  #define IOCB_SYNC		(1 << 5)  #define IOCB_WRITE		(1 << 6)  #define IOCB_NOWAIT		(1 << 7) +#define IOCB_NOIO		(1 << 9)  struct kiocb {  	struct file		*ki_filp; diff --git a/mm/filemap.c b/mm/filemap.c index f0ae9a6308cb..385759c4ce4b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2028,7 +2028,7 @@ find_page:  		page = find_get_page(mapping, index);  		if (!page) { -			if (iocb->ki_flags & IOCB_NOWAIT) +			if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO))  				goto would_block;  			page_cache_sync_readahead(mapping,  					ra, filp, @@ -2038,6 +2038,10 @@ find_page:  				goto no_cached_page;  		}  		if (PageReadahead(page)) { +			if (iocb->ki_flags & IOCB_NOIO) { +				put_page(page); +				goto out; +			}  			page_cache_async_readahead(mapping,  					ra, filp, page,  					index, last_index - index); @@ -2160,6 +2164,11 @@ page_not_up_to_date_locked:  		}  readpage: +		if (iocb->ki_flags & IOCB_NOIO) { +			unlock_page(page); +			put_page(page); +			goto would_block; +		}  		/*  		 * A previous I/O error may have been due to temporary  		 * failures, eg. multipath errors. @@ -2249,9 +2258,19 @@ EXPORT_SYMBOL_GPL(generic_file_buffered_read);   *   * This is the "read_iter()" routine for all filesystems   * that can use the page cache directly. + * + * The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall + * be returned when no data can be read without waiting for I/O requests + * to complete; it doesn't prevent readahead. + * + * The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O + * requests shall be made for the read or for readahead.  When no data + * can be read, -EAGAIN shall be returned.  When readahead would be + * triggered, a partial, possibly empty read shall be returned. + *   * Return:   * * number of bytes copied, even for partial reads - * * negative error code if nothing was read + * * negative error code (or 0 if IOCB_NOIO) if nothing was read   */  ssize_t  generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) | 
