From patchwork Wed Dec 6 15:08:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481936 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="FtCj3ZeR"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="eyslm8PS" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2355DD64; Wed, 6 Dec 2023 07:14:16 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id DCC301D47; Wed, 6 Dec 2023 15:02:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701874953; bh=h7CldxQv2S5Mzb+cgzMS8C/4d3oWIhrtzyaVf9z57fs=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=FtCj3ZeRaBPZiv12dqOADExR+OT9YeqY3/k6OC2QQKJ9fE5ai7DN/5guAiwZgrx0Y jzP8+1cDoiXU1I2OILGI8oMrFGQ8Mzot78sQq7PJSr+NK9SifuC9zxxEqJPwFMUUQW 5WoniFgJM0xApmStxoud0SP6WIR1lmABVdHpzCw8= 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 243202117; Wed, 6 Dec 2023 15:08:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875337; bh=h7CldxQv2S5Mzb+cgzMS8C/4d3oWIhrtzyaVf9z57fs=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=eyslm8PSDjgl/rJxNS7F5ffPQA97GTxlXUWYf2oWGY5RTCsYMvvFyqCsElJpRYSwz 6npCQYykuV9udtf+8QOPyVk307zBuOQjVyLCP2+qixg9ZdLjMW9bmjegmNrIfmBVN8 0V/6teX8F6muUqbGlKbZHgFBNOh1lspt8A1CwIIE= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:08:56 +0300 Message-ID: <53c3c86f-c816-4747-9262-592c3ddc6660@paragon-software.com> Date: Wed, 6 Dec 2023 18:08:56 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 01/16] fs/ntfs3: Improve alternative boot processing Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/super.c | 35 +++++++++++++++++------------------  1 file changed, 17 insertions(+), 18 deletions(-)      /* Save original dev_size. Used with alternative boot. */ @@ -873,11 +874,11 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,      sbi->volume.blocks = dev_size >> PAGE_SHIFT; -    bh = ntfs_bread(sb, 0); +read_boot: +    bh = ntfs_bread(sb, boot_block);      if (!bh) -        return -EIO; +        return boot_block ? -EINVAL : -EIO; -check_boot:      err = -EINVAL;      /* Corrupted image; do not read OOB */ @@ -1108,26 +1109,24 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,      }  out: -    if (err == -EINVAL && !bh->b_blocknr && dev_size0 > PAGE_SHIFT) { +    brelse(bh); + +    if (err == -EINVAL && !boot_block && dev_size0 > PAGE_SHIFT) {          u32 block_size = min_t(u32, sector_size, PAGE_SIZE);          u64 lbo = dev_size0 - sizeof(*boot); -        /* -          * Try alternative boot (last sector) -         */ -        brelse(bh); - -        sb_set_blocksize(sb, block_size); -        bh = ntfs_bread(sb, lbo >> blksize_bits(block_size)); -        if (!bh) -            return -EINVAL; - +        boot_block = lbo >> blksize_bits(block_size);          boot_off = lbo & (block_size - 1); -        hint = "Alternative boot"; -        dev_size = dev_size0; /* restore original size. */ -        goto check_boot; +        if (boot_block && block_size >= boot_off + sizeof(*boot)) { +            /* +             * Try alternative boot (last sector) +             */ +            sb_set_blocksize(sb, block_size); +            hint = "Alternative boot"; +            dev_size = dev_size0; /* restore original size. */ +            goto read_boot; +        }      } -    brelse(bh);      return err;  } diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 9153dffde950..09d61c6c90aa 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -866,6 +866,7 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,      u16 fn, ao;      u8 cluster_bits;      u32 boot_off = 0; +    sector_t boot_block = 0;      const char *hint = "Primary boot"; From patchwork Wed Dec 6 15:09:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481913 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="CM28fQWf" X-Greylist: delayed 99 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Wed, 06 Dec 2023 07:09:48 PST Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 02ADDC6; Wed, 6 Dec 2023 07:09:47 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 75DD71E1A; Wed, 6 Dec 2023 15:03:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875001; bh=Ifmg2OmIcc1e099M3eAc7+M0D09LHndtu4YB0fZ10AE=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=CM28fQWfl2jtqKv/4Q00K5fqN1XehGPo+klnsLEdY+l3HE67RQZYkzBqf6GrkQUfr djhTyaAxCW/vH267eQpmpDRK6Px0x/CmTqlYadmRB8vyT2X9uyiv7/Ivcky6dxEE49 O+rzp55tAH/NRfKemZdi/99Qye5kO0nISMZtbgX8= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:09:45 +0300 Message-ID: Date: Wed, 6 Dec 2023 18:09:45 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 02/16] fs/ntfs3: Modified fix directory element type detection Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Unfortunately reparse attribute is used for many purposes (several dozens). It is not possible here to know is this name symlink or not. To get exactly the type of name we should to open inode (read mft). getattr for opened file (fstat) correctly returns symlink. Signed-off-by: Konstantin Komarov ---  fs/ntfs3/dir.c | 30 +++++++++++++++++++++++++-----  1 file changed, 25 insertions(+), 5 deletions(-) +        } +    }      return !dir_emit(ctx, (s8 *)name, name_len, ino, dt_type);  } diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c index ec0566b322d5..22ede4da0450 100644 --- a/fs/ntfs3/dir.c +++ b/fs/ntfs3/dir.c @@ -309,11 +309,31 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,          return 0;      } -    /* NTFS: symlinks are "dir + reparse" or "file + reparse" */ -    if (fname->dup.fa & FILE_ATTRIBUTE_REPARSE_POINT) -        dt_type = DT_LNK; -    else -        dt_type = (fname->dup.fa & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG; +    /* +     * NTFS: symlinks are "dir + reparse" or "file + reparse" +     * Unfortunately reparse attribute is used for many purposes (several dozens). +     * It is not possible here to know is this name symlink or not. +     * To get exactly the type of name we should to open inode (read mft). +     * getattr for opened file (fstat) correctly returns symlink. +     */ +    dt_type = (fname->dup.fa & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG; + +    /* +     * It is not reliable to detect the type of name using duplicated information +     * stored in parent directory. +     * The only correct way to get the type of name - read MFT record and find ATTR_STD. +     * The code below is not good idea. +     * It does additional locks/reads just to get the type of name. +     * Should we use additional mount option to enable branch below? +     */ +    if ((fname->dup.fa & FILE_ATTRIBUTE_REPARSE_POINT) && +        ino != ni->mi.rno) { +        struct inode *inode = ntfs_iget5(sbi->sb, &e->ref, NULL); +        if (!IS_ERR_OR_NULL(inode)) { +            dt_type = fs_umode_to_dtype(inode->i_mode); +            iput(inode); From patchwork Wed Dec 6 15:10:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481914 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="bV1feHdO" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 31BBADE; Wed, 6 Dec 2023 07:10:27 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id D92B11E1A; Wed, 6 Dec 2023 15:04:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875040; bh=/GAY4vh49Ey49PjOB0D7aW4BJClWKFEVXZZb9RVpvm8=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=bV1feHdOoc85vxuNTcRIuuIj4OKvvVliIheZoWfeIjMagZtKTIExoG1tZP5GKcmcC 2Xm3LxPkbcoWDpxWt3fxCzNeybO3lNj/Zk/uh1gmH2/1enCbGpFcHF7wyUjchAGCIv 2RCP2b2+LXWKnHQCqKpaT1lY7nUqnYMKO5UJM8XU= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:10:24 +0300 Message-ID: Date: Wed, 6 Dec 2023 18:10:24 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 03/16] fs/ntfs3: Improve ntfs_dir_count Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/dir.c | 10 +++-------  1 file changed, 3 insertions(+), 7 deletions(-)          *is_empty = true; @@ -563,7 +561,7 @@ static int ntfs_dir_count(struct inode *dir, bool *is_empty, size_t *dirs,                  fles += 1;          } -        if (vbo >= i_size) +        if (bit >= max_indx)              goto out;          err = indx_used_bit(&ni->dir, ni, &bit); @@ -573,8 +571,7 @@ static int ntfs_dir_count(struct inode *dir, bool *is_empty, size_t *dirs,          if (bit == MINUS_ONE_T)              goto out; -        vbo = (u64)bit << index_bits; -        if (vbo >= i_size) +        if (bit >= max_indx)              goto out;          err = indx_read(&ni->dir, ni, bit << ni->dir.idx2vbn_bits, @@ -584,7 +581,6 @@ static int ntfs_dir_count(struct inode *dir, bool *is_empty, size_t *dirs,          hdr = &node->index->ihdr;          bit += 1; -        vbo = (u64)bit << ni->dir.idx2vbn_bits;      }  out: diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c index 22ede4da0450..726122ecd39b 100644 --- a/fs/ntfs3/dir.c +++ b/fs/ntfs3/dir.c @@ -515,11 +515,9 @@ static int ntfs_dir_count(struct inode *dir, bool *is_empty, size_t *dirs,      struct INDEX_HDR *hdr;      const struct ATTR_FILE_NAME *fname;      u32 e_size, off, end; -    u64 vbo = 0;      size_t drs = 0, fles = 0, bit = 0; -    loff_t i_size = ni->vfs_inode.i_size;      struct indx_node *node = NULL; -    u8 index_bits = ni->dir.index_bits; +    size_t max_indx = ni->vfs_inode.i_size >> ni->dir.index_bits;      if (is_empty) From patchwork Wed Dec 6 15:10:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481915 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="bLupnkpL" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 096DCD5B; Wed, 6 Dec 2023 07:10:54 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 751C91E1A; Wed, 6 Dec 2023 15:04:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875068; bh=mAuuCGMqlStfHaypyBJ9iLMuzcr3BmzULzMWMwWTRuE=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=bLupnkpLf7fzkUc2Zt5omBwLubjPcPeYPgaJ3tqLEQExUyjSso2/GDYWv58+hM9Zd fhwCheq3GPFBlwishCkRPuzN547xVQMTB6CcNxkddptzAQzbiVxJDeavPAQdzRFKtx 4XYrwbbISqytrtKzvacmxjfRMfH0G33BplXtpoVE= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:10:52 +0300 Message-ID: <8cb671f9-252b-443b-a903-ca62c9097533@paragon-software.com> Date: Wed, 6 Dec 2023 18:10:52 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 04/16] fs/ntfs3: Correct hard links updating when dealing with DOS neams Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/record.c | 16 ++++++++++++++--  1 file changed, 14 insertions(+), 2 deletions(-)      used -= asize; diff --git a/fs/ntfs3/record.c b/fs/ntfs3/record.c index 53629b1f65e9..7b6423584eae 100644 --- a/fs/ntfs3/record.c +++ b/fs/ntfs3/record.c @@ -535,8 +535,20 @@ bool mi_remove_attr(struct ntfs_inode *ni, struct mft_inode *mi,          return false;      if (ni && is_attr_indexed(attr)) { -        le16_add_cpu(&ni->mi.mrec->hard_links, -1); -        ni->mi.dirty = true; +        u16 links = le16_to_cpu(ni->mi.mrec->hard_links); +        struct ATTR_FILE_NAME *fname = +            attr->type != ATTR_NAME ? +                NULL : +                resident_data_ex(attr, +                         SIZEOF_ATTRIBUTE_FILENAME); +        if (fname && fname->type == FILE_NAME_DOS) { +            /* Do not decrease links count deleting DOS name. */ +        } else if (!links) { +            /* minor error. Not critical. */ +        } else { +            ni->mi.mrec->hard_links = cpu_to_le16(links - 1); +            ni->mi.dirty = true; +        }      } From patchwork Wed Dec 6 15:11:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481916 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="W9QM4y1P"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="LhPCq7kw" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6BC519A; Wed, 6 Dec 2023 07:11:15 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 4775E1E1A; Wed, 6 Dec 2023 15:04:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875089; bh=2BFRYk4Moqh9lL8OQcoNVoZ0RV2c9czsoWnrNagsXik=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=W9QM4y1PMOeSapyHHNSO54M7gNOc1aLuFNGjtTYjQSJV0htdC4x+VrQzupF0/j9I2 UQ/Qz+SxSN+tutElWa0RtsRilM5yspu+upzKbRQtGAS3NGzhFCZufJlfmJhGi0hO+U tyjNmuWSVtRiSUFQIzuDruoiwdUzHk7LPQA+M7rs= 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 7F1272117; Wed, 6 Dec 2023 15:11:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875473; bh=2BFRYk4Moqh9lL8OQcoNVoZ0RV2c9czsoWnrNagsXik=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=LhPCq7kwV1lA63gtdTSLts0Uu8PS4YjNDVw1GJMjGvA42Ak90TZUseTrn1H2SP9cN sxA8xmWKrdoRbOZEcndzE9IUEt+a/pP//oH3NFdTK23dYF2ejGyECH6+V9PauMUPIH I7ouj8D/oTC4AJ8ES2dOWKSGaeBFkG1lESNnyQ7I= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:11:12 +0300 Message-ID: <44b1dd7e-f5fc-4908-84f1-8e631cdc23d9@paragon-software.com> Date: Wed, 6 Dec 2023 18:11:12 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 05/16] fs/ntfs3: Print warning while fixing hard links count Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/inode.c | 2 +-  1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c index 5e3d71374918..fa6c7965473c 100644 --- a/fs/ntfs3/inode.c +++ b/fs/ntfs3/inode.c @@ -412,7 +412,6 @@ static struct inode *ntfs_read_mft(struct inode *inode,          goto out;      if (!is_match && name) { -        /* Reuse rec as buffer for ascii name. */          err = -ENOENT;          goto out;      } @@ -427,6 +426,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,      if (names != le16_to_cpu(rec->hard_links)) {          /* Correct minor error on the fly. Do not mark inode as dirty. */ +        ntfs_inode_warn(inode, "Correct links count -> %u.", names);          rec->hard_links = cpu_to_le16(names);          ni->mi.dirty = true;      } From patchwork Wed Dec 6 15:11:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481917 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="hXLqwnBo" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1F6F112; Wed, 6 Dec 2023 07:11:42 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id C6A3D212D; Wed, 6 Dec 2023 15:05:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875116; bh=RexGtu8XWQhs4tm8penzzSeBhtaDj8gNGca25jwrs2M=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=hXLqwnBonYPKS90AP/XXpXvpg5+f5SWde19cling7MoZ4UnWwskiL/hAMPHubIxpw Of4FcC2fjOf/dQzXu8I2+vhD8p4R9EntgiXK60JCya/xpV8K9VtmMDipKLzh3QLjox JsiEpCgDcYrptLa+d6fhqSCIT7nICinhP97CaNZM= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:11:40 +0300 Message-ID: <17bac290-26bf-484d-bcf2-9a65e93add78@paragon-software.com> Date: Wed, 6 Dec 2023 18:11:40 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 06/16] fs/ntfs3: Reduce stack usage Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/fslog.c | 218 +++++++++++++++++++++--------------------------  1 file changed, 98 insertions(+), 120 deletions(-)  #define NTFSLOG_WRAPPED 0x00000001 @@ -987,6 +997,7 @@ struct ntfs_log {      struct ntfs_inode *ni;      u32 l_size; +    u32 orig_file_size;      u32 sys_page_size;      u32 sys_page_mask;      u32 page_size; @@ -1040,6 +1051,8 @@ struct ntfs_log {      struct CLIENT_ID client_id;      u32 client_undo_commit; + +    struct restart_info rst_info, rst_info2;  };  static inline u32 lsn_to_vbo(struct ntfs_log *log, const u64 lsn) @@ -1105,16 +1118,6 @@ static inline bool verify_client_lsn(struct ntfs_log *log,             lsn <= le64_to_cpu(log->ra->current_lsn) && lsn;  } -struct restart_info { -    u64 last_lsn; -    struct RESTART_HDR *r_page; -    u32 vbo; -    bool chkdsk_was_run; -    bool valid_page; -    bool initialized; -    bool restart; -}; -  static int read_log_page(struct ntfs_log *log, u32 vbo,               struct RECORD_PAGE_HDR **buffer, bool *usa_error)  { @@ -1176,7 +1179,7 @@ static int read_log_page(struct ntfs_log *log, u32 vbo,   * restart page header. It will stop the first time we find a   * valid page header.   */ -static int log_read_rst(struct ntfs_log *log, u32 l_size, bool first, +static int log_read_rst(struct ntfs_log *log, bool first,              struct restart_info *info)  {      u32 skip, vbo; @@ -1192,7 +1195,7 @@ static int log_read_rst(struct ntfs_log *log, u32 l_size, bool first,      }      /* Loop continuously until we succeed. */ -    for (; vbo < l_size; vbo = 2 * vbo + skip, skip = 0) { +    for (; vbo < log->l_size; vbo = 2 * vbo + skip, skip = 0) {          bool usa_error;          bool brst, bchk;          struct RESTART_AREA *ra; @@ -1285,22 +1288,17 @@ static int log_read_rst(struct ntfs_log *log, u32 l_size, bool first,  /*   * Ilog_init_pg_hdr - Init @log from restart page header.   */ -static void log_init_pg_hdr(struct ntfs_log *log, u32 sys_page_size, -                u32 page_size, u16 major_ver, u16 minor_ver) +static void log_init_pg_hdr(struct ntfs_log *log, u16 major_ver, u16 minor_ver)  { -    log->sys_page_size = sys_page_size; -    log->sys_page_mask = sys_page_size - 1; -    log->page_size = page_size; -    log->page_mask = page_size - 1; -    log->page_bits = blksize_bits(page_size); +    log->sys_page_size = log->page_size; +    log->sys_page_mask = log->page_mask;      log->clst_per_page = log->page_size >> log->ni->mi.sbi->cluster_bits;      if (!log->clst_per_page)          log->clst_per_page = 1; -    log->first_page = major_ver >= 2 ? -                  0x22 * page_size : -                  ((sys_page_size << 1) + (page_size << 1)); +    log->first_page = major_ver >= 2 ? 0x22 * log->page_size : +                       4 * log->page_size;      log->major_ver = major_ver;      log->minor_ver = minor_ver;  } @@ -1308,12 +1306,11 @@ static void log_init_pg_hdr(struct ntfs_log *log, u32 sys_page_size,  /*   * log_create - Init @log in cases when we don't have a restart area to use.   */ -static void log_create(struct ntfs_log *log, u32 l_size, const u64 last_lsn, +static void log_create(struct ntfs_log *log, const u64 last_lsn,                 u32 open_log_count, bool wrapped, bool use_multi_page)  { -    log->l_size = l_size;      /* All file offsets must be quadword aligned. */ -    log->file_data_bits = blksize_bits(l_size) - 3; +    log->file_data_bits = blksize_bits(log->l_size) - 3;      log->seq_num_mask = (8 << log->file_data_bits) - 1;      log->seq_num_bits = sizeof(u64) * 8 - log->file_data_bits;      log->seq_num = (last_lsn >> log->file_data_bits) + 2; @@ -3720,10 +3717,8 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      struct ntfs_sb_info *sbi = ni->mi.sbi;      struct ntfs_log *log; -    struct restart_info rst_info, rst_info2; -    u64 rec_lsn, ra_lsn, checkpt_lsn = 0, rlsn = 0; +    u64 rec_lsn, checkpt_lsn = 0, rlsn = 0;      struct ATTR_NAME_ENTRY *attr_names = NULL; -    struct ATTR_NAME_ENTRY *ane;      struct RESTART_TABLE *dptbl = NULL;      struct RESTART_TABLE *trtbl = NULL;      const struct RESTART_TABLE *rt; @@ -3741,9 +3736,7 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      struct TRANSACTION_ENTRY *tr;      struct DIR_PAGE_ENTRY *dp;      u32 i, bytes_per_attr_entry; -    u32 l_size = ni->vfs_inode.i_size; -    u32 orig_file_size = l_size; -    u32 page_size, vbo, tail, off, dlen; +    u32 vbo, tail, off, dlen;      u32 saved_len, rec_len, transact_id;      bool use_second_page;      struct RESTART_AREA *ra2, *ra = NULL; @@ -3758,52 +3751,50 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      u16 t16;      u32 t32; -    /* Get the size of page. NOTE: To replay we can use default page. */ -#if PAGE_SIZE >= DefaultLogPageSize && PAGE_SIZE <= DefaultLogPageSize * 2 -    page_size = norm_file_page(PAGE_SIZE, &l_size, true); -#else -    page_size = norm_file_page(PAGE_SIZE, &l_size, false); -#endif -    if (!page_size) -        return -EINVAL; -      log = kzalloc(sizeof(struct ntfs_log), GFP_NOFS);      if (!log)          return -ENOMEM;      log->ni = ni; -    log->l_size = l_size; -    log->one_page_buf = kmalloc(page_size, GFP_NOFS); +    log->l_size = log->orig_file_size = ni->vfs_inode.i_size; + +    /* Get the size of page. NOTE: To replay we can use default page. */ +#if PAGE_SIZE >= DefaultLogPageSize && PAGE_SIZE <= DefaultLogPageSize * 2 +    log->page_size = norm_file_page(PAGE_SIZE, &log->l_size, true); +#else +    log->page_size = norm_file_page(PAGE_SIZE, &log->l_size, false); +#endif +    if (!log->page_size) { +        err = -EINVAL; +        goto out; +    } +    log->one_page_buf = kmalloc(log->page_size, GFP_NOFS);      if (!log->one_page_buf) {          err = -ENOMEM;          goto out;      } -    log->page_size = page_size; -    log->page_mask = page_size - 1; -    log->page_bits = blksize_bits(page_size); +    log->page_mask = log->page_size - 1; +    log->page_bits = blksize_bits(log->page_size);      /* Look for a restart area on the disk. */ -    memset(&rst_info, 0, sizeof(struct restart_info)); -    err = log_read_rst(log, l_size, true, &rst_info); +    err = log_read_rst(log, true, &log->rst_info);      if (err)          goto out;      /* remember 'initialized' */ -    *initialized = rst_info.initialized; +    *initialized = log->rst_info.initialized; -    if (!rst_info.restart) { -        if (rst_info.initialized) { +    if (!log->rst_info.restart) { +        if (log->rst_info.initialized) {              /* No restart area but the file is not initialized. */              err = -EINVAL;              goto out;          } -        log_init_pg_hdr(log, page_size, page_size, 1, 1); -        log_create(log, l_size, 0, get_random_u32(), false, false); - -        log->ra = ra; +        log_init_pg_hdr(log, 1, 1); +        log_create(log, 0, get_random_u32(), false, false);          ra = log_create_ra(log);          if (!ra) { @@ -3820,25 +3811,26 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)       * If the restart offset above wasn't zero then we won't       * look for a second restart.       */ -    if (rst_info.vbo) +    if (log->rst_info.vbo)          goto check_restart_area; -    memset(&rst_info2, 0, sizeof(struct restart_info)); -    err = log_read_rst(log, l_size, false, &rst_info2); +    err = log_read_rst(log, false, &log->rst_info2);      if (err)          goto out;      /* Determine which restart area to use. */ -    if (!rst_info2.restart || rst_info2.last_lsn <= rst_info.last_lsn) +    if (!log->rst_info2.restart || +        log->rst_info2.last_lsn <= log->rst_info.last_lsn)          goto use_first_page;      use_second_page = true; -    if (rst_info.chkdsk_was_run && page_size != rst_info.vbo) { +    if (log->rst_info.chkdsk_was_run && +        log->page_size != log->rst_info.vbo) {          struct RECORD_PAGE_HDR *sp = NULL;          bool usa_error; -        if (!read_log_page(log, page_size, &sp, &usa_error) && +        if (!read_log_page(log, log->page_size, &sp, &usa_error) &&              sp->rhdr.sign == NTFS_CHKD_SIGNATURE) {              use_second_page = false;          } @@ -3846,52 +3838,43 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      }      if (use_second_page) { -        kfree(rst_info.r_page); -        memcpy(&rst_info, &rst_info2, sizeof(struct restart_info)); -        rst_info2.r_page = NULL; +        kfree(log->rst_info.r_page); +        memcpy(&log->rst_info, &log->rst_info2, +               sizeof(struct restart_info)); +        log->rst_info2.r_page = NULL;      }  use_first_page: -    kfree(rst_info2.r_page); +    kfree(log->rst_info2.r_page);  check_restart_area:      /*       * If the restart area is at offset 0, we want       * to write the second restart area first.       */ -    log->init_ra = !!rst_info.vbo; +    log->init_ra = !!log->rst_info.vbo;      /* If we have a valid page then grab a pointer to the restart area. */ -    ra2 = rst_info.valid_page ? -              Add2Ptr(rst_info.r_page, -                  le16_to_cpu(rst_info.r_page->ra_off)) : +    ra2 = log->rst_info.valid_page ? +              Add2Ptr(log->rst_info.r_page, +                  le16_to_cpu(log->rst_info.r_page->ra_off)) :                NULL; -    if (rst_info.chkdsk_was_run || +    if (log->rst_info.chkdsk_was_run ||          (ra2 && ra2->client_idx[1] == LFS_NO_CLIENT_LE)) {          bool wrapped = false;          bool use_multi_page = false;          u32 open_log_count;          /* Do some checks based on whether we have a valid log page. */ -        if (!rst_info.valid_page) { -            open_log_count = get_random_u32(); -            goto init_log_instance; -        } -        open_log_count = le32_to_cpu(ra2->open_log_count); - -        /* -         * If the restart page size isn't changing then we want to -         * check how much work we need to do. -         */ -        if (page_size != le32_to_cpu(rst_info.r_page->sys_page_size)) -            goto init_log_instance; +        open_log_count = log->rst_info.valid_page ? +                     le32_to_cpu(ra2->open_log_count) : +                     get_random_u32(); -init_log_instance: -        log_init_pg_hdr(log, page_size, page_size, 1, 1); +        log_init_pg_hdr(log, 1, 1); -        log_create(log, l_size, rst_info.last_lsn, open_log_count, -               wrapped, use_multi_page); +        log_create(log, log->rst_info.last_lsn, open_log_count, wrapped, +               use_multi_page);          ra = log_create_ra(log);          if (!ra) { @@ -3916,28 +3899,27 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)       * use the log file. We must use the system page size instead of the       * default size if there is not a clean shutdown.       */ -    t32 = le32_to_cpu(rst_info.r_page->sys_page_size); -    if (page_size != t32) { -        l_size = orig_file_size; -        page_size = -            norm_file_page(t32, &l_size, t32 == DefaultLogPageSize); +    t32 = le32_to_cpu(log->rst_info.r_page->sys_page_size); +    if (log->page_size != t32) { +        log->l_size = log->orig_file_size; +        log->page_size = norm_file_page(t32, &log->l_size, +                        t32 == DefaultLogPageSize);      } -    if (page_size != t32 || -        page_size != le32_to_cpu(rst_info.r_page->page_size)) { +    if (log->page_size != t32 || +        log->page_size != le32_to_cpu(log->rst_info.r_page->page_size)) {          err = -EINVAL;          goto out;      }      /* If the file size has shrunk then we won't mount it. */ -    if (l_size < le64_to_cpu(ra2->l_size)) { +    if (log->l_size < le64_to_cpu(ra2->l_size)) {          err = -EINVAL;          goto out;      } -    log_init_pg_hdr(log, page_size, page_size, -            le16_to_cpu(rst_info.r_page->major_ver), -            le16_to_cpu(rst_info.r_page->minor_ver)); +    log_init_pg_hdr(log, le16_to_cpu(log->rst_info.r_page->major_ver), +            le16_to_cpu(log->rst_info.r_page->minor_ver));      log->l_size = le64_to_cpu(ra2->l_size);      log->seq_num_bits = le32_to_cpu(ra2->seq_num_bits); @@ -3945,7 +3927,7 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      log->seq_num_mask = (8 << log->file_data_bits) - 1;      log->last_lsn = le64_to_cpu(ra2->current_lsn);      log->seq_num = log->last_lsn >> log->file_data_bits; -    log->ra_off = le16_to_cpu(rst_info.r_page->ra_off); +    log->ra_off = le16_to_cpu(log->rst_info.r_page->ra_off);      log->restart_size = log->sys_page_size - log->ra_off;      log->record_header_len = le16_to_cpu(ra2->rec_hdr_len);      log->ra_size = le16_to_cpu(ra2->ra_len); @@ -4045,7 +4027,7 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      log->current_avail = current_log_avail(log);      /* Remember which restart area to write first. */ -    log->init_ra = rst_info.vbo; +    log->init_ra = log->rst_info.vbo;  process_log:      /* 1.0, 1.1, 2.0 log->major_ver/minor_ver - short values. */ @@ -4105,7 +4087,7 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      log->client_id.seq_num = cr->seq_num;      log->client_id.client_idx = client; -    err = read_rst_area(log, &rst, &ra_lsn); +    err = read_rst_area(log, &rst, &checkpt_lsn);      if (err)          goto out; @@ -4114,9 +4096,8 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      bytes_per_attr_entry = !rst->major_ver ? 0x2C : 0x28; -    checkpt_lsn = le64_to_cpu(rst->check_point_start); -    if (!checkpt_lsn) -        checkpt_lsn = ra_lsn; +    if (rst->check_point_start) +        checkpt_lsn = le64_to_cpu(rst->check_point_start);      /* Allocate and Read the Transaction Table. */      if (!rst->transact_table_len) @@ -4330,23 +4311,20 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      lcb = NULL;  check_attribute_names2: -    if (!rst->attr_names_len) -        goto trace_attribute_table; - -    ane = attr_names; -    if (!oatbl) -        goto trace_attribute_table; -    while (ane->off) { -        /* TODO: Clear table on exit! */ -        oe = Add2Ptr(oatbl, le16_to_cpu(ane->off)); -        t16 = le16_to_cpu(ane->name_bytes); -        oe->name_len = t16 / sizeof(short); -        oe->ptr = ane->name; -        oe->is_attr_name = 2; -        ane = Add2Ptr(ane, sizeof(struct ATTR_NAME_ENTRY) + t16); -    } - -trace_attribute_table: +    if (rst->attr_names_len && oatbl) { +        struct ATTR_NAME_ENTRY *ane = attr_names; +        while (ane->off) { +            /* TODO: Clear table on exit! */ +            oe = Add2Ptr(oatbl, le16_to_cpu(ane->off)); +            t16 = le16_to_cpu(ane->name_bytes); +            oe->name_len = t16 / sizeof(short); +            oe->ptr = ane->name; +            oe->is_attr_name = 2; +            ane = Add2Ptr(ane, +                      sizeof(struct ATTR_NAME_ENTRY) + t16); +        } +    } +      /*       * If the checkpt_lsn is zero, then this is a freshly       * formatted disk and we have no work to do. @@ -5189,7 +5167,7 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)      kfree(oatbl);      kfree(dptbl);      kfree(attr_names); -    kfree(rst_info.r_page); +    kfree(log->rst_info.r_page);      kfree(ra);      kfree(log->one_page_buf); diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c index 98ccb6650858..7dbb000fc691 100644 --- a/fs/ntfs3/fslog.c +++ b/fs/ntfs3/fslog.c @@ -974,6 +974,16 @@ static inline void *alloc_rsttbl_from_idx(struct RESTART_TABLE **tbl, u32 vbo)      return e;  } +struct restart_info { +    u64 last_lsn; +    struct RESTART_HDR *r_page; +    u32 vbo; +    bool chkdsk_was_run; +    bool valid_page; +    bool initialized; +    bool restart; +}; +  #define RESTART_SINGLE_PAGE_IO cpu_to_le16(0x0001) From patchwork Wed Dec 6 15:12:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481928 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="ml0RcwIB" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52FF1C6; Wed, 6 Dec 2023 07:12:06 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 2AAFC2120; Wed, 6 Dec 2023 15:05:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875140; bh=KEnz3KTE1Z9/osOlDauLKgWtI6LdwFBhWwhEahHqNQo=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=ml0RcwIB/jbk6KHc50rd9/kLCglaBQgfFiOHbhazURkapxReFpC4vxnpvlYMS8nrP 58adYEG0RnhgyeLDEMwND0AqrD9TZFlz6HTNiuDEmvzUmC5+PXmjU2b3YGybT7p0QH p4lAjZYfowSTC2GQFaBSEjxTjNgDlilQX4n/rSpU= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:12:03 +0300 Message-ID: <7ae15d02-7745-4241-8b28-197eebbb6b7b@paragon-software.com> Date: Wed, 6 Dec 2023 18:12:03 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 07/16] fs/ntfs3: Fix multithreaded stress test Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/attrib.c | 21 ++++++++++++++-------  1 file changed, 14 insertions(+), 7 deletions(-)      CLST hint, svcn, to_alloc, evcn1, next_svcn, asize, end, vcn0, alen; @@ -904,12 +904,8 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn,          *len = 0;      up_read(&ni->file.run_lock); -    if (*len) { -        if (*lcn != SPARSE_LCN || !new) -            return 0; /* Fast normal way without allocation. */ -        else if (clen > *len) -            clen = *len; -    } +    if (*len && (*lcn != SPARSE_LCN || !new)) +        return 0; /* Fast normal way without allocation. */      /* No cluster in cache or we need to allocate cluster in hole. */      sbi = ni->mi.sbi; @@ -918,6 +914,17 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn,      ni_lock(ni);      down_write(&ni->file.run_lock); +    /* Repeat the code above (under write lock). */ +    if (!run_lookup_entry(run, vcn, lcn, len, NULL)) +        *len = 0; + +    if (*len) { +        if (*lcn != SPARSE_LCN || !new) +            goto out; /* normal way without allocation. */ +        if (clen > *len) +            clen = *len; +    } +      le_b = NULL;      attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL, 0, NULL, &mi_b);      if (!attr_b) { diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c index 63f70259edc0..4b78b669a3bd 100644 --- a/fs/ntfs3/attrib.c +++ b/fs/ntfs3/attrib.c @@ -886,7 +886,7 @@ int attr_data_get_block(struct ntfs_inode *ni, CLST vcn, CLST clen, CLST *lcn,      struct runs_tree *run = &ni->file.run;      struct ntfs_sb_info *sbi;      u8 cluster_bits; -    struct ATTRIB *attr = NULL, *attr_b; +    struct ATTRIB *attr, *attr_b;      struct ATTR_LIST_ENTRY *le, *le_b;      struct mft_inode *mi, *mi_b; From patchwork Wed Dec 6 15:12:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481929 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="FOwzIfud" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5AACBD7F; Wed, 6 Dec 2023 07:12:26 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 0ECBE1E1A; Wed, 6 Dec 2023 15:06:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875160; bh=oUVQuELufd+5uJnO89HaHyCbduYubrq21BOGdkAjVXA=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=FOwzIfudC9bkRwbf6E0CtzufD/ejcjuSxV7Z5x/uEjKnx7LMxtYMRpGMY3a0f+Xj1 VTN9Wid82R80TU43j6P6Id0vICyjWksAudOq7xKWIgihy04fyxDrpW81CcbUOoqSiM 4rGdNcNiGvt9vbbsKkj/CzhrpECl0PL2b3/cdjq8= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:12:23 +0300 Message-ID: <61494224-68a8-431b-ba76-46b4812c241c@paragon-software.com> Date: Wed, 6 Dec 2023 18:12:23 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 08/16] fs/ntfs3: Fix detected field-spanning write (size 8) of single field "le->name" Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/ntfs.h | 2 +-  1 file changed, 1 insertion(+), 1 deletion(-)  }; // sizeof(0x20) diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h index 86aecbb01a92..13e96fc63dae 100644 --- a/fs/ntfs3/ntfs.h +++ b/fs/ntfs3/ntfs.h @@ -523,7 +523,7 @@ struct ATTR_LIST_ENTRY {      __le64 vcn;        // 0x08: Starting VCN of this attribute.      struct MFT_REF ref;    // 0x10: MFT record number with attribute.      __le16 id;        // 0x18: struct ATTRIB ID. -    __le16 name[3];        // 0x1A: Just to align. To get real name can use bNameOffset. +    __le16 name[];        // 0x1A: Just to align. To get real name can use name_off. From patchwork Wed Dec 6 15:12:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481930 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="bj/RGX+6"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="EDu7HbCK" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92A799A; Wed, 6 Dec 2023 07:12:42 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 6CBA71E1A; Wed, 6 Dec 2023 15:06:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875176; bh=uNOivJvRpFbPgTjjVYSC1qoe7uSyIYuTw1rYbo9Hp0w=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=bj/RGX+6H/0ra5+wZHFHw7x8ZHxC4RWyNh6puOtIUKz5QvQUmsZ0xpgJCSi/3kgd8 CIsytNXKjsTuT5Mx61jzLyhwiQnJd83CIzQ/z1e9e85Gj6tRy0SUOh6XKrUueruEHx 18Yo98VSLGmUOGFrBa2t/w8+BTvfuN+wPVYQ0NHY= 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 AF2152117; Wed, 6 Dec 2023 15:12:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875560; bh=uNOivJvRpFbPgTjjVYSC1qoe7uSyIYuTw1rYbo9Hp0w=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=EDu7HbCK/E19/EVWbQReaNUWjnJLDH4T6JYEPDGhrvSGr5wZUxVJQM4lhLYJD/t0W oR+i7ET+/BXRId+BZ8LmBGtxuI6ob1ldfPfm/VIOAwEHZKDQULAHXsEE6jT94qMOJ2 9BGkKHDpMtgzU6Cv1q/cZpWUFN0QVVDb06lPOESw= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:12:40 +0300 Message-ID: <29a1087c-c903-488c-993a-2e3c23c2d4d2@paragon-software.com> Date: Wed, 6 Dec 2023 18:12:40 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 09/16] fs/ntfs3: Correct use bh_read Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/file.c  | 19 +++++++++----------  fs/ntfs3/inode.c |  7 +++----  2 files changed, 12 insertions(+), 14 deletions(-)      } diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c index a5a30a24ce5d..5691f04e6751 100644 --- a/fs/ntfs3/file.c +++ b/fs/ntfs3/file.c @@ -188,6 +188,7 @@ static int ntfs_zero_range(struct inode *inode, u64 vbo, u64 vbo_to)      u32 bh_next, bh_off, to;      sector_t iblock;      struct folio *folio; +    bool dirty = false;      for (; idx < idx_end; idx += 1, from = 0) {          page_off = (loff_t)idx << PAGE_SHIFT; @@ -223,29 +224,27 @@ static int ntfs_zero_range(struct inode *inode, u64 vbo, u64 vbo_to)              /* Ok, it's mapped. Make sure it's up-to-date. */              if (folio_test_uptodate(folio))                  set_buffer_uptodate(bh); - -            if (!buffer_uptodate(bh)) { -                err = bh_read(bh, 0); -                if (err < 0) { -                    folio_unlock(folio); -                    folio_put(folio); -                    goto out; -                } +            else if (bh_read(bh, 0) < 0) { +                err = -EIO; +                folio_unlock(folio); +                folio_put(folio); +                goto out;              }              mark_buffer_dirty(bh); -          } while (bh_off = bh_next, iblock += 1,               head != (bh = bh->b_this_page));          folio_zero_segment(folio, from, to); +        dirty = true;          folio_unlock(folio);          folio_put(folio);          cond_resched();      }  out: -    mark_inode_dirty(inode); +    if (dirty) +        mark_inode_dirty(inode);      return err;  } diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c index fa6c7965473c..bba0208c4afd 100644 --- a/fs/ntfs3/inode.c +++ b/fs/ntfs3/inode.c @@ -345,9 +345,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,              inode->i_size = le16_to_cpu(rp.SymbolicLinkReparseBuffer                                  .PrintNameLength) /                      sizeof(u16); -              ni->i_valid = inode->i_size; -              /* Clear directory bit. */              if (ni->ni_flags & NI_FLAG_DIR) {                  indx_clear(&ni->dir); @@ -653,9 +651,10 @@ static noinline int ntfs_get_block_vbo(struct inode *inode, u64 vbo,              off = vbo & (PAGE_SIZE - 1);              folio_set_bh(bh, folio, off); -            err = bh_read(bh, 0); -            if (err < 0) +            if (bh_read(bh, 0) < 0) { +                err = -EIO;                  goto out; +            }              folio_zero_segment(folio, off + voff, off + block_size);          } From patchwork Wed Dec 6 15:12:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481931 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="SKOa+CHd" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6BAA0D44; Wed, 6 Dec 2023 07:13:00 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 346BF1E1A; Wed, 6 Dec 2023 15:06:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875194; bh=5WNxqIEiVf5xBesOyM4G/OuoGM3roOgonpEjUNzMoQc=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=SKOa+CHdhTDrT3JdA0I4GHvBuQyY1T0VvV9P7kGKydPxnb9m3t+8rtPN4g79s6Lwt nT3xoGGzTdH0XsfnMSCfZnc21q3dm8plyc7QvNSfcNOYeCRijRrabXr/Meqx8jTC9w xi4LFnvnnREfe4Bd80iBXzJ2WaMh/hFMKhNHYV+w= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:12:58 +0300 Message-ID: <3fbcb5a7-2b6f-44ae-8355-06461e7a1447@paragon-software.com> Date: Wed, 6 Dec 2023 18:12:58 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 10/16] fs/ntfs3: Add file_modified Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/file.c | 13 +++++++++++++  1 file changed, 13 insertions(+)          filemap_invalidate_unlock(mapping); @@ -1040,6 +1046,7 @@ static ssize_t ntfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)      struct address_space *mapping = file->f_mapping;      struct inode *inode = mapping->host;      ssize_t ret; +    int err;      struct ntfs_inode *ni = ntfs_i(inode);      if (is_encrypted(ni)) { @@ -1067,6 +1074,12 @@ static ssize_t ntfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)      if (ret <= 0)          goto out; +    err = file_modified(iocb->ki_filp); +    if (err) { +        ret = err; +        goto out; +    } +      if (WARN_ON(ni->ni_flags & NI_FLAG_COMPRESSED_MASK)) {          /* Should never be here, see ntfs_file_open(). */          ret = -EOPNOTSUPP; diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c index 5691f04e6751..bb80ce2eec2f 100644 --- a/fs/ntfs3/file.c +++ b/fs/ntfs3/file.c @@ -632,11 +632,17 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)                          &ni->file.run, i_size, &ni->i_valid,                          true, NULL);              ni_unlock(ni); +            if (err) +                goto out;          } else if (new_size > i_size) {              inode->i_size = new_size;          }      } +    err = file_modified(file); +    if (err) +        goto out; +  out:      if (map_locked) From patchwork Wed Dec 6 15:13:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481932 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="m3/oqph8" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CF039DE; Wed, 6 Dec 2023 07:13:17 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 903201E1A; Wed, 6 Dec 2023 15:06:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875211; bh=F097v/jB8ZR21e/O3vd36dCK4gneA3BrFHtMeimQuV4=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=m3/oqph84dOfSvsyEUrnjup2sI052twZlQVgqAS6UOH+jafuQ1FPCmz6Fu7lGEQQi 2/82ZDbxioT09DRo45akAqbUhutD4t5bbxSm44sL5MnKUhvjmAyx/0IIaHypmgn1vm OEh6DBzuauAM8FnZ1RUItM5m01Y3W9cCWxkOJYF0= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:13:15 +0300 Message-ID: <89861d9e-f3a4-483d-b88d-4085dc2e0a8b@paragon-software.com> Date: Wed, 6 Dec 2023 18:13:15 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 11/16] fs/ntfs3: Drop suid and sgid bits as a part of fpunch Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/file.c | 9 +++++++++  1 file changed, 9 insertions(+)          end_a = end & ~mask; @@ -524,6 +528,8 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)              ni_lock(ni);              err = attr_punch_hole(ni, vbo_a, end_a - vbo_a, NULL);              ni_unlock(ni); +            if (err) +                goto out;          }      } else if (mode & FALLOC_FL_COLLAPSE_RANGE) {          /* @@ -563,6 +569,8 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)          ni_lock(ni);          err = attr_insert_range(ni, vbo, len);          ni_unlock(ni); +        if (err) +            goto out;      } else {          /* Check new size. */          u8 cluster_bits = sbi->cluster_bits; @@ -639,6 +647,7 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)          }      } +ok:      err = file_modified(file);      if (err)          goto out; diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c index bb80ce2eec2f..0ff5d3af2889 100644 --- a/fs/ntfs3/file.c +++ b/fs/ntfs3/file.c @@ -498,10 +498,14 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)          ni_lock(ni);          err = attr_punch_hole(ni, vbo, len, &frame_size);          ni_unlock(ni); +        if (!err) +            goto ok; +          if (err != E_NTFS_NOTALIGNED)              goto out;          /* Process not aligned punch. */ +        err = 0;          mask = frame_size - 1;          vbo_a = (vbo + mask) & ~mask; From patchwork Wed Dec 6 15:13:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481933 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="eDwoUKNx"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="Ku8/Redg" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B797FD5E; Wed, 6 Dec 2023 07:13:34 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 8507D1E1A; Wed, 6 Dec 2023 15:07:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875228; bh=uJ8yXb35Y3nvlXGaUfbKb2hU6mLxvvg7KJ352HRIl1g=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=eDwoUKNxnC3Mgo5YqMg62nEwQlIzs9ZN6vkl1Oj/N6/RT0nvXp72F+JN+rfgOMvXZ foAWQKxkFIIu8YklSD8zsvXh7Y6NfK7Y2fLZ8YkDkPMmdNYLJax5arNk3jQiZY1W5r cPNFAPUzgIEbNaip/DtL7zgWlJgjCSwWstIw/ml0= 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 C75A42117; Wed, 6 Dec 2023 15:13:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875612; bh=uJ8yXb35Y3nvlXGaUfbKb2hU6mLxvvg7KJ352HRIl1g=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=Ku8/RedgSWDEvC1aHorRRbeFaxRRq9RroNtmTSCrs4SWXGRQM6g37ggHj/tEIDN7b 3EUjBCU0mnJo9y1wgCDSBcr/wdKVNjL3KM0gP50TDKsOV84HDSDA9jUQFNyBmpKVpy Qr3UwRwAkk39i6GpMLxR/4D3cv1L7zyyfGVMbXNM= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:13:32 +0300 Message-ID: <4f013a0c-9f3f-4a4a-88fa-17460abd702e@paragon-software.com> Date: Wed, 6 Dec 2023 18:13:32 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 12/16] fs/ntfs3: Implement super_operations::shutdown Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/file.c    | 18 ++++++++++++++++++  fs/ntfs3/frecord.c |  3 +++  fs/ntfs3/inode.c   | 21 +++++++++++++++++++--  fs/ntfs3/namei.c   | 12 ++++++++++++  fs/ntfs3/ntfs_fs.h |  9 ++++++++-  fs/ntfs3/super.c   | 12 ++++++++++++  fs/ntfs3/xattr.c   |  3 +++  7 files changed, 75 insertions(+), 3 deletions(-)          /* system.dos_attrib */ diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c index 0ff5d3af2889..07ed3d946e7c 100644 --- a/fs/ntfs3/file.c +++ b/fs/ntfs3/file.c @@ -260,6 +260,9 @@ static int ntfs_file_mmap(struct file *file, struct vm_area_struct *vma)      bool rw = vma->vm_flags & VM_WRITE;      int err; +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      if (is_encrypted(ni)) {          ntfs_inode_warn(inode, "mmap encrypted not supported");          return -EOPNOTSUPP; @@ -677,6 +680,9 @@ int ntfs3_setattr(struct mnt_idmap *idmap, struct dentry *dentry,      umode_t mode = inode->i_mode;      int err; +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      err = setattr_prepare(idmap, dentry, attr);      if (err)          goto out; @@ -732,6 +738,9 @@ static ssize_t ntfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)      struct inode *inode = file->f_mapping->host;      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      if (is_encrypted(ni)) {          ntfs_inode_warn(inode, "encrypted i/o not supported");          return -EOPNOTSUPP; @@ -766,6 +775,9 @@ static ssize_t ntfs_file_splice_read(struct file *in, loff_t *ppos,      struct inode *inode = in->f_mapping->host;      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      if (is_encrypted(ni)) {          ntfs_inode_warn(inode, "encrypted i/o not supported");          return -EOPNOTSUPP; @@ -1058,6 +1070,9 @@ static ssize_t ntfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)      int err;      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      if (is_encrypted(ni)) {          ntfs_inode_warn(inode, "encrypted i/o not supported");          return -EOPNOTSUPP; @@ -1118,6 +1133,9 @@ int ntfs_file_open(struct inode *inode, struct file *file)  {      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      if (unlikely((is_compressed(ni) || is_encrypted(ni)) &&               (file->f_flags & O_DIRECT))) {          return -EOPNOTSUPP; diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c index 3df2d9e34b91..8744ba36d422 100644 --- a/fs/ntfs3/frecord.c +++ b/fs/ntfs3/frecord.c @@ -3259,6 +3259,9 @@ int ni_write_inode(struct inode *inode, int sync, const char *hint)      if (is_bad_inode(inode) || sb_rdonly(sb))          return 0; +    if (unlikely(ntfs3_forced_shutdown(sb))) +        return -EIO; +      if (!ni_trylock(ni)) {          /* 'ni' is under modification, skip for now. */          mark_inode_dirty_sync(inode); diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c index bba0208c4afd..85452a6b1d40 100644 --- a/fs/ntfs3/inode.c +++ b/fs/ntfs3/inode.c @@ -852,9 +852,13 @@ static int ntfs_resident_writepage(struct folio *folio,                     struct writeback_control *wbc, void *data)  {      struct address_space *mapping = data; -    struct ntfs_inode *ni = ntfs_i(mapping->host); +    struct inode *inode = mapping->host; +    struct ntfs_inode *ni = ntfs_i(inode);      int ret; +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      ni_lock(ni);      ret = attr_data_write_resident(ni, &folio->page);      ni_unlock(ni); @@ -868,7 +872,12 @@ static int ntfs_resident_writepage(struct folio *folio,  static int ntfs_writepages(struct address_space *mapping,                 struct writeback_control *wbc)  { -    if (is_resident(ntfs_i(mapping->host))) +    struct inode *inode = mapping->host; + +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; + +    if (is_resident(ntfs_i(inode)))          return write_cache_pages(mapping, wbc, ntfs_resident_writepage,                       mapping);      return mpage_writepages(mapping, wbc, ntfs_get_block); @@ -888,6 +897,9 @@ int ntfs_write_begin(struct file *file, struct address_space *mapping,      struct inode *inode = mapping->host;      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      *pagep = NULL;      if (is_resident(ni)) {          struct page *page = @@ -1305,6 +1317,11 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,          goto out1;      } +    if (unlikely(ntfs3_forced_shutdown(sb))) { +        err = -EIO; +        goto out2; +    } +      /* Mark rw ntfs as dirty. it will be cleared at umount. */      ntfs_set_state(sbi, NTFS_DIRTY_DIRTY); diff --git a/fs/ntfs3/namei.c b/fs/ntfs3/namei.c index ee3093be5170..cae41db0aaa7 100644 --- a/fs/ntfs3/namei.c +++ b/fs/ntfs3/namei.c @@ -181,6 +181,9 @@ static int ntfs_unlink(struct inode *dir, struct dentry *dentry)      struct ntfs_inode *ni = ntfs_i(dir);      int err; +    if (unlikely(ntfs3_forced_shutdown(dir->i_sb))) +        return -EIO; +      ni_lock_dir(ni);      err = ntfs_unlink_inode(dir, dentry); @@ -199,6 +202,9 @@ static int ntfs_symlink(struct mnt_idmap *idmap, struct inode *dir,      u32 size = strlen(symname);      struct inode *inode; +    if (unlikely(ntfs3_forced_shutdown(dir->i_sb))) +        return -EIO; +      inode = ntfs_create_inode(idmap, dir, dentry, NULL, S_IFLNK | 0777, 0,                    symname, size, NULL); @@ -227,6 +233,9 @@ static int ntfs_rmdir(struct inode *dir, struct dentry *dentry)      struct ntfs_inode *ni = ntfs_i(dir);      int err; +    if (unlikely(ntfs3_forced_shutdown(dir->i_sb))) +        return -EIO; +      ni_lock_dir(ni);      err = ntfs_unlink_inode(dir, dentry); @@ -264,6 +273,9 @@ static int ntfs_rename(struct mnt_idmap *idmap, struct inode *dir,                1024);      static_assert(PATH_MAX >= 4 * 1024); +    if (unlikely(ntfs3_forced_shutdown(sb))) +        return -EIO; +      if (flags & ~RENAME_NOREPLACE)          return -EINVAL; diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h index f6706143d14b..d40bc7669ae5 100644 --- a/fs/ntfs3/ntfs_fs.h +++ b/fs/ntfs3/ntfs_fs.h @@ -61,6 +61,8 @@ enum utf16_endian;  /* sbi->flags */  #define NTFS_FLAGS_NODISCARD        0x00000001 +/* ntfs in shutdown state. */ +#define NTFS_FLAGS_SHUTDOWN        0x00000002  /* Set when LogFile is replaying. */  #define NTFS_FLAGS_LOG_REPLAYING    0x00000008  /* Set when we changed first MFT's which copy must be updated in $MftMirr. */ @@ -226,7 +228,7 @@ struct ntfs_sb_info {      u64 maxbytes; // Maximum size for normal files.      u64 maxbytes_sparse; // Maximum size for sparse file. -    u32 flags; // See NTFS_FLAGS_XXX. +    unsigned long flags; // See NTFS_FLAGS_      CLST zone_max; // Maximum MFT zone length in clusters      CLST bad_clusters; // The count of marked bad clusters. @@ -999,6 +1001,11 @@ static inline struct ntfs_sb_info *ntfs_sb(struct super_block *sb)      return sb->s_fs_info;  } +static inline bool ntfs3_forced_shutdown(struct super_block *sb) +{ +    return test_bit(NTFS_FLAGS_SHUTDOWN, &ntfs_sb(sb)->flags); +} +  /*   * ntfs_up_cluster - Align up on cluster boundary.   */ diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 09d61c6c90aa..af8521a6ed95 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -714,6 +714,14 @@ static int ntfs_show_options(struct seq_file *m, struct dentry *root)      return 0;  } +/* + * ntfs_shutdown - super_operations::shutdown + */ +static void ntfs_shutdown(struct super_block *sb) +{ +    set_bit(NTFS_FLAGS_SHUTDOWN, &ntfs_sb(sb)->flags); +} +  /*   * ntfs_sync_fs - super_operations::sync_fs   */ @@ -724,6 +732,9 @@ static int ntfs_sync_fs(struct super_block *sb, int wait)      struct ntfs_inode *ni;      struct inode *inode; +    if (unlikely(ntfs3_forced_shutdown(sb))) +        return -EIO; +      ni = sbi->security.ni;      if (ni) {          inode = &ni->vfs_inode; @@ -763,6 +774,7 @@ static const struct super_operations ntfs_sops = {      .put_super = ntfs_put_super,      .statfs = ntfs_statfs,      .show_options = ntfs_show_options, +    .shutdown = ntfs_shutdown,      .sync_fs = ntfs_sync_fs,      .write_inode = ntfs3_write_inode,  }; diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c index 4274b6f31cfa..071356d096d8 100644 --- a/fs/ntfs3/xattr.c +++ b/fs/ntfs3/xattr.c @@ -744,6 +744,9 @@ static int ntfs_getxattr(const struct xattr_handler *handler, struct dentry *de,      int err;      struct ntfs_inode *ni = ntfs_i(inode); +    if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) +        return -EIO; +      /* Dispatch request. */      if (!strcmp(name, SYSTEM_DOS_ATTRIB)) { From patchwork Wed Dec 6 15:13:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481934 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="NCK6bfmA"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="cKTfILwv" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6FBC0B5; Wed, 6 Dec 2023 07:13:49 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 216141E1A; Wed, 6 Dec 2023 15:07:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875243; bh=CUZk88fabksVMQIwptkfOhP6XsgOcXbEpcc4odQSDSQ=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=NCK6bfmAVok0RLfrG2qNu60LQBlIyV8PnwhtGpjL8OHnbfVEi3NJ4VX370Q1e5hk3 HOzmdUxENLGFoCwvBzdk7CzHTnC0QkqbXH/Uig2v9kOtjc8kTdItbUuJFx9ZVhn1V6 awSW+hE0eS335PqIP4VtGv0WlMxfI8F7ZdrLM6YU= 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 64E4B2117; Wed, 6 Dec 2023 15:13:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875627; bh=CUZk88fabksVMQIwptkfOhP6XsgOcXbEpcc4odQSDSQ=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=cKTfILwvtBLLE19pwq14wyqj1avYe8W/4CiDi8l/6aJTt4VI1IVYevoAo22826ksJ ROfjf2aOvncNloeosyx2+MUuiP2wVYUZC88epJYNhDB5WBuYiKNKTKnqQBeu/gg51w R0UbWXrBWjm1M6WFpRGa90JZRnpvbf+JG4wMctg4= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:13:46 +0300 Message-ID: <6e9cc7e7-b29c-4d63-a73c-9aadd1589f18@paragon-software.com> Date: Wed, 6 Dec 2023 18:13:46 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 13/16] fs/ntfs3: ntfs3_forced_shutdown use int instead of bool Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/fsntfs.c  | 3 ++-  fs/ntfs3/ntfs_fs.h | 6 +++---  fs/ntfs3/super.c   | 2 +-  3 files changed, 6 insertions(+), 5 deletions(-)  /* diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c index fbfe21dbb425..350461d8cece 100644 --- a/fs/ntfs3/fsntfs.c +++ b/fs/ntfs3/fsntfs.c @@ -853,7 +853,8 @@ void ntfs_update_mftmirr(struct ntfs_sb_info *sbi, int wait)      /*       * sb can be NULL here. In this case sbi->flags should be 0 too.       */ -    if (!sb || !(sbi->flags & NTFS_FLAGS_MFTMIRR)) +    if (!sb || !(sbi->flags & NTFS_FLAGS_MFTMIRR) || +        unlikely(ntfs3_forced_shutdown(sb)))          return;      blocksize = sb->s_blocksize; diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h index d40bc7669ae5..7510875efef6 100644 --- a/fs/ntfs3/ntfs_fs.h +++ b/fs/ntfs3/ntfs_fs.h @@ -62,7 +62,7 @@ enum utf16_endian;  /* sbi->flags */  #define NTFS_FLAGS_NODISCARD        0x00000001  /* ntfs in shutdown state. */ -#define NTFS_FLAGS_SHUTDOWN        0x00000002 +#define NTFS_FLAGS_SHUTDOWN_BIT        0x00000002  /* == 4*/  /* Set when LogFile is replaying. */  #define NTFS_FLAGS_LOG_REPLAYING    0x00000008  /* Set when we changed first MFT's which copy must be updated in $MftMirr. */ @@ -1001,9 +1001,9 @@ static inline struct ntfs_sb_info *ntfs_sb(struct super_block *sb)      return sb->s_fs_info;  } -static inline bool ntfs3_forced_shutdown(struct super_block *sb) +static inline int ntfs3_forced_shutdown(struct super_block *sb)  { -    return test_bit(NTFS_FLAGS_SHUTDOWN, &ntfs_sb(sb)->flags); +    return test_bit(NTFS_FLAGS_SHUTDOWN_BIT, &ntfs_sb(sb)->flags);  }  /* diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index af8521a6ed95..65ef4b57411f 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -719,7 +719,7 @@ static int ntfs_show_options(struct seq_file *m, struct dentry *root)   */  static void ntfs_shutdown(struct super_block *sb)  { -    set_bit(NTFS_FLAGS_SHUTDOWN, &ntfs_sb(sb)->flags); +    set_bit(NTFS_FLAGS_SHUTDOWN_BIT, &ntfs_sb(sb)->flags);  } From patchwork Wed Dec 6 15:14:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481935 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="kN9J13WY" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 31CCDD50; Wed, 6 Dec 2023 07:14:07 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 6E1C01E1A; Wed, 6 Dec 2023 15:07:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875261; bh=/4I47So9TsCFHrAhRoQV8zzXSeAqCb/39siaVWL+gX0=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=kN9J13WYKnTwM0/sOLGjGLDz5CC0z/k/AWpQjtIuyS78sqffL6F87LGiEKPYmwkL7 XsjaUGyF0vm3bNzJtlU1jEwm+8I+J8WbK9Qb1LZvwz2k8okN3eA6tNWNsW0vDDrybY zpr03m2YeMhs+FawFYMsmtMwLO398U/xikV1iWiY= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:14:05 +0300 Message-ID: <9cfeb726-0b6a-48bc-a640-435bcb6e359a@paragon-software.com> Date: Wed, 6 Dec 2023 18:14:05 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 14/16] fs/ntfs3: Add and fix comments Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/dir.c     | 4 +++-  fs/ntfs3/fsntfs.c  | 2 +-  fs/ntfs3/ntfs.h    | 2 +-  fs/ntfs3/ntfs_fs.h | 2 +-  4 files changed, 6 insertions(+), 4 deletions(-)  void ntfs_get_wsl_perm(struct inode *inode); diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c index 726122ecd39b..9f6dd445eb04 100644 --- a/fs/ntfs3/dir.c +++ b/fs/ntfs3/dir.c @@ -536,8 +536,10 @@ static int ntfs_dir_count(struct inode *dir, bool *is_empty, size_t *dirs,              e = Add2Ptr(hdr, off);              e_size = le16_to_cpu(e->size);              if (e_size < sizeof(struct NTFS_DE) || -                off + e_size > end) +                off + e_size > end) { +                /* Looks like corruption. */                  break; +            }              if (de_is_last(e))                  break; diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c index 350461d8cece..321978019407 100644 --- a/fs/ntfs3/fsntfs.c +++ b/fs/ntfs3/fsntfs.c @@ -2129,8 +2129,8 @@ int ntfs_insert_security(struct ntfs_sb_info *sbi,              if (le32_to_cpu(d_security->size) == new_sec_size &&                  d_security->key.hash == hash_key.hash &&                  !memcmp(d_security + 1, sd, size_sd)) { -                *security_id = d_security->key.sec_id;                  /* Such security already exists. */ +                *security_id = d_security->key.sec_id;                  err = 0;                  goto out;              } diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h index 13e96fc63dae..c8981429c721 100644 --- a/fs/ntfs3/ntfs.h +++ b/fs/ntfs3/ntfs.h @@ -523,7 +523,7 @@ struct ATTR_LIST_ENTRY {      __le64 vcn;        // 0x08: Starting VCN of this attribute.      struct MFT_REF ref;    // 0x10: MFT record number with attribute.      __le16 id;        // 0x18: struct ATTRIB ID. -    __le16 name[];        // 0x1A: Just to align. To get real name can use name_off. +    __le16 name[];        // 0x1A: To get real name use name_off.  }; // sizeof(0x20) diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h index 7510875efef6..abbc7182554a 100644 --- a/fs/ntfs3/ntfs_fs.h +++ b/fs/ntfs3/ntfs_fs.h @@ -874,7 +874,7 @@ int ntfs_init_acl(struct mnt_idmap *idmap, struct inode *inode,  int ntfs_acl_chmod(struct mnt_idmap *idmap, struct dentry *dentry);  ssize_t ntfs_listxattr(struct dentry *dentry, char *buffer, size_t size); -extern const struct xattr_handler * const ntfs_xattr_handlers[]; +extern const struct xattr_handler *const ntfs_xattr_handlers[];  int ntfs_save_wsl_perm(struct inode *inode, __le16 *ea_size); From patchwork Wed Dec 6 15:14:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481938 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="uB7SJ5ZV"; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="HwerjDqS" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 08B67112; Wed, 6 Dec 2023 07:14:26 -0800 (PST) Received: from relayfre-01.paragon-software.com (unknown [172.30.72.12]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id E6D181D0B; Wed, 6 Dec 2023 15:08:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875280; bh=W/TNdgmKDqNDYIi7mUSo5ayyxeI6Wi55D54a4MJS5O8=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=uB7SJ5ZV34Sc6PLOrZBUBpCENFmPGqlFtRZvqJoH9vKlKM7YeJH4IMKAHPy9I9iEa ejo/mhQFbObUfY7QSS46h7IJ+xwplvgdoZFTxSFtWgAmYnNnVdXzTJPHQhaaWOBNo5 SWLDXhH3caMbQcpe06yX7DO97jt+0K3UDKKUucwE= 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 32A922117; Wed, 6 Dec 2023 15:14:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875665; bh=W/TNdgmKDqNDYIi7mUSo5ayyxeI6Wi55D54a4MJS5O8=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=HwerjDqSLEHZuqFn+zzPuEhCBWA0uFcD4nADai1942YJ983cNo0j/pryidiex2rWP H0uuBaQ306w3AFnBoJcJRFcIIK8vQDQuWbmPIeusCe3s3FXdqFM+hDeHsYQD0L0g+x O29n04DNf2rqk9XpwAgCpKfKdguOdnw9nTpi3aCo= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:14:24 +0300 Message-ID: Date: Wed, 6 Dec 2023 18:14:24 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 15/16] fs/ntfs3: Add NULL ptr dereference checking at the end of attr_allocate_frame() Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) It is preferable to exit through the out: label because internal debugging functions are located there. Signed-off-by: Konstantin Komarov ---  fs/ntfs3/attrib.c | 20 ++++++++++++--------  1 file changed, 12 insertions(+), 8 deletions(-)              le = le_b; @@ -1825,13 +1827,15 @@ int attr_allocate_frame(struct ntfs_inode *ni, CLST frame, size_t compr_size,  ok:      run_truncate_around(run, vcn);  out: -    if (new_valid > data_size) -        new_valid = data_size; +    if (attr_b) { +        if (new_valid > data_size) +            new_valid = data_size; -    valid_size = le64_to_cpu(attr_b->nres.valid_size); -    if (new_valid != valid_size) { -        attr_b->nres.valid_size = cpu_to_le64(valid_size); -        mi_b->dirty = true; +        valid_size = le64_to_cpu(attr_b->nres.valid_size); +        if (new_valid != valid_size) { +            attr_b->nres.valid_size = cpu_to_le64(valid_size); +            mi_b->dirty = true; +        }      }      return err; diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c index 4b78b669a3bd..646e2dad1b75 100644 --- a/fs/ntfs3/attrib.c +++ b/fs/ntfs3/attrib.c @@ -1743,8 +1743,10 @@ int attr_allocate_frame(struct ntfs_inode *ni, CLST frame, size_t compr_size,              le_b = NULL;              attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL,                            0, NULL, &mi_b); -            if (!attr_b) -                return -ENOENT; +            if (!attr_b) { +                err = -ENOENT; +                goto out; +            }              attr = attr_b; From patchwork Wed Dec 6 15:14:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Konstantin Komarov X-Patchwork-Id: 13481939 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=paragon-software.com header.i=@paragon-software.com header.b="b9ns4krg" Received: from relayaws-01.paragon-software.com (relayaws-01.paragon-software.com [35.157.23.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07BE51707; Wed, 6 Dec 2023 07:14:48 -0800 (PST) Received: from dlg2.mail.paragon-software.com (vdlg-exch-02.paragon-software.com [172.30.1.105]) by relayaws-01.paragon-software.com (Postfix) with ESMTPS id 860301D0B; Wed, 6 Dec 2023 15:08:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paragon-software.com; s=mail; t=1701875302; bh=nuQ7oyEDVSuk9DOyuMG/cLB7BA1E7v6X/Af9iud7LTk=; h=Date:Subject:From:To:CC:References:In-Reply-To; b=b9ns4krgsqsEKFEpkwSUxPt90w7J8llYZPi9MyON8+FjGR7kqRSI3r83ZLpiL8lua ljtibIPMsXBzU9i7KmTZE+TYjrZbhXEUlTTPX1RmZnUNPjnPkSSmcbBBJ+/dCgQp0e QeHhsteLuAYXMv33bEAa0QG5/Ze27T+lmW+bHQoM= Received: from [172.16.192.129] (192.168.211.144) 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, 6 Dec 2023 18:14:46 +0300 Message-ID: <8babdfbc-5be7-428d-9c23-ca8ed66f7ec5@paragon-software.com> Date: Wed, 6 Dec 2023 18:14:46 +0300 Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 16/16] fs/ntfs3: Fix c/mtime typo Content-Language: en-US From: Konstantin Komarovc To: CC: , References: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com> X-ClientProxiedBy: vobn-exch-01.paragon-software.com (172.30.72.13) To vdlg-exch-02.paragon-software.com (172.30.1.105) Signed-off-by: Konstantin Komarov ---  fs/ntfs3/frecord.c | 2 +-  1 file changed, 1 insertion(+), 1 deletion(-)              std->c_time = dup.c_time; diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c index 8744ba36d422..6ff4f70ba077 100644 --- a/fs/ntfs3/frecord.c +++ b/fs/ntfs3/frecord.c @@ -3291,7 +3291,7 @@ int ni_write_inode(struct inode *inode, int sync, const char *hint)              modified = true;          } -        ts = inode_get_mtime(inode); +        ts = inode_get_ctime(inode);          dup.c_time = kernel2nt(&ts);          if (std->c_time != dup.c_time) {