diff mbox series

[2/3] fs/ntfs3: Add hidedotfiles option

Message ID 1194d7b9-658f-b724-93d4-2f2b02b569ca@paragon-software.com (mailing list archive)
State New, archived
Headers show
Series fs/ntfs3: Refactoring and hidedotfiles option | expand

Commit Message

Konstantin Komarov Sept. 12, 2022, 4:40 p.m. UTC
With this option all files with filename[0] == '.'
will have FILE_ATTRIBUTE_HIDDEN attribute.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/inode.c   | 4 ++++
  fs/ntfs3/ntfs_fs.h | 1 +
  fs/ntfs3/super.c   | 5 +++++
  3 files changed, 10 insertions(+)

Comments

Daniel Pinto Oct. 3, 2022, 10:51 p.m. UTC | #1
Às 17:40 de 12/09/22, Konstantin Komarov escreveu:
> With this option all files with filename[0] == '.'
> will have FILE_ATTRIBUTE_HIDDEN attribute.
> 
> Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
> ---
>  fs/ntfs3/inode.c   | 4 ++++
>  fs/ntfs3/ntfs_fs.h | 1 +
>  fs/ntfs3/super.c   | 5 +++++
>  3 files changed, 10 insertions(+)
> 
> diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
> index 51363d4e8636..40b8565815a2 100644
> --- a/fs/ntfs3/inode.c
> +++ b/fs/ntfs3/inode.c
> @@ -1257,6 +1257,10 @@ 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 (sbi->options->hide_dot_files && name->name[0] == '.')
> +        fa |= FILE_ATTRIBUTE_HIDDEN;
> +
>      if (!(mode & 0222))
>          fa |= FILE_ATTRIBUTE_READONLY;
>  
> diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
> index 2c791222c4e2..cd680ada50ab 100644
> --- a/fs/ntfs3/ntfs_fs.h
> +++ b/fs/ntfs3/ntfs_fs.h
> @@ -97,6 +97,7 @@ struct ntfs_mount_options {
>      unsigned sparse : 1; /* Create sparse files. */
>      unsigned showmeta : 1; /* Show meta files. */
>      unsigned nohidden : 1; /* Do not show hidden files. */
> +    unsigned hide_dot_files : 1; /* Set hidden flag on dot files. */
>      unsigned force : 1; /* RW mount dirty volume. */
>      unsigned noacsrules : 1; /* Exclude acs rules. */
>      unsigned prealloc : 1; /* Preallocate space when file is growing. */
> diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
> index 86ff55133faf..067a0e9cf590 100644
> --- a/fs/ntfs3/super.c
> +++ b/fs/ntfs3/super.c
> @@ -247,6 +247,7 @@ enum Opt {
>      Opt_force,
>      Opt_sparse,
>      Opt_nohidden,
> +    Opt_hide_dot_files,
>      Opt_showmeta,
>      Opt_acl,
>      Opt_iocharset,
> @@ -266,6 +267,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("acl",            Opt_acl),
>      fsparam_flag_no("showmeta",        Opt_showmeta),
>      fsparam_flag_no("prealloc",        Opt_prealloc),
> @@ -357,6 +359,9 @@ static int ntfs_fs_parse_param(struct fs_context *fc,
>      case Opt_nohidden:
>          opts->nohidden = result.negated ? 1 : 0;
>          break;
> +    case Opt_hide_dot_files:
> +        opts->hide_dot_files = result.negated ? 1 : 0;

I believe the 0 and 1 should be switched here. With the code as it is, the behaviour is
the reverse of what is expected: the hidedotfiles mount option disables setting the hidden
attribute and the nohidedotfiles enables it.

> +        break;
>      case Opt_acl:
>          if (!result.negated)
>  #ifdef CONFIG_NTFS3_FS_POSIX_ACL

Hello,

I have found a bug in your patch. I explained it above. Also, the patch will only set the 
hidden attribute when a new file or directory is created. It will not set it (or unset it)
when files or directories are moved or renamed.

Best regards,
Daniel Pinto
diff mbox series

Patch

diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
index 51363d4e8636..40b8565815a2 100644
--- a/fs/ntfs3/inode.c
+++ b/fs/ntfs3/inode.c
@@ -1257,6 +1257,10 @@  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 (sbi->options->hide_dot_files && name->name[0] == '.')
+		fa |= FILE_ATTRIBUTE_HIDDEN;
+
  	if (!(mode & 0222))
  		fa |= FILE_ATTRIBUTE_READONLY;
  
diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
index 2c791222c4e2..cd680ada50ab 100644
--- a/fs/ntfs3/ntfs_fs.h
+++ b/fs/ntfs3/ntfs_fs.h
@@ -97,6 +97,7 @@  struct ntfs_mount_options {
  	unsigned sparse : 1; /* Create sparse files. */
  	unsigned showmeta : 1; /* Show meta files. */
  	unsigned nohidden : 1; /* Do not show hidden files. */
+	unsigned hide_dot_files : 1; /* Set hidden flag on dot files. */
  	unsigned force : 1; /* RW mount dirty volume. */
  	unsigned noacsrules : 1; /* Exclude acs rules. */
  	unsigned prealloc : 1; /* Preallocate space when file is growing. */
diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 86ff55133faf..067a0e9cf590 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -247,6 +247,7 @@  enum Opt {
  	Opt_force,
  	Opt_sparse,
  	Opt_nohidden,
+	Opt_hide_dot_files,
  	Opt_showmeta,
  	Opt_acl,
  	Opt_iocharset,
@@ -266,6 +267,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("acl",			Opt_acl),
  	fsparam_flag_no("showmeta",		Opt_showmeta),
  	fsparam_flag_no("prealloc",		Opt_prealloc),
@@ -357,6 +359,9 @@  static int ntfs_fs_parse_param(struct fs_context *fc,
  	case Opt_nohidden:
  		opts->nohidden = result.negated ? 1 : 0;
  		break;
+	case Opt_hide_dot_files:
+		opts->hide_dot_files = result.negated ? 1 : 0;
+		break;
  	case Opt_acl:
  		if (!result.negated)
  #ifdef CONFIG_NTFS3_FS_POSIX_ACL