Message ID | 20170424132259.8680-5-jlayton@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> out: > inode_unlock(inode); > - return ret; > + err = filemap_check_errors(inode->i_mapping); > + return ret ? : err; Can you spell out the whole unary operation instead of this weird GCC extension? Otherwise looks fine: Reviewed-by: Christoph Hellwig <hch@lst.de>
On Mon 24-04-17 09:22:43, Jeff Layton wrote: > ext2 currently does a test+clear of the AS_EIO flag, which is > is problematic for some coming changes. > > What we really need to do instead is call filemap_check_errors > in __generic_file_fsync after syncing out the buffers. That > will be sufficient for this case, and help other callers detect > these errors properly as well. > > With that, we don't need to twiddle it in ext2. > > Suggested-by: Jan Kara <jack@suse.cz> > Signed-off-by: Jeff Layton <jlayton@redhat.com> Looks good to me. You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext2/file.c | 2 +- > fs/libfs.c | 3 ++- > 2 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/ext2/file.c b/fs/ext2/file.c > index b21891a6bfca..ed00e7ae0ef3 100644 > --- a/fs/ext2/file.c > +++ b/fs/ext2/file.c > @@ -177,7 +177,7 @@ int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync) > struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping; > > ret = generic_file_fsync(file, start, end, datasync); > - if (ret == -EIO || test_and_clear_bit(AS_EIO, &mapping->flags)) { > + if (ret == -EIO) { > /* We don't really know where the IO error happened... */ > ext2_error(sb, __func__, > "detected IO error when writing metadata buffers"); > diff --git a/fs/libfs.c b/fs/libfs.c > index a8b62e5d43a9..12a48ee442d3 100644 > --- a/fs/libfs.c > +++ b/fs/libfs.c > @@ -991,7 +991,8 @@ int __generic_file_fsync(struct file *file, loff_t start, loff_t end, > > out: > inode_unlock(inode); > - return ret; > + err = filemap_check_errors(inode->i_mapping); > + return ret ? : err; > } > EXPORT_SYMBOL(__generic_file_fsync); > > -- > 2.9.3 > >
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index b21891a6bfca..ed00e7ae0ef3 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -177,7 +177,7 @@ int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync) struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping; ret = generic_file_fsync(file, start, end, datasync); - if (ret == -EIO || test_and_clear_bit(AS_EIO, &mapping->flags)) { + if (ret == -EIO) { /* We don't really know where the IO error happened... */ ext2_error(sb, __func__, "detected IO error when writing metadata buffers"); diff --git a/fs/libfs.c b/fs/libfs.c index a8b62e5d43a9..12a48ee442d3 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -991,7 +991,8 @@ int __generic_file_fsync(struct file *file, loff_t start, loff_t end, out: inode_unlock(inode); - return ret; + err = filemap_check_errors(inode->i_mapping); + return ret ? : err; } EXPORT_SYMBOL(__generic_file_fsync);
ext2 currently does a test+clear of the AS_EIO flag, which is is problematic for some coming changes. What we really need to do instead is call filemap_check_errors in __generic_file_fsync after syncing out the buffers. That will be sufficient for this case, and help other callers detect these errors properly as well. With that, we don't need to twiddle it in ext2. Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Jeff Layton <jlayton@redhat.com> --- fs/ext2/file.c | 2 +- fs/libfs.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)