From patchwork Wed Jan 1 01:20:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314905 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 47991109A for ; Wed, 1 Jan 2020 01:20:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2660820718 for ; Wed, 1 Jan 2020 01:20:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="bwnyDUP9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727156AbgAABUy (ORCPT ); Tue, 31 Dec 2019 20:20:54 -0500 Received: from userp2130.oracle.com ([156.151.31.86]:59332 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgAABUy (ORCPT ); Tue, 31 Dec 2019 20:20:54 -0500 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011FsnO113342; Wed, 1 Jan 2020 01:20:52 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=kTJFFE3aSkyExhoJRN+MDWUYfnizpLgP0vBd4vzFJpM=; b=bwnyDUP9jDok3eWq+t+WQYzSpWQPdft17JDuM3QThahoPqX+aP50Vk0oTC5+XiIPG3jB LGb5AfkQOqvs//uoYWJ+WfAEnntSYZDq2gme7x0PWZbjaWPLmUhJRzjoleFGPLCuoqDr M0ytAiNeOy8AkAsRWQ1YvGtsxyCdJr6INfDnr7EpiFFx0k/j/bxWfm8mW32Zdlw7njF0 GLhR28Zaj3PldxpkDp7e+sxhjO1F+cRKntLk+13BVLbPD6SNCD2G5yKzlcC3YoVZwl8u DDFtO7NOZYDyR8rLBSHwu4uRsVTSCPwt4RApvVbLRmmSGXsmF/HAV2OyO92ctN/gmGdV yA== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by userp2130.oracle.com with ESMTP id 2x5xftk2rx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:20:52 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011I7c2056878; Wed, 1 Jan 2020 01:20:51 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3030.oracle.com with ESMTP id 2x7medfj0q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:20:51 +0000 Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 0011Kpfa030843; Wed, 1 Jan 2020 01:20:51 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:20:50 -0800 Subject: [PATCH 1/6] mkfs: check root inode location From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:20:48 -0800 Message-ID: <157784164821.1371066.13806897497760939622.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Make sure the root inode gets created where repair thinks it should be created. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + mkfs/xfs_mkfs.c | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 99d12c34..b042f0a2 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -173,5 +173,6 @@ #define xfs_dir2_data_bestfree_p libxfs_dir2_data_bestfree_p #define xfs_dir2_data_get_ftype libxfs_dir2_data_get_ftype #define xfs_dir2_data_put_ftype libxfs_dir2_data_put_ftype +#define xfs_ialloc_calc_rootino libxfs_ialloc_calc_rootino #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 784fe6a9..91a25bf5 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3549,6 +3549,38 @@ rewrite_secondary_superblocks( libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } +static void +check_root_ino( + struct xfs_mount *mp) +{ + xfs_ino_t ino; + + if (XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino) != 0) { + fprintf(stderr, + _("%s: root inode created in AG %u, not AG 0\n"), + progname, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino)); + exit(1); + } + + /* + * The superblock points to the root directory inode, but xfs_repair + * expects to find the root inode in a very specific location computed + * from the filesystem geometry for an extra level of verification. + * + * Fail the format immediately if those assumptions ever break, because + * repair will toss the root directory. + */ + ino = libxfs_ialloc_calc_rootino(mp, mp->m_sb.sb_unit); + if (mp->m_sb.sb_rootino != ino) { + fprintf(stderr, + _("%s: root inode (%llu) not allocated in expected location (%llu)\n"), + progname, + (unsigned long long)mp->m_sb.sb_rootino, + (unsigned long long)ino); + exit(1); + } +} + int main( int argc, @@ -3835,12 +3867,7 @@ main( /* * Protect ourselves against possible stupidity */ - if (XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino) != 0) { - fprintf(stderr, - _("%s: root inode created in AG %u, not AG 0\n"), - progname, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino)); - exit(1); - } + check_root_ino(mp); /* * Re-write multiple secondary superblocks with rootinode field set From patchwork Wed Jan 1 01:20:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314907 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E7DD3109A for ; Wed, 1 Jan 2020 01:21:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C71B7206E6 for ; Wed, 1 Jan 2020 01:21:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="SG1eY+nD" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727141AbgAABVB (ORCPT ); Tue, 31 Dec 2019 20:21:01 -0500 Received: from aserp2120.oracle.com ([141.146.126.78]:58076 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgAABVB (ORCPT ); Tue, 31 Dec 2019 20:21:01 -0500 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011EA8p092020; Wed, 1 Jan 2020 01:20:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=GpHvEWcZReaWylEgfeiVILojJZeJJoOInPnYwY6LYPU=; b=SG1eY+nD67p+QOqPH9vZw7E8cTvlHIDJT+l8/c7c3EWnTAjfdCfXk34knmBAzIE82d5X TZcGkMKtofW4tLhOkqNfQoBY/2FtiMMQLrI09xSYmKm47eS4qijMZsYN6+uam7HGrB8/ zCxiS2+UXO4UKeZB6AvXSw2BaooT9QvFyeg3BdAj1JADnD8fcD+BAJk+U5hnZzOHxvk1 jy2zCAEivSA+YdwNHPPHjSdtBMRtuq+lzS2ddNuIQ5x1hXsIKtLYn3ravPmEuT+c5kAL 9e5UxLwVrQRH3c5OAVk14XhepnyqWafeL+OsqDdmiE0gqgyuQ8Y7Y/M7aMPRLzTfuHAs 5g== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by aserp2120.oracle.com with ESMTP id 2x5y0pjy6s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:20:58 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011J7Fe184942; Wed, 1 Jan 2020 01:20:58 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userp3030.oracle.com with ESMTP id 2x8gj91d50-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:20:58 +0000 Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 0011Kv7M030871; Wed, 1 Jan 2020 01:20:57 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:20:57 -0800 Subject: [PATCH 2/6] xfs_repair: enforce that inode btree chunks can't point to AG headers From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:20:54 -0800 Message-ID: <157784165438.1371066.4301130203678483556.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong xfs_repair has a very old check that evidently excuses the AG 0 inode btrees pointing to blocks that are already marked XR_E_INUSE_FS* (e.g. AG headers). mkfs never formats filesystems that way and it looks like an error, so purge the check. After this, we always complain if inodes overlap with AG headers because that should never happen. Signed-off-by: Darrick J. Wong --- repair/globals.c | 1 - repair/globals.h | 1 - repair/scan.c | 19 ------------------- repair/xfs_repair.c | 7 ------- 4 files changed, 28 deletions(-) diff --git a/repair/globals.c b/repair/globals.c index dcd79ea4..8a60e706 100644 --- a/repair/globals.c +++ b/repair/globals.c @@ -73,7 +73,6 @@ int lost_gquotino; int lost_pquotino; xfs_agino_t first_prealloc_ino; -xfs_agino_t last_prealloc_ino; xfs_agblock_t bnobt_root; xfs_agblock_t bcntbt_root; xfs_agblock_t inobt_root; diff --git a/repair/globals.h b/repair/globals.h index 008bdd90..2ed5c894 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -114,7 +114,6 @@ extern int lost_gquotino; extern int lost_pquotino; extern xfs_agino_t first_prealloc_ino; -extern xfs_agino_t last_prealloc_ino; extern xfs_agblock_t bnobt_root; extern xfs_agblock_t bcntbt_root; extern xfs_agblock_t inobt_root; diff --git a/repair/scan.c b/repair/scan.c index c383f3aa..05707dd2 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1645,13 +1645,6 @@ scan_single_ino_chunk( break; case XR_E_INUSE_FS: case XR_E_INUSE_FS1: - if (agno == 0 && - ino + j >= first_prealloc_ino && - ino + j < last_prealloc_ino) { - set_bmap(agno, agbno, XR_E_INO); - break; - } - /* fall through */ default: /* XXX - maybe should mark block a duplicate */ do_warn( @@ -1782,18 +1775,6 @@ _("inode chunk claims untracked block, finobt block - agno %d, bno %d, inopb %d\ break; case XR_E_INUSE_FS: case XR_E_INUSE_FS1: - if (agno == 0 && - ino + j >= first_prealloc_ino && - ino + j < last_prealloc_ino) { - do_warn( -_("inode chunk claims untracked block, finobt block - agno %d, bno %d, inopb %d\n"), - agno, agbno, mp->m_sb.sb_inopblock); - - set_bmap(agno, agbno, XR_E_INO); - suspect++; - break; - } - /* fall through */ default: do_warn( _("inode chunk claims used block, finobt block - agno %d, bno %d, inopb %d\n"), diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 9295673d..3e9059f3 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -460,13 +460,6 @@ calc_mkfs(xfs_mount_t *mp) first_prealloc_ino = XFS_AGB_TO_AGINO(mp, fino_bno); } - ASSERT(M_IGEO(mp)->ialloc_blks > 0); - - if (M_IGEO(mp)->ialloc_blks > 1) - last_prealloc_ino = first_prealloc_ino + XFS_INODES_PER_CHUNK; - else - last_prealloc_ino = XFS_AGB_TO_AGINO(mp, fino_bno + 1); - /* * now the first 3 inodes in the system */ From patchwork Wed Jan 1 01:21:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314909 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 201281395 for ; Wed, 1 Jan 2020 01:21:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F316D206E6 for ; Wed, 1 Jan 2020 01:21:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="B8vj4XQc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727158AbgAABVH (ORCPT ); Tue, 31 Dec 2019 20:21:07 -0500 Received: from userp2120.oracle.com ([156.151.31.85]:55002 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgAABVH (ORCPT ); Tue, 31 Dec 2019 20:21:07 -0500 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011F3ZX094678; Wed, 1 Jan 2020 01:21:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=20d1TRDNni/vKObZLnWSe7pAkwlMgXONdCRh39zXf7k=; b=B8vj4XQcSkpAS6IqoeKekHscL/dMuibw7xxDFV/CkB1jjqyrET9bTWJjN2bqL2ZmD1hX U0vCTjytJ2hPY3lIOOemHtAyR/vFIiqdrkatu4gnL/144FIJmIQ8F7j+2/PgI11FamSM nnLVb1vICI2OIhCLVEdn81tNR8413jZkw4F8WkoWpYq/rpLrAG/mk5gXyYackjHSzg1j KMICL+GUDqcA3cBt5x19nxHtQzHJGzYfSOJtKWt9JKzN8pFgxXuRIuJgkjzFQMwK9YKv mgDeRtErp2iYonDkZDvVgCqGdqp5Xy0th3iIxVP3ga/G4iX4wQlO0WcVA2N/qOC5kuqH fg== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by userp2120.oracle.com with ESMTP id 2x5ypqjwr6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:04 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011J75Q184935; Wed, 1 Jan 2020 01:21:04 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userp3030.oracle.com with ESMTP id 2x8gj91d7p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:04 +0000 Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 0011L3cP016209; Wed, 1 Jan 2020 01:21:03 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:21:03 -0800 Subject: [PATCH 3/6] xfs_repair: refactor fixed inode location checks From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:21:00 -0800 Message-ID: <157784166059.1371066.17997388293658262497.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Refactor the checking and resetting of fixed-location inodes (root, rbmino, rsumino) into a helper function. Signed-off-by: Darrick J. Wong --- repair/xfs_repair.c | 106 ++++++++++++++++++--------------------------------- 1 file changed, 37 insertions(+), 69 deletions(-) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 3e9059f3..94673750 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -395,6 +395,37 @@ do_log(char const *msg, ...) va_end(args); } +/* Make sure a fixed-location inode is where it should be. */ +static void +ensure_fixed_ino( + xfs_ino_t *ino, + xfs_ino_t expected_ino, + const char *tag) +{ + if (*ino == expected_ino) + return; + + do_warn( +_("sb %s inode value %" PRIu64 " %sinconsistent with calculated value %"PRIu64"\n"), + tag, *ino, *ino == NULLFSINO ? "(NULLFSINO) " : "", + expected_ino); + + if (!no_modify) + do_warn( +_("resetting superblock %s inode pointer to %"PRIu64"\n"), + tag, expected_ino); + else + do_warn( +_("would reset superblock %s inode pointer to %"PRIu64"\n"), + tag, expected_ino); + + /* + * Just set the value -- safe since the superblock doesn't get flushed + * out if no_modify is set. + */ + *ino = expected_ino; +} + static void calc_mkfs(xfs_mount_t *mp) { @@ -463,75 +494,12 @@ calc_mkfs(xfs_mount_t *mp) /* * now the first 3 inodes in the system */ - if (mp->m_sb.sb_rootino != first_prealloc_ino) { - do_warn( -_("sb root inode value %" PRIu64 " %sinconsistent with calculated value %u\n"), - mp->m_sb.sb_rootino, - (mp->m_sb.sb_rootino == NULLFSINO ? "(NULLFSINO) ":""), - first_prealloc_ino); - - if (!no_modify) - do_warn( - _("resetting superblock root inode pointer to %u\n"), - first_prealloc_ino); - else - do_warn( - _("would reset superblock root inode pointer to %u\n"), - first_prealloc_ino); - - /* - * just set the value -- safe since the superblock - * doesn't get flushed out if no_modify is set - */ - mp->m_sb.sb_rootino = first_prealloc_ino; - } - - if (mp->m_sb.sb_rbmino != first_prealloc_ino + 1) { - do_warn( -_("sb realtime bitmap inode %" PRIu64 " %sinconsistent with calculated value %u\n"), - mp->m_sb.sb_rbmino, - (mp->m_sb.sb_rbmino == NULLFSINO ? "(NULLFSINO) ":""), - first_prealloc_ino + 1); - - if (!no_modify) - do_warn( - _("resetting superblock realtime bitmap ino pointer to %u\n"), - first_prealloc_ino + 1); - else - do_warn( - _("would reset superblock realtime bitmap ino pointer to %u\n"), - first_prealloc_ino + 1); - - /* - * just set the value -- safe since the superblock - * doesn't get flushed out if no_modify is set - */ - mp->m_sb.sb_rbmino = first_prealloc_ino + 1; - } - - if (mp->m_sb.sb_rsumino != first_prealloc_ino + 2) { - do_warn( -_("sb realtime summary inode %" PRIu64 " %sinconsistent with calculated value %u\n"), - mp->m_sb.sb_rsumino, - (mp->m_sb.sb_rsumino == NULLFSINO ? "(NULLFSINO) ":""), - first_prealloc_ino + 2); - - if (!no_modify) - do_warn( - _("resetting superblock realtime summary ino pointer to %u\n"), - first_prealloc_ino + 2); - else - do_warn( - _("would reset superblock realtime summary ino pointer to %u\n"), - first_prealloc_ino + 2); - - /* - * just set the value -- safe since the superblock - * doesn't get flushed out if no_modify is set - */ - mp->m_sb.sb_rsumino = first_prealloc_ino + 2; - } - + ensure_fixed_ino(&mp->m_sb.sb_rootino, first_prealloc_ino, + _("root")); + ensure_fixed_ino(&mp->m_sb.sb_rbmino, first_prealloc_ino + 1, + _("realtime bitmap")); + ensure_fixed_ino(&mp->m_sb.sb_rsumino, first_prealloc_ino + 2, + _("realtime summary")); } /* From patchwork Wed Jan 1 01:21:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314911 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5199F1395 for ; Wed, 1 Jan 2020 01:21:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2FCD2206E4 for ; Wed, 1 Jan 2020 01:21:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="c0fLfpqL" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727159AbgAABVO (ORCPT ); Tue, 31 Dec 2019 20:21:14 -0500 Received: from userp2130.oracle.com ([156.151.31.86]:59558 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgAABVO (ORCPT ); Tue, 31 Dec 2019 20:21:14 -0500 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011LCet116223; Wed, 1 Jan 2020 01:21:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=DfLzYe+ZJg79fUZjeJz8m53/FM9GM9N88IGyETV2wrM=; b=c0fLfpqL5oVrNoJlPPlM/bpQ/tCG3/8p4prt3mLn2kFVHktyugdU8XTVDCHpXsKxNv1s DQssGTPa8jpFa1cdfJpcQ0+GGO4l/urgbUjYKzq+l9Qzo8tbbasVgyTy7C/H12vUIkKj det4SjgHkm6p4m/+tohBC/jdrFsAhLJn/OPwpONeUoNrO6NPQ52eDqvoI219q8MjyKvl gNAo4Vrhht+FBJ6s7RkeWtNlIuXmtZ9oRh4CGGLSqIckBD8Z8fthuaRX5Y7+CMRXNJhw eMFPdF3fHbQfQOWWRByCtWRqlzAxtq5k/YTeWWZtUEBzIAuZdiwTmz6Wsj7FAAGgwn2W KA== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by userp2130.oracle.com with ESMTP id 2x5xftk2s9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:12 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011ISK7057588; Wed, 1 Jan 2020 01:21:11 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserp3030.oracle.com with ESMTP id 2x7medfj99-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:11 +0000 Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 0011L9Hx003529; Wed, 1 Jan 2020 01:21:10 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:21:09 -0800 Subject: [PATCH 4/6] xfs_repair: use libxfs function to calculate root inode location From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:21:07 -0800 Message-ID: <157784166699.1371066.10740013955020361949.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Use libxfs_ialloc_calc_rootino to compute the location of the root inode, and improve the function comments while we're at it. Signed-off-by: Darrick J. Wong --- repair/globals.c | 5 --- repair/globals.h | 5 --- repair/xfs_repair.c | 78 +++++++-------------------------------------------- 3 files changed, 11 insertions(+), 77 deletions(-) diff --git a/repair/globals.c b/repair/globals.c index 8a60e706..299bacd1 100644 --- a/repair/globals.c +++ b/repair/globals.c @@ -72,11 +72,6 @@ int lost_uquotino; int lost_gquotino; int lost_pquotino; -xfs_agino_t first_prealloc_ino; -xfs_agblock_t bnobt_root; -xfs_agblock_t bcntbt_root; -xfs_agblock_t inobt_root; - /* configuration vars -- fs geometry dependent */ int inodes_per_block; diff --git a/repair/globals.h b/repair/globals.h index 2ed5c894..953e3dfb 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -113,11 +113,6 @@ extern int lost_uquotino; extern int lost_gquotino; extern int lost_pquotino; -extern xfs_agino_t first_prealloc_ino; -extern xfs_agblock_t bnobt_root; -extern xfs_agblock_t bcntbt_root; -extern xfs_agblock_t inobt_root; - /* configuration vars -- fs geometry dependent */ extern int inodes_per_block; diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 94673750..53b04dae 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -426,79 +426,23 @@ _("would reset superblock %s inode pointer to %"PRIu64"\n"), *ino = expected_ino; } +/* + * Make sure that the first 3 inodes in the filesystem are the root directory, + * the realtime bitmap, and the realtime summary, in that order. + */ static void -calc_mkfs(xfs_mount_t *mp) +calc_mkfs( + struct xfs_mount *mp) { - xfs_agblock_t fino_bno; - int do_inoalign; - - do_inoalign = M_IGEO(mp)->ialloc_align; - - /* - * Pre-calculate the geometry of ag 0. We know what it looks like - * because we know what mkfs does: 2 allocation btree roots (by block - * and by size), the inode allocation btree root, the free inode - * allocation btree root (if enabled) and some number of blocks to - * prefill the agfl. - * - * Because the current shape of the btrees may differ from the current - * shape, we open code the mkfs freelist block count here. mkfs creates - * single level trees, so the calculation is pertty straight forward for - * the trees that use the AGFL. - */ - bnobt_root = howmany(4 * mp->m_sb.sb_sectsize, mp->m_sb.sb_blocksize); - bcntbt_root = bnobt_root + 1; - inobt_root = bnobt_root + 2; - fino_bno = inobt_root + (2 * min(2, mp->m_ag_maxlevels)) + 1; - if (xfs_sb_version_hasfinobt(&mp->m_sb)) - fino_bno++; - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { - fino_bno += min(2, mp->m_rmap_maxlevels); /* agfl blocks */ - fino_bno++; - } - if (xfs_sb_version_hasreflink(&mp->m_sb)) - fino_bno++; + xfs_ino_t rootino; - /* - * If the log is allocated in the first allocation group we need to - * add the number of blocks used by the log to the above calculation. - * - * This can happens with filesystems that only have a single - * allocation group, or very odd geometries created by old mkfs - * versions on very small filesystems. - */ - if (mp->m_sb.sb_logstart && - XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == 0) { + rootino = libxfs_ialloc_calc_rootino(mp, mp->m_sb.sb_unit); - /* - * XXX(hch): verify that sb_logstart makes sense? - */ - fino_bno += mp->m_sb.sb_logblocks; - } - - /* - * ditto the location of the first inode chunks in the fs ('/') - */ - if (xfs_sb_version_hasdalign(&mp->m_sb) && do_inoalign) { - first_prealloc_ino = XFS_AGB_TO_AGINO(mp, roundup(fino_bno, - mp->m_sb.sb_unit)); - } else if (xfs_sb_version_hasalign(&mp->m_sb) && - mp->m_sb.sb_inoalignmt > 1) { - first_prealloc_ino = XFS_AGB_TO_AGINO(mp, - roundup(fino_bno, - mp->m_sb.sb_inoalignmt)); - } else { - first_prealloc_ino = XFS_AGB_TO_AGINO(mp, fino_bno); - } - - /* - * now the first 3 inodes in the system - */ - ensure_fixed_ino(&mp->m_sb.sb_rootino, first_prealloc_ino, + ensure_fixed_ino(&mp->m_sb.sb_rootino, rootino, _("root")); - ensure_fixed_ino(&mp->m_sb.sb_rbmino, first_prealloc_ino + 1, + ensure_fixed_ino(&mp->m_sb.sb_rbmino, rootino + 1, _("realtime bitmap")); - ensure_fixed_ino(&mp->m_sb.sb_rsumino, first_prealloc_ino + 2, + ensure_fixed_ino(&mp->m_sb.sb_rsumino, rootino + 2, _("realtime summary")); } From patchwork Wed Jan 1 01:21:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314913 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6218B109A for ; Wed, 1 Jan 2020 01:21:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 404F820718 for ; Wed, 1 Jan 2020 01:21:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="KSt6srql" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727163AbgAABVT (ORCPT ); Tue, 31 Dec 2019 20:21:19 -0500 Received: from userp2130.oracle.com ([156.151.31.86]:59598 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgAABVT (ORCPT ); Tue, 31 Dec 2019 20:21:19 -0500 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011KR0u115860; Wed, 1 Jan 2020 01:21:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=EU1fv0NHuGomy0PkH+Ql1ABZvYEyeIguXxoao66n240=; b=KSt6srql2MR70zaI5D0seLJljr4NMUy3KbAEMjR/z6hiKj0oGxVwYwEJh5QpQe9h3D4X 59f6DFq7tTCB4ZB2wkip/3jYhzxj54/qarIWNRlMaIFri7QDXonNSDwf1Cfg1FIj3p8I /ONof3fWVHV738+RDgWb+zgqH0AllN0j+dvmkFGoateSBgA4keRG6LfUXQy3SKJ9lpGJ BMUkO0ppmdZb6nmen8EqDc9hI+hrXwNMhN/uG0h2ZHn5J5+4JO2xl0X+3GLk1ZgtI+Xr wnvisO0OkacaV72Ho42mQVxxFZ/mCVXeqnPYT29z0/xc9L76O7VGm4HDtUk9MPDtHNHA AA== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by userp2130.oracle.com with ESMTP id 2x5xftk2sa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:17 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011JCtj007175; Wed, 1 Jan 2020 01:21:16 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3020.oracle.com with ESMTP id 2x8bsrg7a3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:16 +0000 Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 0011LGNv003538; Wed, 1 Jan 2020 01:21:16 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:21:15 -0800 Subject: [PATCH 5/6] xfs_repair: check plausibility of root dir pointer before trashing it From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:21:13 -0800 Message-ID: <157784167320.1371066.16235730726128503766.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong If sb_rootino doesn't point to where we think mkfs should have allocated the root directory, check to see if the alleged root directory actually looks like a root directory. If so, we'll let it live because someone could have changed sunit since formatting time, and that changes the root directory inode estimate. Signed-off-by: Darrick J. Wong --- repair/xfs_repair.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 53b04dae..372616c4 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -426,6 +426,37 @@ _("would reset superblock %s inode pointer to %"PRIu64"\n"), *ino = expected_ino; } +/* Does the root directory inode look like a plausible root directory? */ +static bool +has_plausible_rootdir( + struct xfs_mount *mp) +{ + struct xfs_inode *ip; + xfs_ino_t ino; + int error; + bool ret = false; + + error = -libxfs_iget(mp, NULL, mp->m_sb.sb_rootino, 0, &ip, + &xfs_default_ifork_ops); + if (error) + goto out; + if (!S_ISDIR(VFS_I(ip)->i_mode)) + goto out_rele; + + error = -libxfs_dir_lookup(NULL, ip, &xfs_name_dotdot, &ino, NULL); + if (error) + goto out_rele; + + /* The root directory '..' entry points to the directory. */ + if (ino == mp->m_sb.sb_rootino) + ret = true; + +out_rele: + libxfs_irele(ip); +out: + return ret; +} + /* * Make sure that the first 3 inodes in the filesystem are the root directory, * the realtime bitmap, and the realtime summary, in that order. @@ -438,6 +469,20 @@ calc_mkfs( rootino = libxfs_ialloc_calc_rootino(mp, mp->m_sb.sb_unit); + /* + * If the root inode isn't where we think it is, check its plausibility + * as a root directory. It's possible that somebody changed sunit + * since the filesystem was created, which can change the value of the + * above computation. Don't blow up the root directory if this is the + * case. + */ + if (mp->m_sb.sb_rootino != rootino && has_plausible_rootdir(mp)) { + do_warn( +_("sb root inode value %" PRIu64 " inconsistent with alignment (expected %"PRIu64")\n"), + mp->m_sb.sb_rootino, rootino); + rootino = mp->m_sb.sb_rootino; + } + ensure_fixed_ino(&mp->m_sb.sb_rootino, rootino, _("root")); ensure_fixed_ino(&mp->m_sb.sb_rbmino, rootino + 1, From patchwork Wed Jan 1 01:21:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11314941 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 706DC1395 for ; Wed, 1 Jan 2020 01:23:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4EF0E20718 for ; Wed, 1 Jan 2020 01:23:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="DQWhXto+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727170AbgAABXZ (ORCPT ); Tue, 31 Dec 2019 20:23:25 -0500 Received: from aserp2120.oracle.com ([141.146.126.78]:59288 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727168AbgAABXZ (ORCPT ); Tue, 31 Dec 2019 20:23:25 -0500 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011FLel092752; Wed, 1 Jan 2020 01:23:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=4cpnlmIpe1CT5Yevfgonv1nvJf8XTtGinPzq4gj4Rtg=; b=DQWhXto+XJkw0SoZUYvA0fFjHKjBX/KymSXTlUevV114suneJAOjBck9FjjLG4SR2NW3 WfBeRi1+1bK/6p/gpNQfaIiSvx3lyZPZFCVJjMgLOgU4+GusDPkw3ixZexXoimdpEwyT 1s35C561VnqmTlHj+nnW4uDUzv6/dq9bhNlvSW3ythzpZYmYCjKRcDSHxWdiLEyrCuVz 9Qw73styxpoWCfdHAFceCpEr+aMWrNAKP2o2GYzP9Qj7rr07ccm9FgXttyjTuPn/JPgW 7aZ6IEGqYlG73Pvqhc9LfS7AhoM9oLJXvhWVsDtooi05XhOYaKFECS4QfQewFd6RkE5h 2g== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 2x5y0pjy8c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:23:23 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id 0011I7XZ056854; Wed, 1 Jan 2020 01:21:23 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3030.oracle.com with ESMTP id 2x7medfjew-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 01 Jan 2020 01:21:22 +0000 Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 0011LMfE031247; Wed, 1 Jan 2020 01:21:22 GMT Received: from localhost (/10.159.150.156) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 31 Dec 2019 17:21:22 -0800 Subject: [PATCH 6/6] xfs_repair: try to correct sb_unit value from secondaries From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, alex@zadara.com Date: Tue, 31 Dec 2019 17:21:19 -0800 Message-ID: <157784167941.1371066.4768907637646125510.stgit@magnolia> In-Reply-To: <157784164200.1371066.15490825981810186191.stgit@magnolia> References: <157784164200.1371066.15490825981810186191.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9487 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1911140001 definitions=main-2001010010 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong If the primary superblock's sb_unit leads to a rootino calculation that doesn't match sb_rootino /but/ we can find a secondary superblock whose sb_unit does match, fix the primary. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 2 + repair/xfs_repair.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index b042f0a2..355f99a2 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -175,4 +175,6 @@ #define xfs_dir2_data_put_ftype libxfs_dir2_data_put_ftype #define xfs_ialloc_calc_rootino libxfs_ialloc_calc_rootino +#define xfs_sb_read_secondary libxfs_sb_read_secondary + #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 372616c4..66e2c335 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -457,6 +457,84 @@ has_plausible_rootdir( return ret; } +/* + * If any of the secondary SBs contain a *correct* value for sunit, write that + * back to the primary superblock. + */ +static void +guess_correct_sunit( + struct xfs_mount *mp) +{ + struct xfs_sb sb; + struct xfs_buf *bp; + xfs_ino_t calc_rootino = NULLFSINO; + xfs_agnumber_t agno; + unsigned int new_sunit; + unsigned int sunit_guess; + int error; + + /* Try reading secondary supers to see if we find a good sb_unit. */ + for (agno = 1; agno < mp->m_sb.sb_agcount; agno++) { + error = -libxfs_sb_read_secondary(mp, NULL, agno, &bp); + if (error) + continue; + libxfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + libxfs_putbuf(bp); + + calc_rootino = libxfs_ialloc_calc_rootino(mp, sb.sb_unit); + if (calc_rootino == mp->m_sb.sb_rootino) + break; + } + + /* If we found a reasonable value, log where we found it. */ + if (calc_rootino == mp->m_sb.sb_rootino) { + do_warn(_("AG %u superblock contains plausible sb_unit value\n"), + agno); + new_sunit = sb.sb_unit; + goto fix; + } + + /* Try successive powers of two. */ + for (sunit_guess = 1; + sunit_guess <= XFS_AG_MAX_BLOCKS(mp->m_sb.sb_blocklog); + sunit_guess *= 2) { + calc_rootino = libxfs_ialloc_calc_rootino(mp, sunit_guess); + if (calc_rootino == mp->m_sb.sb_rootino) + break; + } + + /* If we found a reasonable value, log where we found it. */ + if (calc_rootino == mp->m_sb.sb_rootino) { + do_warn(_("Found an sb_unit value that looks plausible\n")); + new_sunit = sunit_guess; + goto fix; + } + + do_warn(_("Could not estimate a plausible sb_unit value\n")); + return; + +fix: + if (!no_modify) + do_warn(_("Resetting sb_unit to %u\n"), new_sunit); + else + do_warn(_("Would reset sb_unit to %u\n"), new_sunit); + + /* + * Just set the value -- safe since the superblock doesn't get flushed + * out if no_modify is set. + */ + mp->m_sb.sb_unit = new_sunit; + + /* Make sure that swidth is still a multiple of sunit. */ + if (mp->m_sb.sb_width % mp->m_sb.sb_unit == 0) + return; + + if (!no_modify) + do_warn(_("Resetting sb_width to %u\n"), new_sunit); + else + do_warn(_("Would reset sb_width to %u\n"), new_sunit); +} + /* * Make sure that the first 3 inodes in the filesystem are the root directory, * the realtime bitmap, and the realtime summary, in that order. @@ -480,6 +558,7 @@ calc_mkfs( do_warn( _("sb root inode value %" PRIu64 " inconsistent with alignment (expected %"PRIu64")\n"), mp->m_sb.sb_rootino, rootino); + guess_correct_sunit(mp); rootino = mp->m_sb.sb_rootino; }