From patchwork Wed May 31 12:45:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 769092 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wd9Gm5WkQz9s2Q for ; Wed, 31 May 2017 22:47:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751075AbdEaMqo (ORCPT ); Wed, 31 May 2017 08:46:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54948 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751440AbdEaMqI (ORCPT ); Wed, 31 May 2017 08:46:08 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B950B64467; Wed, 31 May 2017 12:46:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B950B64467 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jlayton@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com B950B64467 Received: from tleilax.poochiereds.net (ovpn-120-5.rdu2.redhat.com [10.10.120.5]) by smtp.corp.redhat.com (Postfix) with ESMTP id 81C9A80E64; Wed, 31 May 2017 12:46:01 +0000 (UTC) From: Jeff Layton To: Andrew Morton , Al Viro , Jan Kara , tytso@mit.edu, axboe@kernel.dk, mawilcox@microsoft.com, ross.zwisler@linux.intel.com, corbet@lwn.net Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v5 16/17] ext2: convert to errseq_t based writeback error tracking Date: Wed, 31 May 2017 08:45:39 -0400 Message-Id: <20170531124540.8782-17-jlayton@redhat.com> In-Reply-To: <20170531124540.8782-1-jlayton@redhat.com> References: <20170531124540.8782-1-jlayton@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 31 May 2017 12:46:03 +0000 (UTC) Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Set the flag to indicate that we want new-style data writeback error handling. This means that we need to override the open routines for files and directories so that we can sample the bdev wb_err at open. XXX: doesn't quite pass the xfstest for this currently, as ext2_error resets the error on the device inode on every call. Signed-off-by: Jeff Layton --- fs/ext2/dir.c | 8 ++++++++ fs/ext2/file.c | 29 +++++++++++++++++++++++------ fs/ext2/super.c | 2 +- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index e2709695b177..6e476c9929f8 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c @@ -713,6 +713,13 @@ int ext2_empty_dir (struct inode * inode) return 0; } +static int ext2_dir_open(struct inode *inode, struct file *file) +{ + /* Sample blockdev mapping errseq_t for metadata writeback */ + file->f_md_wb_err = filemap_sample_wb_err(inode->i_sb->s_bdev->bd_inode->i_mapping); + return 0; +} + const struct file_operations ext2_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, @@ -721,5 +728,6 @@ const struct file_operations ext2_dir_operations = { #ifdef CONFIG_COMPAT .compat_ioctl = ext2_compat_ioctl, #endif + .open = ext2_dir_open, .fsync = ext2_fsync, }; diff --git a/fs/ext2/file.c b/fs/ext2/file.c index ed00e7ae0ef3..6f3cd7bc3fb3 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -172,16 +172,23 @@ static int ext2_release_file (struct inode * inode, struct file * filp) int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync) { - int ret; + int ret, ret2; struct super_block *sb = file->f_mapping->host->i_sb; struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping; ret = generic_file_fsync(file, start, end, datasync); - if (ret == -EIO) { - /* We don't really know where the IO error happened... */ - ext2_error(sb, __func__, + + ret2 = filemap_report_wb_err(file); + if (ret == 0) + ret = ret2; + + ret2 = filemap_report_md_wb_err(file, mapping); + if (ret2) { + if (ret == 0) + ret = ret2; + if (ret == -EIO) + ext2_error(sb, __func__, "detected IO error when writing metadata buffers"); - ret = -EIO; } return ret; } @@ -204,6 +211,16 @@ static ssize_t ext2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) return generic_file_write_iter(iocb, from); } +static int ext2_file_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = dquot_file_open(inode, file); + if (likely(ret == 0)) + file->f_md_wb_err = filemap_sample_wb_err(inode->i_sb->s_bdev->bd_inode->i_mapping); + return ret; +} + const struct file_operations ext2_file_operations = { .llseek = generic_file_llseek, .read_iter = ext2_file_read_iter, @@ -213,7 +230,7 @@ const struct file_operations ext2_file_operations = { .compat_ioctl = ext2_compat_ioctl, #endif .mmap = ext2_file_mmap, - .open = dquot_file_open, + .open = ext2_file_open, .release = ext2_release_file, .fsync = ext2_fsync, .get_unmapped_area = thp_get_unmapped_area, diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 9c2028b50e5c..dd37d7f955bf 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -1629,7 +1629,7 @@ static struct file_system_type ext2_fs_type = { .name = "ext2", .mount = ext2_mount, .kill_sb = kill_block_super, - .fs_flags = FS_REQUIRES_DEV, + .fs_flags = FS_REQUIRES_DEV|FS_WB_ERRSEQ, }; MODULE_ALIAS_FS("ext2");