From patchwork Tue Oct 25 23:07:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 9485961 X-Mozilla-Keys: nonjunk Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on sandeen.net X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.0 X-Spam-HP: BAYES_00=-1.9,HEADER_FROM_DIFFERENT_DOMAINS=0.001, RP_MATCHES_RCVD=-0.1,UNPARSEABLE_RELAY=0.001 X-Original-To: sandeen@sandeen.net Delivered-To: sandeen@sandeen.net Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by sandeen.net (Postfix) with ESMTP id 675FA33E0 for ; Tue, 25 Oct 2016 18:07:25 -0500 (CDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754103AbcJYXH0 (ORCPT ); Tue, 25 Oct 2016 19:07:26 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:47013 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752173AbcJYXH0 (ORCPT ); Tue, 25 Oct 2016 19:07:26 -0400 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u9PN7Mtl030677 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Oct 2016 23:07:23 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u9PN7MKb008091 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Oct 2016 23:07:22 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u9PN7LG7022682; Tue, 25 Oct 2016 23:07:21 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Oct 2016 16:07:21 -0700 Subject: [PATCH 35/39] xfs_repair: check the CoW extent size hint From: "Darrick J. Wong" To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org Date: Tue, 25 Oct 2016 16:07:20 -0700 Message-ID: <147743684072.11035.2798529745917001253.stgit@birch.djwong.org> In-Reply-To: <147743661772.11035.560864407573832590.stgit@birch.djwong.org> References: <147743661772.11035.560864407573832590.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: aserv0021.oracle.com [141.146.126.233] Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Signed-off-by: Darrick J. Wong --- repair/dinode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/repair/dinode.c b/repair/dinode.c index 64fc983..11b60ce 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2531,6 +2531,38 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), goto clear_bad_out; } + if ((flags2 & XFS_DIFLAG2_COWEXTSIZE) && + !xfs_sb_version_hasreflink(&mp->m_sb)) { + if (!uncertain) { + do_warn( + _("inode %" PRIu64 " has CoW extent size hint but file system does not support reflink\n"), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + + if (flags2 & XFS_DIFLAG2_COWEXTSIZE) { + /* must be a directory or file */ + if (di_mode && !S_ISDIR(di_mode) && !S_ISREG(di_mode)) { + if (!uncertain) { + do_warn( + _("CoW extent size flag set on non-file, non-directory inode %" PRIu64 "\n" ), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + } + + if ((flags2 & XFS_DIFLAG2_COWEXTSIZE) && + (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT))) { + if (!uncertain) { + do_warn( + _("Cannot have CoW extent size hint on a realtime inode %" PRIu64 "\n"), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + if (!verify_mode && flags2 != be64_to_cpu(dino->di_flags2)) { if (!no_modify) { do_warn(_("fixing bad flags2.\n")); @@ -2624,6 +2656,29 @@ _("bad non-zero extent size %u for non-realtime/extsize inode %" PRIu64 ", "), } /* + * Only (regular files and directories) with COWEXTSIZE flags + * set can have extsize set. + */ + if (dino->di_version >= 3 && + be32_to_cpu(dino->di_cowextsize) != 0) { + if ((type == XR_INO_DIR || type == XR_INO_DATA) && + (be64_to_cpu(dino->di_flags2) & + XFS_DIFLAG2_COWEXTSIZE)) { + /* s'okay */ ; + } else { + do_warn( +_("Cannot have non-zero CoW extent size %u on non-cowextsize inode %" PRIu64 ", "), + be32_to_cpu(dino->di_cowextsize), lino); + if (!no_modify) { + do_warn(_("resetting to zero\n")); + dino->di_cowextsize = 0; + *dirty = 1; + } else + do_warn(_("would reset to zero\n")); + } + } + + /* * general size/consistency checks: */ if (process_check_inode_sizes(mp, dino, lino, type) != 0)