From nobody Fri Sep 12 00:30:57 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3C04C636CC for ; Wed, 15 Feb 2023 13:40:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229786AbjBONkt (ORCPT ); Wed, 15 Feb 2023 08:40:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229552AbjBONkq (ORCPT ); Wed, 15 Feb 2023 08:40:46 -0500 Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC5E239BA7; Wed, 15 Feb 2023 05:40:32 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id A6769214E; Wed, 15 Feb 2023 13:36:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1676468180; bh=usEtSMeyYHIotqRXwOxKAue/XOIiNzAb2X5xWL5CEHs=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=EvLNcaibd1xUrg3e27fMIGoIUwE91WtIo38z+Jbkhq3ssj459GNS2nJUK2LRr6bQt 1BxZKj09/ACU3rLC74LodHWsNLyxi+MBA4pAM0/ue8IrvSjOjvs924IC0kQupzPpO2 OWDcVyQ3GKstUv6Gi/ppbtZd4CV/9zymLxEqQQPA= Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayfre-01.paragon-software.com (Postfix) with ESMTPS id 0CEA31E70; Wed, 15 Feb 2023 13:40:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1676468431; bh=usEtSMeyYHIotqRXwOxKAue/XOIiNzAb2X5xWL5CEHs=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=iShuC2vNW9lGaviqam1oMitCEJxghHzmEpT82bYltbqSz2yEBgdo4Ugb1ycGkGcE1 vUtp925KMDlb8D3ZSMhOmCjBfOFqwiBMNhqI5bFqvG7Zo3x8uF2BK9JpQzFFu6QESl CZZAuzILkXtwCXlMNESk9tj1CKqJU5Da/hspyoNQ= Received: from [192.168.211.36] (192.168.211.36) by vdlg-exch-02.paragon-software.com (172.30.1.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.7; Wed, 15 Feb 2023 16:40:30 +0300 Message-ID: <48ebd481-dc1f-66fc-6888-5e82fd14af6e@paragon-software.com> Date: Wed, 15 Feb 2023 17:40:29 +0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 Subject: [PATCH 11/11] fs/ntfs3: Print details about mount fails Content-Language: en-US From: Konstantin Komarov To: CC: Linux Kernel Mailing List , References: In-Reply-To: Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [192.168.211.36] X-ClientProxiedBy: vdlg-exch-02.paragon-software.com (172.30.1.105) To vdlg-exch-02.paragon-software.com (172.30.1.105) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Added error mesages with error codes. Minor refactoring and code formatting. Signed-off-by: Konstantin Komarov --- =C2=A0fs/ntfs3/frecord.c |=C2=A0=C2=A0 2 +- =C2=A0fs/ntfs3/fsntfs.c=C2=A0 |=C2=A0 40 +++++------ =C2=A0fs/ntfs3/super.c=C2=A0=C2=A0 | 172 +++++++++++++++++++++++++++------= ------------ =C2=A03 files changed, 122 insertions(+), 92 deletions(-) diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c index 481219f2a7cf..2bfcf1a989c9 100644 --- a/fs/ntfs3/frecord.c +++ b/fs/ntfs3/frecord.c @@ -3360,7 +3360,7 @@ int ni_write_inode(struct inode *inode, int sync,=20 const char *hint) =C2=A0=C2=A0=C2=A0=C2=A0 ni_unlock(ni); =C2=A0=C2=A0=C2=A0=C2=A0 if (err) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "%s r=3D%lx failed, %d.= ", hint, inode->i_ino, err); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_inode_err(inode, "%s failed, %d= .", hint, err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_set_state(sbi, NTFS_DIRTY= _ERROR); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return err; =C2=A0=C2=A0=C2=A0=C2=A0 } diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c index 0a82b1bf3ec2..28cc421102e5 100644 --- a/fs/ntfs3/fsntfs.c +++ b/fs/ntfs3/fsntfs.c @@ -223,7 +223,7 @@ int ntfs_extend_init(struct ntfs_sb_info *sbi) =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_EXTEND); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Extend= ."); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Extend= (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 inode =3D NULL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -282,7 +282,7 @@ int ntfs_loadlog_and_replay(struct ntfs_inode *ni,=20 struct ntfs_sb_info *sbi) =C2=A0=C2=A0=C2=A0=C2=A0 /* Check for 4GB. */ =C2=A0=C2=A0=C2=A0=C2=A0 if (ni->vfs_inode.i_size >=3D 0x100000000ull) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "\x24LogFile is too big= "); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "\x24LogFile is large t= han 4G."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1863,7 +1863,7 @@ int ntfs_security_init(struct ntfs_sb_info *sbi) =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_SECURE); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Secure= ."); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Secure= (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 inode =3D NULL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1874,45 +1874,43 @@ int ntfs_security_init(struct ntfs_sb_info *sbi) =C2=A0=C2=A0=C2=A0=C2=A0 attr =3D ni_find_attr(ni, NULL, &le, ATTR_ROOT, S= DH_NAME, =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 ARRAY_SIZE(SDH_NAME), NULL, NULL); -=C2=A0=C2=A0=C2=A0 if (!attr) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; -=C2=A0=C2=A0=C2=A0 } - -=C2=A0=C2=A0=C2=A0 if(!(root_sdh =3D resident_data_ex(attr, sizeof(struct = INDEX_ROOT))) || +=C2=A0=C2=A0=C2=A0 if (!attr || +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 !(root_sdh =3D resident_data_ex(attr= , sizeof(struct INDEX_ROOT))) || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 root_sdh->type !=3D ATTR_ZERO = || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 root_sdh->rule !=3D NTFS_COLLA= TION_TYPE_SECURITY_HASH || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 offsetof(struct INDEX_ROOT, ih= dr) + -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(root_= sdh->ihdr.used) > -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(attr-= >res.data_size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 le32_to_cpu(root_sdh->ihdr.used) > +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(attr-= >res.data_size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$Secure::$SDH is corru= pted."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 err =3D indx_init(indx_sdh, sbi, attr, INDEX_MUTE= X_SDH); -=C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to initialize $= Secure::$SDH (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 attr =3D ni_find_attr(ni, attr, &le, ATTR_ROOT, S= II_NAME, =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 ARRAY_SIZE(SII_NAME), NULL, NULL); -=C2=A0=C2=A0=C2=A0 if (!attr) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; -=C2=A0=C2=A0=C2=A0 } - -=C2=A0=C2=A0=C2=A0 if(!(root_sii =3D resident_data_ex(attr, sizeof(struct = INDEX_ROOT))) || +=C2=A0=C2=A0=C2=A0 if (!attr || +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 !(root_sii =3D resident_data_ex(attr= , sizeof(struct INDEX_ROOT))) || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 root_sii->type !=3D ATTR_ZERO = || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 root_sii->rule !=3D NTFS_COLLA= TION_TYPE_UINT || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 offsetof(struct INDEX_ROOT, ih= dr) + -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(root_= sii->ihdr.used) > -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(attr-= >res.data_size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 le32_to_cpu(root_sii->ihdr.used) > +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 le32_to_cpu(attr-= >res.data_size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$Secure::$SII is corru= pted."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 err =3D indx_init(indx_sii, sbi, attr, INDEX_MUTE= X_SII); -=C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to initialize $= Secure::$SII (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 fnd_sii =3D fnd_get(); =C2=A0=C2=A0=C2=A0=C2=A0 if (!fnd_sii) { diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 521ce31d67a1..e0f78b306f15 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -734,48 +734,81 @@ static int ntfs_init_from_boot(struct super_block=20 *sb, u32 sector_size, =C2=A0=C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 boot =3D (struct NTFS_BOOT *)bh->b_data; -=C2=A0=C2=A0=C2=A0 if (memcmp(boot->system_id, "NTFS=C2=A0=C2=A0=C2=A0 ", = sizeof("NTFS=C2=A0=C2=A0=C2=A0 ") - 1)) +=C2=A0=C2=A0=C2=A0 if (memcmp(boot->system_id, "NTFS=C2=A0=C2=A0=C2=A0 ", = sizeof("NTFS=C2=A0=C2=A0=C2=A0 ") - 1)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Boot's signature is no= t NTFS."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 /* 0x55AA is not mandaroty. Thanks Maxim Suhanov*/ =C2=A0=C2=A0=C2=A0=C2=A0 /*if (0x55 !=3D boot->boot_magic[0] || 0xAA !=3D = boot->boot_magic[1]) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0*=C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0*/ -=C2=A0=C2=A0=C2=A0 boot_sector_size =3D (u32)boot->bytes_per_sector[1] << = 8; -=C2=A0=C2=A0=C2=A0 if (boot->bytes_per_sector[0] || boot_sector_size < SEC= TOR_SIZE || +=C2=A0=C2=A0=C2=A0 boot_sector_size =3D ((u32)boot->bytes_per_sector[1] <<= 8) | +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0 boot= ->bytes_per_sector[0]; +=C2=A0=C2=A0=C2=A0 if (boot_sector_size < SECTOR_SIZE || =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 !is_power_of_2(boot_sector_siz= e)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Invalid bytes per sect= or %u.", boot_sector_size); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 /* cluster size: 512, 1K, 2K, 4K, ... 2M */ =C2=A0=C2=A0=C2=A0=C2=A0 sct_per_clst =3D true_sectors_per_clst(boot); -=C2=A0=C2=A0=C2=A0 if ((int)sct_per_clst < 0) -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; -=C2=A0=C2=A0=C2=A0 if (!is_power_of_2(sct_per_clst)) +=C2=A0=C2=A0=C2=A0 if ((int)sct_per_clst < 0 || !is_power_of_2(sct_per_cls= t)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Invalid sectors per cl= uster %u.", sct_per_clst); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } + +=C2=A0=C2=A0=C2=A0 sbi->cluster_size =3D boot_sector_size * sct_per_clst; +=C2=A0=C2=A0=C2=A0 sbi->cluster_bits =3D cluster_bits =3D blksize_bits(sbi= ->cluster_size); +=C2=A0=C2=A0=C2=A0 sbi->cluster_mask =3D sbi->cluster_size - 1; +=C2=A0=C2=A0=C2=A0 sbi->cluster_mask_inv =3D ~(u64)sbi->cluster_mask; =C2=A0=C2=A0=C2=A0=C2=A0 mlcn =3D le64_to_cpu(boot->mft_clst); =C2=A0=C2=A0=C2=A0=C2=A0 mlcn2 =3D le64_to_cpu(boot->mft2_clst); =C2=A0=C2=A0=C2=A0=C2=A0 sectors =3D le64_to_cpu(boot->sectors_per_volume); -=C2=A0=C2=A0=C2=A0 if (mlcn * sct_per_clst >=3D sectors) +=C2=A0=C2=A0=C2=A0 if (mlcn * sct_per_clst >=3D sectors || mlcn2 * sct_per= _clst >=3D=20 sectors) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err( +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 sb, +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 "Start of MFT 0x%= llx (0x%llx) is out of volume 0x%llx.", +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 mlcn, mlcn2, sect= ors); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 if (mlcn2 * sct_per_clst >=3D sectors) -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 sbi->record_size =3D record_size =3D +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 boot->record_size < 0 ? 1 << (-boot-= >record_size) : +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (u32)boot->record_siz= e << cluster_bits; +=C2=A0=C2=A0=C2=A0 sbi->record_bits =3D blksize_bits(record_size); +=C2=A0=C2=A0=C2=A0 sbi->attr_size_tr =3D (5 * record_size >> 4); // ~320 b= ytes =C2=A0=C2=A0=C2=A0=C2=A0 /* Check MFT record size. */ -=C2=A0=C2=A0=C2=A0 if ((boot->record_size < 0 && -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 SECTOR_SIZE > (2U << (-boot->r= ecord_size))) || -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (boot->record_size >=3D 0 && !is_pow= er_of_2(boot->record_size))) { +=C2=A0=C2=A0=C2=A0 if (record_size < SECTOR_SIZE || !is_power_of_2(record_= size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Invalid bytes per MFT = record %u (%d).", +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0record_size= , boot->record_size); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } + +=C2=A0=C2=A0=C2=A0 if (record_size > MAXIMUM_BYTES_PER_MFT) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Unsupported bytes per = MFT record %u.", +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0record_size= ); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0 sbi->index_size =3D boot->index_size < 0 ? +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 1u << (-boot->index_size) : +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 (u32)boot->index_size << cluster_bits; + =C2=A0=C2=A0=C2=A0=C2=A0 /* Check index record size. */ -=C2=A0=C2=A0=C2=A0 if ((boot->index_size < 0 && -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 SECTOR_SIZE > (2U << (-boot->i= ndex_size))) || -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (boot->index_size >=3D 0 && !is_powe= r_of_2(boot->index_size))) { +=C2=A0=C2=A0=C2=A0 if (sbi->index_size < SECTOR_SIZE || !is_power_of_2(sbi= ->index_size)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Invalid bytes per inde= x %u(%d).", sbi->index_size, +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0boot->index= _size); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } + +=C2=A0=C2=A0=C2=A0 if (sbi->index_size > MAXIMUM_BYTES_PER_INDEX) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Unsupported bytes per = index %u.", +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0sbi->index_= size); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -796,15 +829,15 @@ static int ntfs_init_from_boot(struct super_block=20 *sb, u32 sector_size, =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 dev_size +=3D sector_size - 1; =C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 sbi->cluster_size =3D boot_sector_size * sct_per_clst; -=C2=A0=C2=A0=C2=A0 sbi->cluster_bits =3D blksize_bits(sbi->cluster_size); - =C2=A0=C2=A0=C2=A0=C2=A0 sbi->mft.lbo =3D mlcn << cluster_bits; =C2=A0=C2=A0=C2=A0=C2=A0 sbi->mft.lbo2 =3D mlcn2 << cluster_bits; =C2=A0=C2=A0=C2=A0=C2=A0 /* Compare boot's cluster and sector. */ -=C2=A0=C2=A0=C2=A0 if (sbi->cluster_size < boot_sector_size) +=C2=A0=C2=A0=C2=A0 if (sbi->cluster_size < boot_sector_size) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Invalid bytes per clus= ter (%u).", +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0sbi->cluste= r_size); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 /* Compare boot's cluster and media sector. */ =C2=A0=C2=A0=C2=A0=C2=A0 if (sbi->cluster_size < sector_size) { @@ -816,28 +849,11 @@ static int ntfs_init_from_boot(struct super_block=20 *sb, u32 sector_size, =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 sbi->cluster_mask =3D sbi->cluster_size - 1; -=C2=A0=C2=A0=C2=A0 sbi->cluster_mask_inv =3D ~(u64)sbi->cluster_mask; -=C2=A0=C2=A0=C2=A0 sbi->record_size =3D record_size =3D boot->record_size = < 0 -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0? 1 << (-boot->record_size) -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0: (u32)boot->record_size -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0 <= < sbi->cluster_bits; - -=C2=A0=C2=A0=C2=A0 if (record_size > MAXIMUM_BYTES_PER_MFT || record_size = < SECTOR_SIZE) -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; - -=C2=A0=C2=A0=C2=A0 sbi->record_bits =3D blksize_bits(record_size); -=C2=A0=C2=A0=C2=A0 sbi->attr_size_tr =3D (5 * record_size >> 4); // ~320 b= ytes - =C2=A0=C2=A0=C2=A0=C2=A0 sbi->max_bytes_per_attr =3D =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 record_size - ALIGN(MFTRECORD_= FIXUP_OFFSET_1, 8) - =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ALIGN(((record_size >> SECTOR_= SHIFT) * sizeof(short)), 8) - =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ALIGN(sizeof(enum ATTR_TYPE), = 8); -=C2=A0=C2=A0=C2=A0 sbi->index_size =3D boot->index_size < 0 -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0 ? 1u << (-boot->index_size) -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0 : (u32)boot->index_size << sbi->cluster_bits; - =C2=A0=C2=A0=C2=A0=C2=A0 sbi->volume.ser_num =3D le64_to_cpu(boot->serial_= num); =C2=A0=C2=A0=C2=A0=C2=A0 /* Warning if RAW volume. */ @@ -928,6 +944,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 int err; =C2=A0=C2=A0=C2=A0=C2=A0 struct ntfs_sb_info *sbi =3D sb->s_fs_info; =C2=A0=C2=A0=C2=A0=C2=A0 struct block_device *bdev =3D sb->s_bdev; +=C2=A0=C2=A0=C2=A0 struct ntfs_mount_options *options; =C2=A0=C2=A0=C2=A0=C2=A0 struct inode *inode; =C2=A0=C2=A0=C2=A0=C2=A0 struct ntfs_inode *ni; =C2=A0=C2=A0=C2=A0=C2=A0 size_t i, tt, bad_len, bad_frags; @@ -942,7 +959,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.high =3D 0; =C2=A0=C2=A0=C2=A0=C2=A0 sbi->sb =3D sb; -=C2=A0=C2=A0=C2=A0 sbi->options =3D fc->fs_private; +=C2=A0=C2=A0=C2=A0 sbi->options =3D options =3D fc->fs_private; =C2=A0=C2=A0=C2=A0=C2=A0 fc->fs_private =3D NULL; =C2=A0=C2=A0=C2=A0=C2=A0 sb->s_flags |=3D SB_NODIRATIME; =C2=A0=C2=A0=C2=A0=C2=A0 sb->s_magic =3D 0x7366746e; // "ntfs" @@ -950,12 +967,12 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 sb->s_export_op =3D &ntfs_export_ops; =C2=A0=C2=A0=C2=A0=C2=A0 sb->s_time_gran =3D NTFS_TIME_GRAN; // 100 nsec =C2=A0=C2=A0=C2=A0=C2=A0 sb->s_xattr =3D ntfs_xattr_handlers; -=C2=A0=C2=A0=C2=A0 sb->s_d_op =3D sbi->options->nocase ? &ntfs_dentry_ops = : NULL; +=C2=A0=C2=A0=C2=A0 sb->s_d_op =3D options->nocase ? &ntfs_dentry_ops : NUL= L; -=C2=A0=C2=A0=C2=A0 sbi->options->nls =3D ntfs_load_nls(sbi->options->nls_n= ame); -=C2=A0=C2=A0=C2=A0 if (IS_ERR(sbi->options->nls)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 sbi->options->nls =3D NULL; -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 errorf(fc, "Cannot load nls %s", sbi= ->options->nls_name); +=C2=A0=C2=A0=C2=A0 options->nls =3D ntfs_load_nls(options->nls_name); +=C2=A0=C2=A0=C2=A0 if (IS_ERR(options->nls)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 options->nls =3D NULL; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 errorf(fc, "Cannot load nls %s", opt= ions->nls_name); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -980,8 +997,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_VOL); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_VOLUME); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Volume= ."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Volume= (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1007,13 +1024,9 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 attr =3D ni_find_attr(ni, attr, NULL, ATTR_VOL_IN= FO, NULL, 0, NULL,=20 NULL); -=C2=A0=C2=A0=C2=A0 if (!attr || is_attr_ext(attr)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; -=C2=A0=C2=A0=C2=A0 } - -=C2=A0=C2=A0=C2=A0 info =3D resident_data_ex(attr, SIZEOF_ATTRIBUTE_VOLUME= _INFO); -=C2=A0=C2=A0=C2=A0 if (!info) { +=C2=A0=C2=A0=C2=A0 if (!attr || is_attr_ext(attr) || +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 !(info =3D resident_data_ex(attr, SI= ZEOF_ATTRIBUTE_VOLUME_INFO))) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$Volume is corrupted."= ); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1028,13 +1041,13 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_MIRR); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_MIRROR); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $MFTMir= r."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $MFTMir= r (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 sbi->mft.recs_mirr =3D -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_up_cluster(sbi, inode->i_size) = >> sbi->record_bits; +=C2=A0=C2=A0=C2=A0 sbi->mft.recs_mirr =3D ntfs_up_cluster(sbi, inode->i_si= ze) >> +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0=C2=A0 sbi->record_bits; =C2=A0=C2=A0=C2=A0=C2=A0 iput(inode); @@ -1043,8 +1056,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_LOG); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_LOGFILE); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load \x24Log= File."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load \x24Log= File (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1064,7 +1077,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 } else if (sbi->volume.flags & VOLUME_FLAG_DIRTY)= { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (!sb_rdonly(sb) && !sbi->options-= >force) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (!sb_rdonly(sb) && !options->forc= e) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_warn( =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 sb, =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 "volume is dirty and \"force\" flag is not set!"); @@ -1079,8 +1092,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_MFT); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $MFT."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $MFT (%= d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1095,8 +1108,10 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; =C2=A0=C2=A0=C2=A0=C2=A0 err =3D ni_load_all_mi(ni); -=C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $MFT's = subrecords (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 sbi->mft.ni =3D ni; @@ -1105,8 +1120,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_BITMAP); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_BITMAP); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Bitmap= ."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $Bitmap= (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1120,20 +1135,25 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 /* Check bitmap boundary. */ =C2=A0=C2=A0=C2=A0=C2=A0 tt =3D sbi->used.bitmap.nbits; =C2=A0=C2=A0=C2=A0=C2=A0 if (inode->i_size < bitmap_size(tt)) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$Bitmap is corrupted."= ); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 err =3D wnd_init(&sbi->used.bitmap, sb, tt); -=C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to initialize $= Bitmap (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 iput(inode); =C2=A0=C2=A0=C2=A0=C2=A0 /* Compute the MFT zone. */ =C2=A0=C2=A0=C2=A0=C2=A0 err =3D ntfs_refresh_zone(sbi); -=C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to initialize M= FT zone (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 /* Load $BadClus. */ =C2=A0=C2=A0=C2=A0=C2=A0 ref.low =3D cpu_to_le32(MFT_REC_BADCLUST); @@ -1178,8 +1198,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_ATTR); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_ATTRDEF); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $AttrDe= f -> %d", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $AttrDe= f (%d)", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1208,6 +1228,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (IS_ERR(page)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR= _ERR(page); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Fai= led to read $AttrDef (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_in= ode_out; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 memcpy(Add2Ptr(t, done), page_= address(page), @@ -1215,6 +1236,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_unmap_page(page); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (!idx && ATTR_STD !=3D t->t= ype) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$At= trDef is corrupted."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EI= NVAL; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_in= ode_out; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } @@ -1249,13 +1271,14 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_UPCASE); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_UPCASE); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode)) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $UpCase= ."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load $UpCase= (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 if (inode->i_size !=3D 0x10000 * sizeof(short)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D -EINVAL; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "$UpCase is corrupted."= ); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_inode_out; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -1266,6 +1289,7 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (IS_ERR(page)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR= _ERR(page); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Fai= led to read $UpCase (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto put_in= ode_out; =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } @@ -1291,23 +1315,31 @@ static int ntfs_fill_super(struct super_block=20 *sb, struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 if (is_ntfs3(sbi)) { =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Secure. */ =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D ntfs_security_init(sbi= ); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Fai= led to initialize $Secure (%d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Extend. */ =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D ntfs_extend_init(sbi); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_warn(sb, "Fa= iled to initialize $Extend."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto load_r= oot; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Extend\$Reparse. */ +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Extend/$Reparse. */ =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D ntfs_reparse_init(sbi); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_warn(sb, "Fa= iled to initialize $Extend/$Reparse."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto load_r= oot; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Extend\$ObjId. */ +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 /* Load $Extend/$ObjId. */ =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D ntfs_objid_init(sbi); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (err) { +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_warn(sb, "Fa= iled to initialize $Extend/$ObjId."); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto load_r= oot; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0load_root: @@ -1316,8 +1348,8 @@ static int ntfs_fill_super(struct super_block *sb,=20 struct fs_context *fc) =C2=A0=C2=A0=C2=A0=C2=A0 ref.seq =3D cpu_to_le16(MFT_REC_ROOT); =C2=A0=C2=A0=C2=A0=C2=A0 inode =3D ntfs_iget5(sb, &ref, &NAME_ROOT); =C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(inode) || !inode->i_op) { -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load root."); -=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D IS_ERR(inode) ? PTR_ERR(inod= e) : -EINVAL; +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 err =3D PTR_ERR(inode); +=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ntfs_err(sb, "Failed to load root (%= d).", err); =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out; =C2=A0=C2=A0=C2=A0=C2=A0 } --=20 2.34.1