2022-09-12 16:44:40

by Konstantin Komarov

[permalink] [raw]
Subject: [PATCH 0/3] fs/ntfs3: Refactoring and hidedotfiles option

Added some info about CONFIG_NTFS3_64BIT_CLUSTER and
hidedotfiles option

Konstantin Komarov (3):
fs/ntfs3: Add comments about cluster size
fs/ntfs3: Add hidedotfiles option
fs/ntfs3: Change destroy_inode to free_inode

fs/ntfs3/frecord.c | 2 +-
fs/ntfs3/inode.c | 4 ++++
fs/ntfs3/ntfs_fs.h | 1 +
fs/ntfs3/record.c | 4 ++++
fs/ntfs3/super.c | 52 ++++++++++++++++++++++++++++++++--------------
5 files changed, 46 insertions(+), 17 deletions(-)

--
2.37.0


2022-09-12 16:45:29

by Konstantin Komarov

[permalink] [raw]
Subject: [PATCH 2/3] fs/ntfs3: Add hidedotfiles option

With this option all files with filename[0] == '.'
will have FILE_ATTRIBUTE_HIDDEN attribute.

Signed-off-by: Konstantin Komarov <[email protected]>
---
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;
+ break;
case Opt_acl:
if (!result.negated)
#ifdef CONFIG_NTFS3_FS_POSIX_ACL
--
2.37.0


2022-09-12 16:47:54

by Konstantin Komarov

[permalink] [raw]
Subject: [PATCH 1/3] fs/ntfs3: Add comments about cluster size

This commit adds additional info about CONFIG_NTFS3_64BIT_CLUSTER

Signed-off-by: Konstantin Komarov <[email protected]>
---
fs/ntfs3/frecord.c | 2 +-
fs/ntfs3/record.c | 4 ++++
fs/ntfs3/super.c | 24 +++++++++++++++++++++++++++
3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 381a38a06ec2..b752d83cf460 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -557,7 +557,7 @@ static int ni_repack(struct ntfs_inode *ni)
}

if (!mi_p) {
- /* Do not try if not enogh free space. */
+ /* Do not try if not enough free space. */
if (le32_to_cpu(mi->mrec->used) + 8 >= rs)
continue;

diff --git a/fs/ntfs3/record.c b/fs/ntfs3/record.c
index 7d2fac5ee215..c8741cfa421f 100644
--- a/fs/ntfs3/record.c
+++ b/fs/ntfs3/record.c
@@ -537,6 +537,10 @@ bool mi_resize_attr(struct mft_inode *mi, struct ATTRIB *attr, int bytes)
return true;
}

+/*
+ * Pack runs in MFT record.
+ * If failed record is not changed.
+ */
int mi_pack_runs(struct mft_inode *mi, struct ATTRIB *attr,
struct runs_tree *run, CLST len)
{
diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 47012c9bf505..86ff55133faf 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -21,6 +21,30 @@
* https://docs.microsoft.com/en-us/windows/wsl/file-permissions
* It stores uid/gid/mode/dev in xattr
*
+ * ntfs allows up to 2^64 clusters per volume.
+ * It means you should use 64 bits lcn to operate with ntfs.
+ * Implementation of ntfs.sys uses only 32 bits lcn.
+ * Default ntfs3 uses 32 bits lcn too.
+ * ntfs3 built with CONFIG_NTFS3_64BIT_CLUSTER (ntfs3_64) uses 64 bits per lcn.
+ *
+ *
+ * ntfs limits, cluster size is 4K (2^12)
+ * -----------------------------------------------------------------------------
+ * | Volume size | Clusters | ntfs.sys | ntfs3 | ntfs3_64 | mkntfs | chkdsk |
+ * -----------------------------------------------------------------------------
+ * | < 16T, 2^44 | < 2^32 | yes | yes | yes | yes | yes |
+ * | > 16T, 2^44 | > 2^32 | no | no | yes | yes | yes |
+ * ----------------------------------------------------------|------------------
+ *
+ * To mount large volumes as ntfs one should use large cluster size (up to 2M)
+ * The maximum volume size in this case is 2^32 * 2^21 = 2^53 = 8P
+ *
+ * ntfs limits, cluster size is 2M (2^31)
+ * -----------------------------------------------------------------------------
+ * | < 8P, 2^54 | < 2^32 | yes | yes | yes | yes | yes |
+ * | > 8P, 2^54 | > 2^32 | no | no | yes | yes | yes |
+ * ----------------------------------------------------------|------------------
+ *
*/

#include <linux/blkdev.h>
--
2.37.0


2022-09-12 17:24:36

by Konstantin Komarov

[permalink] [raw]
Subject: [PATCH 3/3] fs/ntfs3: Change destroy_inode to free_inode

Many filesystems already use free_inode callback,
so we will use it too from now on.

Signed-off-by: Konstantin Komarov <[email protected]>
---
fs/ntfs3/super.c | 20 ++++----------------
1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
index 067a0e9cf590..744c1f15ba2a 100644
--- a/fs/ntfs3/super.c
+++ b/fs/ntfs3/super.c
@@ -438,27 +438,18 @@ static struct inode *ntfs_alloc_inode(struct super_block *sb)
return NULL;

memset(ni, 0, offsetof(struct ntfs_inode, vfs_inode));
-
mutex_init(&ni->ni_lock);
-
return &ni->vfs_inode;
}

-static void ntfs_i_callback(struct rcu_head *head)
+static void ntfs_free_inode(struct inode *inode)
{
- struct inode *inode = container_of(head, struct inode, i_rcu);
struct ntfs_inode *ni = ntfs_i(inode);

mutex_destroy(&ni->ni_lock);
-
kmem_cache_free(ntfs_inode_cachep, ni);
}

-static void ntfs_destroy_inode(struct inode *inode)
-{
- call_rcu(&inode->i_rcu, ntfs_i_callback);
-}
-
static void init_once(void *foo)
{
struct ntfs_inode *ni = foo;
@@ -624,7 +615,7 @@ static int ntfs_sync_fs(struct super_block *sb, int wait)

static const struct super_operations ntfs_sops = {
.alloc_inode = ntfs_alloc_inode,
- .destroy_inode = ntfs_destroy_inode,
+ .free_inode = ntfs_free_inode,
.evict_inode = ntfs_evict_inode,
.put_super = ntfs_put_super,
.statfs = ntfs_statfs,
@@ -1520,11 +1511,8 @@ static int __init init_ntfs_fs(void)

static void __exit exit_ntfs_fs(void)
{
- if (ntfs_inode_cachep) {
- rcu_barrier();
- kmem_cache_destroy(ntfs_inode_cachep);
- }
-
+ rcu_barrier();
+ kmem_cache_destroy(ntfs_inode_cachep);
unregister_filesystem(&ntfs_fs_type);
ntfs3_exit_bitmap();
}
--
2.37.0


2022-10-03 23:22:46

by Daniel Pinto

[permalink] [raw]
Subject: Re: [PATCH 2/3] fs/ntfs3: Add hidedotfiles option



À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 <[email protected]>
> ---
>  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