2022-10-10 11:33:37

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 0/5] fs/ntfs3: Fix and rename hidedotfiles mount option

Changes v1->v2:
- Add documentation for hidedotfiles mount option.

The current implementation of the hidedotfiles has some problems, namely:
- there is a bug where enabling it actually disables it and vice versa
- it only works when creating files, not when moving or renaming them
- it is not listed in the enabled options list by the mount command
- its name differs from the equivalent hide_dot_files mount option
used by NTFS-3G, making it incompatible with it for no reason

This series of patches tries to fix those problems.

Daniel Pinto (5):
fs/ntfs3: fix hidedotfiles mount option by reversing behaviour
fs/ntfs3: make hidedotfiles mount option work when renaming files
fs/ntfs3: add hidedotfiles to the list of enabled mount options
fs/ntfs3: document the hidedotfiles mount option
fs/ntfs3: rename hidedotfiles mount option to hide_dot_files

Documentation/filesystems/ntfs3.rst | 6 ++++++
fs/ntfs3/frecord.c | 9 +++++++++
fs/ntfs3/inode.c | 2 +-
fs/ntfs3/super.c | 6 ++++--
4 files changed, 20 insertions(+), 3 deletions(-)


2022-10-10 11:51:41

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 2/5] fs/ntfs3: make hidedotfiles mount option work when renaming files

Currently, the hidedotfiles mount option only has an effect when
creating new files. Removing or adding the starting dot when moving
or renaming files does not update the hidden attribute.

Make hidedotfiles also set or uset the hidden attribute when a file
gains or loses its starting dot by being moved or renamed.

Signed-off-by: Daniel Pinto <[email protected]>
---
fs/ntfs3/frecord.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 70a80f9412f7..41a20d71562a 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -3018,6 +3018,15 @@ int ni_add_name(struct ntfs_inode *dir_ni, struct ntfs_inode *ni,
struct ATTR_FILE_NAME *de_name = (struct ATTR_FILE_NAME *)(de + 1);
u16 de_key_size = le16_to_cpu(de->key_size);

+ /* If option "hidedotfiles" then set hidden attribute for dot files. */
+ if (ni->mi.sbi->options->hide_dot_files) {
+ if (de_name->name_len > 0 &&
+ le16_to_cpu(de_name->name[0]) == '.')
+ ni->std_fa |= FILE_ATTRIBUTE_HIDDEN;
+ else
+ ni->std_fa &= ~FILE_ATTRIBUTE_HIDDEN;
+ }
+
mi_get_ref(&ni->mi, &de->ref);
mi_get_ref(&dir_ni->mi, &de_name->home);

2022-10-10 11:53:25

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 4/5] fs/ntfs3: document the hidedotfiles mount option

Add documentation for the hidedotfiles mount option.

Signed-off-by: Daniel Pinto <[email protected]>
---
Documentation/filesystems/ntfs3.rst | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/Documentation/filesystems/ntfs3.rst b/Documentation/filesystems/ntfs3.rst
index d67ccd22c63b..fa03165f2310 100644
--- a/Documentation/filesystems/ntfs3.rst
+++ b/Documentation/filesystems/ntfs3.rst
@@ -75,6 +75,12 @@ this table marked with no it means default is without **no**.
- Files with the Windows-specific SYSTEM (FILE_ATTRIBUTE_SYSTEM) attribute
will be marked as system immutable files.

+ * - hidedotfiles
+ - Updates the Windows-specific HIDDEN (FILE_ATTRIBUTE_HIDDEN) attribute
+ when creating and moving or renaming files. Files whose names start
+ with a dot will have the HIDDEN attribute set and files whose names
+ do not start with a dot will have it unset.
+
* - discard
- Enable support of the TRIM command for improved performance on delete
operations, which is recommended for use with the solid-state drives

2022-10-10 11:53:42

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 3/5] fs/ntfs3: add hidedotfiles to the list of enabled mount options

Currently, the ntfs3 driver does return the hidedotfiles mount
option in the list of enabled mount options. This can confuse
users who may doubt they enabled the option when not seeing in
the list provided by the mount command.

Add hidedotfiles mount option to the list of enabled options
provided by the mount command when it is enabled.

Signed-off-by: Daniel Pinto <[email protected]>
---
fs/ntfs3/super.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index c6fd2afde172..d796541e2a67 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -561,6 +561,8 @@ static int ntfs_show_options(struct seq_file *m, struct dentry *root)
seq_puts(m, ",showmeta");
if (opts->nohidden)
seq_puts(m, ",nohidden");
+ if (opts->hide_dot_files)
+ seq_puts(m, ",hidedotfiles");
if (opts->force)
seq_puts(m, ",force");
if (opts->noacsrules)

2022-10-10 12:20:38

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 1/5] fs/ntfs3: fix hidedotfiles mount option by reversing behaviour

Currently, the hidedotfiles mount option is behaving in the reverse
way of what would be expected: enabling it disables setting the
hidden attribute on files or directories with names starting with a
dot and disabling it enables the setting.

Reverse the behaviour of the hidedotfiles mount option so it matches
what is expected.

Signed-off-by: Daniel Pinto <[email protected]>
---
fs/ntfs3/super.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 1e2c04e48f98..c6fd2afde172 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -359,7 +359,7 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
opts->nohidden = result.negated ? 1 : 0;
break;
case Opt_hide_dot_files:
- opts->hide_dot_files = result.negated ? 1 : 0;
+ opts->hide_dot_files = result.negated ? 0 : 1;
break;
case Opt_acl:
if (!result.negated)

2022-10-10 12:46:12

by Daniel Pinto

[permalink] [raw]
Subject: [PATCH v2 5/5] fs/ntfs3: rename hidedotfiles mount option to hide_dot_files

The hidedotfiles mount option provides the same functionality as
the NTFS-3G hide_dot_files mount option. As such, it should be
named the same for compatibility with NTGS-3G.

Rename the hidedotfiles to hide_dot_files for compatbility with
NTFS-3G.

Signed-off-by: Daniel Pinto <[email protected]>
---
Documentation/filesystems/ntfs3.rst | 2 +-
fs/ntfs3/frecord.c | 2 +-
fs/ntfs3/inode.c | 2 +-
fs/ntfs3/super.c | 4 ++--
4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Documentation/filesystems/ntfs3.rst b/Documentation/filesystems/ntfs3.rst
index fa03165f2310..4c6eb9fe9bea 100644
--- a/Documentation/filesystems/ntfs3.rst
+++ b/Documentation/filesystems/ntfs3.rst
@@ -75,7 +75,7 @@ this table marked with no it means default is without **no**.
- Files with the Windows-specific SYSTEM (FILE_ATTRIBUTE_SYSTEM) attribute
will be marked as system immutable files.

- * - hidedotfiles
+ * - hide_dot_files
- Updates the Windows-specific HIDDEN (FILE_ATTRIBUTE_HIDDEN) attribute
when creating and moving or renaming files. Files whose names start
with a dot will have the HIDDEN attribute set and files whose names
diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 41a20d71562a..552dbc5b80b1 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -3018,7 +3018,7 @@ int ni_add_name(struct ntfs_inode *dir_ni, struct ntfs_inode *ni,
struct ATTR_FILE_NAME *de_name = (struct ATTR_FILE_NAME *)(de + 1);
u16 de_key_size = le16_to_cpu(de->key_size);

- /* If option "hidedotfiles" then set hidden attribute for dot files. */
+ /* If option "hide_dot_files" then set hidden attribute for dot files. */
if (ni->mi.sbi->options->hide_dot_files) {
if (de_name->name_len > 0 &&
le16_to_cpu(de_name->name[0]) == '.')
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index e9cf00d14733..7ce2bb7646db 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -1272,7 +1272,7 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
fa = FILE_ATTRIBUTE_ARCHIVE;
}

- /* If option "hidedotfiles" then set hidden attribute for dot files. */
+ /* If option "hide_dot_files" then set hidden attribute for dot files. */
if (sbi->options->hide_dot_files && name->name[0] == '.')
fa |= FILE_ATTRIBUTE_HIDDEN;

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index d796541e2a67..af67756998df 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -268,7 +268,7 @@ static const struct fs_parameter_spec ntfs_fs_parameters[] = {
fsparam_flag_no("force", Opt_force),
fsparam_flag_no("sparse", Opt_sparse),
fsparam_flag_no("hidden", Opt_nohidden),
- fsparam_flag_no("hidedotfiles", Opt_hide_dot_files),
+ fsparam_flag_no("hide_dot_files", Opt_hide_dot_files),
fsparam_flag_no("acl", Opt_acl),
fsparam_flag_no("showmeta", Opt_showmeta),
fsparam_flag_no("prealloc", Opt_prealloc),
@@ -562,7 +562,7 @@ static int ntfs_show_options(struct seq_file *m, struct dentry *root)
if (opts->nohidden)
seq_puts(m, ",nohidden");
if (opts->hide_dot_files)
- seq_puts(m, ",hidedotfiles");
+ seq_puts(m, ",hide_dot_files");
if (opts->force)
seq_puts(m, ",force");
if (opts->noacsrules)

2022-11-12 18:39:35

by Konstantin Komarov

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] fs/ntfs3: Fix and rename hidedotfiles mount option



On 10/10/22 14:27, Daniel Pinto wrote:
> Changes v1->v2:
> - Add documentation for hidedotfiles mount option.
>
> The current implementation of the hidedotfiles has some problems, namely:
> - there is a bug where enabling it actually disables it and vice versa
> - it only works when creating files, not when moving or renaming them
> - it is not listed in the enabled options list by the mount command
> - its name differs from the equivalent hide_dot_files mount option
> used by NTFS-3G, making it incompatible with it for no reason
>
> This series of patches tries to fix those problems.
>
> Daniel Pinto (5):
> fs/ntfs3: fix hidedotfiles mount option by reversing behaviour
> fs/ntfs3: make hidedotfiles mount option work when renaming files
> fs/ntfs3: add hidedotfiles to the list of enabled mount options
> fs/ntfs3: document the hidedotfiles mount option
> fs/ntfs3: rename hidedotfiles mount option to hide_dot_files
>
> Documentation/filesystems/ntfs3.rst | 6 ++++++
> fs/ntfs3/frecord.c | 9 +++++++++
> fs/ntfs3/inode.c | 2 +-
> fs/ntfs3/super.c | 6 ++++--
> 4 files changed, 20 insertions(+), 3 deletions(-)

Good catch with differences between NTFS-3G and ntfs3.
Applied, thanks!