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
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
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
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
À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