@@ -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 ;
21642174out :
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,
21822192ssize_t
21832193generic_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 );
22342244out :
22352245 return retval ;
22362246}
0 commit comments