All of lore.kernel.org
 help / color / mirror / Atom feed
From: Konstantin Komarovc <almaz.alexandrovich@paragon-software.com>
To: <ntfs3@lists.linux.dev>
Cc: <linux-kernel@vger.kernel.org>, <linux-fsdevel@vger.kernel.org>
Subject: [PATCH 02/16] fs/ntfs3: Modified fix directory element type detection
Date: Wed, 6 Dec 2023 18:09:45 +0300	[thread overview]
Message-ID: <c005f117-6c66-40d8-95d4-e6384cffbcbf@paragon-software.com> (raw)
In-Reply-To: <00fd1558-fda5-421b-be43-7de69e32cb4e@paragon-software.com>

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 <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/dir.c | 30 +++++++++++++++++++++++++-----
  1 file changed, 25 insertions(+), 5 deletions(-)

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);
+        }
+    }

      return !dir_emit(ctx, (s8 *)name, name_len, ino, dt_type);
  }
-- 
2.34.1


  parent reply	other threads:[~2023-12-06 15:09 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-06 15:08 [PATCH 00/16] fs/ntfs3: Bugfix and refactoring Konstantin Komarovc
2023-12-06 15:08 ` [PATCH 01/16] fs/ntfs3: Improve alternative boot processing Konstantin Komarovc
2023-12-06 15:09 ` Konstantin Komarovc [this message]
2023-12-06 15:10 ` [PATCH 03/16] fs/ntfs3: Improve ntfs_dir_count Konstantin Komarovc
2023-12-06 15:10 ` [PATCH 04/16] fs/ntfs3: Correct hard links updating when dealing with DOS neams Konstantin Komarovc
2023-12-06 15:11 ` [PATCH 05/16] fs/ntfs3: Print warning while fixing hard links count Konstantin Komarovc
2023-12-06 15:11 ` [PATCH 06/16] fs/ntfs3: Reduce stack usage Konstantin Komarovc
2023-12-06 15:12 ` [PATCH 07/16] fs/ntfs3: Fix multithreaded stress test Konstantin Komarovc
2023-12-06 15:12 ` [PATCH 08/16] fs/ntfs3: Fix detected field-spanning write (size 8) of single field "le->name" Konstantin Komarovc
2023-12-07  9:31   ` Geert Uytterhoeven
2023-12-06 15:12 ` [PATCH 09/16] fs/ntfs3: Correct use bh_read Konstantin Komarovc
2023-12-06 15:12 ` [PATCH 10/16] fs/ntfs3: Add file_modified Konstantin Komarovc
2023-12-06 15:13 ` [PATCH 11/16] fs/ntfs3: Drop suid and sgid bits as a part of fpunch Konstantin Komarovc
2023-12-06 15:13 ` [PATCH 12/16] fs/ntfs3: Implement super_operations::shutdown Konstantin Komarovc
2023-12-06 15:13 ` [PATCH 13/16] fs/ntfs3: ntfs3_forced_shutdown use int instead of bool Konstantin Komarovc
2023-12-06 15:14 ` [PATCH 14/16] fs/ntfs3: Add and fix comments Konstantin Komarovc
2023-12-06 15:14 ` [PATCH 15/16] fs/ntfs3: Add NULL ptr dereference checking at the end of attr_allocate_frame() Konstantin Komarovc
2023-12-06 15:14 ` [PATCH 16/16] fs/ntfs3: Fix c/mtime typo Konstantin Komarovc

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c005f117-6c66-40d8-95d4-e6384cffbcbf@paragon-software.com \
    --to=almaz.alexandrovich@paragon-software.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ntfs3@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.