Re: [REGRESSION] ntfs3: existing files/dirs with ':' in their name became inaccessible in 7.3 (ads on by default)

From: Clément Smagghe

Date: Sat Nov 14 2026 - 10:43:52 EST


On 11/14/26 14:11, Thorsten Leemhuis wrote:
> Thx for the reports. This sounds a lot like a problem Hungyu Lin is
> trying to fix with these patches:
>
> [PATCH] fs/ntfs3: preserve colons in symlink targets
> https://lore.kernel.org/all/20261029203457.59990-1-dennylin0707@xxxxxxxxx/
>
> [PATCH] fs/ntfs3: preserve colons in volume labels
> https://lore.kernel.org/all/20261029225856.1173-1-dennylin0707@xxxxxxxxx/
>
> Please look into those -- and if your's is a different problem, please
> report back.
>
> Ciao, Thorsten

Thanks, Thorsten. I looked at both patches. They share the same root
cause as my report (ntfs_nls_to_utf16() splitting names at ':' since
be310476e886), but they fix different call sites and do not cover my
case, so I believe this is a separate problem.

- "preserve colons in symlink targets" adds a parse_ads argument to
ntfs_nls_to_utf16() and passes false only from
ntfs_create_reparse_buffer(). All other callers explicitly keep
parse_ads = true, in particular ntfs_lookup(), fill_name_de(),
ntfs_d_hash() and ntfs_d_compare(). The commit message even says
"Keep parsing enabled for the other callers to preserve their
existing behavior."

- "preserve colons in volume labels" only changes ntfs_set_label()
in fsntfs.c.

My problem is in the lookup path: an existing directory entry whose
name contains an interior ':' (e.g. "Reverse: 1999") is returned by
readdir, but ntfs_lookup() converts the name with ADS parsing still
enabled, looks up the stream " 1999" of a non-existent file
"Reverse", and fails with ENOENT. With both patches applied this
path is unchanged, so stat/open/rename/unlink on such entries would
still fail. Only mounting with 'ads=0' restores access.

So I think the lookup case needs its own fix, e.g. one of:
- make 'ads' opt-in (default off), as before 7.3, or
- in ntfs_lookup() (and the dcache hash/compare helpers), first try
the full name as a regular directory entry and only fall back to
the file:stream interpretation if that fails;
plus accepting 'noads' like the other options, since today only
'ads=0' works.

I'm happy to test patches.

Thanks,
Clément Smagghe