Message ID | 20170531124540.8782-9-jlayton@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, May 31, 2017 at 08:45:31AM -0400, Jeff Layton wrote: > Jan's description for this patch is much better than mine, so I'm > quoting it verbatim here: > > -----------------8<----------------- > DAX currently doesn't set errors in the mapping when cache flushing > fails in dax_writeback_mapping_range(). Since this function can get > called only from fsync(2) or sync(2), this is actually as good as it can > currently get since we correctly propagate the error up from > dax_writeback_mapping_range() to filemap_fdatawrite() > > However, in the future better writeback error handling will enable us to > properly report these errors on fsync(2) even if there are multiple file > descriptors open against the file or if sync(2) gets called before > fsync(2). So convert DAX to using standard error reporting through the > mapping. > -----------------8<----------------- > > For now, only do this when the FS_WB_ERRSEQ flag is set. The > AS_EIO/AS_ENOSPC flags are not currently cleared in the older code when > writeback initiation fails, only when we discover an error after waiting > on writeback to complete, so we only want to do this with errseq_t based > error handling to prevent seeing duplicate errors on fsync. > > Signed-off-by: Jeff Layton <jlayton@redhat.com> > Reviewed-by: Jan Kara <jack@suse.cz> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Reviewed-and-Tested-by: Ross Zwisler <ross.zwisler@linux.intel.com> Re-tested this version of the series with some injected DAX errors, and it looks good.
On Mon, 2017-06-05 at 19:01 -0600, Ross Zwisler wrote: > On Wed, May 31, 2017 at 08:45:31AM -0400, Jeff Layton wrote: > > Jan's description for this patch is much better than mine, so I'm > > quoting it verbatim here: > > > > -----------------8<----------------- > > DAX currently doesn't set errors in the mapping when cache flushing > > fails in dax_writeback_mapping_range(). Since this function can get > > called only from fsync(2) or sync(2), this is actually as good as it can > > currently get since we correctly propagate the error up from > > dax_writeback_mapping_range() to filemap_fdatawrite() > > > > However, in the future better writeback error handling will enable us to > > properly report these errors on fsync(2) even if there are multiple file > > descriptors open against the file or if sync(2) gets called before > > fsync(2). So convert DAX to using standard error reporting through the > > mapping. > > -----------------8<----------------- > > > > For now, only do this when the FS_WB_ERRSEQ flag is set. The > > AS_EIO/AS_ENOSPC flags are not currently cleared in the older code when > > writeback initiation fails, only when we discover an error after waiting > > on writeback to complete, so we only want to do this with errseq_t based > > error handling to prevent seeing duplicate errors on fsync. > > > > Signed-off-by: Jeff Layton <jlayton@redhat.com> > > Reviewed-by: Jan Kara <jack@suse.cz> > > Reviewed-by: Christoph Hellwig <hch@lst.de> > > Reviewed-and-Tested-by: Ross Zwisler <ross.zwisler@linux.intel.com> > > Re-tested this version of the series with some injected DAX errors, and it > looks good. Excellent! Thanks very much for helping test it.
diff --git a/fs/dax.c b/fs/dax.c index c22eaf162f95..42788d8505c7 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -856,8 +856,24 @@ int dax_writeback_mapping_range(struct address_space *mapping, ret = dax_writeback_one(bdev, dax_dev, mapping, indices[i], pvec.pages[i]); - if (ret < 0) + if (ret < 0) { + /* + * For fs' that use errseq_t based error + * tracking, we must call mapping_set_error + * here to ensure that fsync on all open fds + * get back an error. Doing this with the old + * wb error tracking infrastructure is + * problematic though, as DAX writeback is + * synchronous, and the error flags are not + * cleared when initiation fails, only when + * it fails after the write has been submitted + * to the backing store. + */ + if (mapping->host->i_sb->s_type->fs_flags & + FS_WB_ERRSEQ) + mapping_set_error(mapping, ret); goto out; + } } } out: