* [PATCH v3 00/18] Allow readpage to return a locked page @ 2020-10-16 16:04 Matthew Wilcox (Oracle) 2020-10-16 16:04 ` [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous Matthew Wilcox (Oracle) 2020-10-16 16:04 ` [PATCH v3 12/18] ext4: Return error from ext4_readpage Matthew Wilcox (Oracle) 0 siblings, 2 replies; 6+ messages in thread From: Matthew Wilcox (Oracle) @ 2020-10-16 16:04 UTC (permalink / raw) To: linux-fsdevel Cc: Matthew Wilcox (Oracle), linux-mm, David Howells, Steve French, linux-cifs, Nicolas Pitre, Tyler Hicks, ecryptfs, Theodore Ts'o, Andreas Dilger, linux-ext4, Miklos Szeredi, Hans de Goede I've dropped the conversion of readpage implementations to synchronous from this patchset. I realised I'd neglected the requirement for making the sleep killable, and that turns out to be more convoluted to fix. So these patches add: - An error-path bugfix for cachefiles. - The ability for the filesystem to tell the caller of ->readpage that the read was successful and the page was not unlocked. This is a performance improvement for some scenarios that I think are rare. - Mildly improved error handling for ext4. v2: https://lore.kernel.org/linux-fsdevel/20201009143104.22673-1-willy@infradead.org/ v1: https://lore.kernel.org/linux-fsdevel/20200917151050.5363-1-willy@infradead.org/ Matthew Wilcox (Oracle) (18): cachefiles: Handle readpage error correctly swap: Call aops->readahead if appropriate fs: Add AOP_UPDATED_PAGE return value mm/filemap: Inline wait_on_page_read into its one caller 9p: Tell the VFS that readpage was synchronous afs: Tell the VFS that readpage was synchronous ceph: Tell the VFS that readpage was synchronous cifs: Tell the VFS that readpage was synchronous cramfs: Tell the VFS that readpage was synchronous ecryptfs: Tell the VFS that readpage was synchronous ext4: Tell the VFS that readpage was synchronous ext4: Return error from ext4_readpage fuse: Tell the VFS that readpage was synchronous hostfs: Tell the VFS that readpage was synchronous jffs2: Tell the VFS that readpage was synchronous ubifs: Tell the VFS that readpage was synchronous udf: Tell the VFS that readpage was synchronous vboxsf: Tell the VFS that readpage was synchronous Documentation/filesystems/locking.rst | 7 +++--- Documentation/filesystems/vfs.rst | 21 +++++++++++------ fs/9p/vfs_addr.c | 6 ++++- fs/afs/file.c | 3 ++- fs/buffer.c | 15 +++++++----- fs/cachefiles/rdwr.c | 9 ++++++++ fs/ceph/addr.c | 9 ++++---- fs/cifs/file.c | 8 +++++-- fs/cramfs/inode.c | 5 ++-- fs/ecryptfs/mmap.c | 11 +++++---- fs/ext4/inline.c | 9 +++++--- fs/ext4/readpage.c | 24 +++++++++++-------- fs/fuse/file.c | 2 ++ fs/hostfs/hostfs_kern.c | 2 ++ fs/jffs2/file.c | 6 +++-- fs/ubifs/file.c | 16 ++++++++----- fs/udf/file.c | 3 +-- fs/vboxsf/file.c | 2 ++ include/linux/fs.h | 5 ++++ mm/filemap.c | 33 +++++++++++++-------------- mm/page_io.c | 27 ++++++++++++++++++++-- mm/readahead.c | 3 ++- 22 files changed, 151 insertions(+), 75 deletions(-) -- 2.28.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous 2020-10-16 16:04 [PATCH v3 00/18] Allow readpage to return a locked page Matthew Wilcox (Oracle) @ 2020-10-16 16:04 ` Matthew Wilcox (Oracle) 2020-10-18 14:24 ` Theodore Y. Ts'o 2020-10-16 16:04 ` [PATCH v3 12/18] ext4: Return error from ext4_readpage Matthew Wilcox (Oracle) 1 sibling, 1 reply; 6+ messages in thread From: Matthew Wilcox (Oracle) @ 2020-10-16 16:04 UTC (permalink / raw) To: linux-fsdevel Cc: Matthew Wilcox (Oracle), linux-mm, Theodore Ts'o, Andreas Dilger, linux-ext4 The ext4 inline data readpage implementation was already synchronous, so use AOP_UPDATED_PAGE to avoid cycling the page lock. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/ext4/inline.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 75c97bca0815..2a489243e4de 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -490,7 +490,8 @@ static int ext4_read_inline_page(struct inode *inode, struct page *page) zero_user_segment(page, len, PAGE_SIZE); SetPageUptodate(page); brelse(iloc.bh); - + if (ret >= 0) + return AOP_UPDATED_PAGE; out: return ret; } @@ -514,12 +515,14 @@ int ext4_readpage_inline(struct inode *inode, struct page *page) else if (!PageUptodate(page)) { zero_user_segment(page, 0, PAGE_SIZE); SetPageUptodate(page); + ret = AOP_UPDATED_PAGE; } up_read(&EXT4_I(inode)->xattr_sem); - unlock_page(page); - return ret >= 0 ? 0 : ret; + if (ret < 0) + unlock_page(page); + return ret; } static int ext4_convert_inline_data_to_extent(struct address_space *mapping, -- 2.28.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous 2020-10-16 16:04 ` [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous Matthew Wilcox (Oracle) @ 2020-10-18 14:24 ` Theodore Y. Ts'o 0 siblings, 0 replies; 6+ messages in thread From: Theodore Y. Ts'o @ 2020-10-18 14:24 UTC (permalink / raw) To: Matthew Wilcox (Oracle) Cc: linux-fsdevel, linux-mm, Andreas Dilger, linux-ext4 On Fri, Oct 16, 2020 at 05:04:36PM +0100, Matthew Wilcox (Oracle) wrote: > The ext4 inline data readpage implementation was already synchronous, > so use AOP_UPDATED_PAGE to avoid cycling the page lock. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Acked-by: Theodore Ts'o <tytso@mit.edu> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 12/18] ext4: Return error from ext4_readpage 2020-10-16 16:04 [PATCH v3 00/18] Allow readpage to return a locked page Matthew Wilcox (Oracle) 2020-10-16 16:04 ` [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous Matthew Wilcox (Oracle) @ 2020-10-16 16:04 ` Matthew Wilcox (Oracle) 2020-10-18 14:25 ` Theodore Y. Ts'o 1 sibling, 1 reply; 6+ messages in thread From: Matthew Wilcox (Oracle) @ 2020-10-16 16:04 UTC (permalink / raw) To: linux-fsdevel Cc: Matthew Wilcox (Oracle), linux-mm, Theodore Ts'o, Andreas Dilger, linux-ext4 The error returned from ext4_map_blocks() was being discarded, leading to the generic -EIO being returned to userspace. Now ext4 can return more precise errors. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/ext4/readpage.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c index f014c5e473a9..00a024f3a954 100644 --- a/fs/ext4/readpage.c +++ b/fs/ext4/readpage.c @@ -237,7 +237,7 @@ int ext4_mpage_readpages(struct inode *inode, sector_t blocks[MAX_BUF_PER_PAGE]; unsigned page_block; struct block_device *bdev = inode->i_sb->s_bdev; - int length; + int length, err = 0; unsigned relative_block = 0; struct ext4_map_blocks map; unsigned int nr_pages = rac ? readahead_count(rac) : 1; @@ -301,14 +301,9 @@ int ext4_mpage_readpages(struct inode *inode, map.m_lblk = block_in_file; map.m_len = last_block - block_in_file; - if (ext4_map_blocks(NULL, inode, &map, 0) < 0) { - set_error_page: - SetPageError(page); - zero_user_segment(page, 0, - PAGE_SIZE); - unlock_page(page); - goto next_page; - } + err = ext4_map_blocks(NULL, inode, &map, 0); + if (err < 0) + goto err; } if ((map.m_flags & EXT4_MAP_MAPPED) == 0) { fully_mapped = 0; @@ -395,6 +390,15 @@ int ext4_mpage_readpages(struct inode *inode, } else last_block_in_bio = blocks[blocks_per_page - 1]; goto next_page; + set_error_page: + err = -EIO; + err: + if (rac) { + SetPageError(page); + zero_user_segment(page, 0, PAGE_SIZE); + } + unlock_page(page); + goto next_page; confused: if (bio) { submit_bio(bio); @@ -410,7 +414,7 @@ int ext4_mpage_readpages(struct inode *inode, } if (bio) submit_bio(bio); - return 0; + return err; } int __init ext4_init_post_read_processing(void) -- 2.28.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 12/18] ext4: Return error from ext4_readpage 2020-10-16 16:04 ` [PATCH v3 12/18] ext4: Return error from ext4_readpage Matthew Wilcox (Oracle) @ 2020-10-18 14:25 ` Theodore Y. Ts'o 2020-10-18 15:04 ` Matthew Wilcox 0 siblings, 1 reply; 6+ messages in thread From: Theodore Y. Ts'o @ 2020-10-18 14:25 UTC (permalink / raw) To: Matthew Wilcox (Oracle) Cc: linux-fsdevel, linux-mm, Andreas Dilger, linux-ext4 On Fri, Oct 16, 2020 at 05:04:37PM +0100, Matthew Wilcox (Oracle) wrote: > The error returned from ext4_map_blocks() was being discarded, leading > to the generic -EIO being returned to userspace. Now ext4 can return > more precise errors. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> This change is independent of the synchronous readpage changes, correct? Or am I missing something? Cheers, - Ted ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 12/18] ext4: Return error from ext4_readpage 2020-10-18 14:25 ` Theodore Y. Ts'o @ 2020-10-18 15:04 ` Matthew Wilcox 0 siblings, 0 replies; 6+ messages in thread From: Matthew Wilcox @ 2020-10-18 15:04 UTC (permalink / raw) To: Theodore Y. Ts'o; +Cc: linux-fsdevel, linux-mm, Andreas Dilger, linux-ext4 On Sun, Oct 18, 2020 at 10:25:57AM -0400, Theodore Y. Ts'o wrote: > On Fri, Oct 16, 2020 at 05:04:37PM +0100, Matthew Wilcox (Oracle) wrote: > > The error returned from ext4_map_blocks() was being discarded, leading > > to the generic -EIO being returned to userspace. Now ext4 can return > > more precise errors. > > > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > > This change is independent of the synchronous readpage changes, > correct? Or am I missing something? It's a step along the way. If you want to queue it up independently of the other changes, I see no problem with that. The requirement to make a synchronous ->readpage killable is making the conversion quite thorny and I'm not sure I'm going to get it done this merge window. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-10-18 15:04 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-10-16 16:04 [PATCH v3 00/18] Allow readpage to return a locked page Matthew Wilcox (Oracle) 2020-10-16 16:04 ` [PATCH v3 11/18] ext4: Tell the VFS that readpage was synchronous Matthew Wilcox (Oracle) 2020-10-18 14:24 ` Theodore Y. Ts'o 2020-10-16 16:04 ` [PATCH v3 12/18] ext4: Return error from ext4_readpage Matthew Wilcox (Oracle) 2020-10-18 14:25 ` Theodore Y. Ts'o 2020-10-18 15:04 ` Matthew Wilcox
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).