Blame SOURCES/0036-fs-ntfs3-Convert-mount-options-to-pointer-in-sbi.patch

Kmods SIG 8b815c
From 564c97bdfa39c7d1f331841fb24da6e714693037 Mon Sep 17 00:00:00 2001
Kmods SIG 8b815c
From: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 8b815c
Date: Tue, 7 Sep 2021 18:35:51 +0300
Kmods SIG 8b815c
Subject: [Backport 564c97bdfa39] src: Convert mount options to pointer in
Kmods SIG 8b815c
 sbi
Kmods SIG 8b815c
Kmods SIG 8b815c
Use pointer to mount options. We want to do this because we will use new
Kmods SIG 8b815c
mount api which will benefit that we have spi and mount options in
Kmods SIG 8b815c
different allocations. When we remount we do not have to make whole new
Kmods SIG 8b815c
spi it is enough that we will allocate just mount options.
Kmods SIG 8b815c
Kmods SIG 8b815c
Please note that we can do example remount lot cleaner but things will
Kmods SIG 8b815c
change in next patch so this should be just functional.
Kmods SIG 8b815c
Kmods SIG 8b815c
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 8b815c
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 8b815c
---
Kmods SIG 8b815c
 src/attrib.c  |  2 +-
Kmods SIG 8b815c
 src/dir.c     |  8 ++++----
Kmods SIG 8b815c
 src/file.c    |  4 ++--
Kmods SIG 8b815c
 src/inode.c   | 12 ++++++------
Kmods SIG 8b815c
 src/ntfs_fs.h |  2 +-
Kmods SIG 8b815c
 src/super.c   | 31 +++++++++++++++++++------------
Kmods SIG 8b815c
 src/xattr.c   |  2 +-
Kmods SIG 8b815c
 7 files changed, 34 insertions(+), 27 deletions(-)
Kmods SIG 8b815c
Kmods SIG 8b815c
diff --git a/src/attrib.c b/src/attrib.c
Kmods SIG 8b815c
index 34c4cbf7e29bc49bdb3fa060fd2c235c3fb68536..b1055b284c60323168be99ce69b18e7dbd7bb969 100644
Kmods SIG 8b815c
--- a/src/attrib.c
Kmods SIG 8b815c
+++ b/src/attrib.c
Kmods SIG 8b815c
@@ -529,7 +529,7 @@ int attr_set_size(struct ntfs_inode *ni, enum ATTR_TYPE type,
Kmods SIG 8b815c
 		} else if (pre_alloc == -1) {
Kmods SIG 8b815c
 			pre_alloc = 0;
Kmods SIG 8b815c
 			if (type == ATTR_DATA && !name_len &&
Kmods SIG 8b815c
-			    sbi->options.prealloc) {
Kmods SIG 8b815c
+			    sbi->options->prealloc) {
Kmods SIG 8b815c
 				CLST new_alen2 = bytes_to_cluster(
Kmods SIG 8b815c
 					sbi, get_pre_allocated(new_size));
Kmods SIG 8b815c
 				pre_alloc = new_alen2 - new_alen;
Kmods SIG 8b815c
diff --git a/src/dir.c b/src/dir.c
Kmods SIG 8b815c
index 93f6d485564e0103e56ad417f184f1ace0926eea..40440df021eff2a95a87ff7a2af38345a7c40793 100644
Kmods SIG 8b815c
--- a/src/dir.c
Kmods SIG 8b815c
+++ b/src/dir.c
Kmods SIG 8b815c
@@ -24,7 +24,7 @@ int ntfs_utf16_to_nls(struct ntfs_sb_info *sbi, const struct le_str *uni,
Kmods SIG 8b815c
 	int ret, uni_len, warn;
Kmods SIG 8b815c
 	const __le16 *ip;
Kmods SIG 8b815c
 	u8 *op;
Kmods SIG 8b815c
-	struct nls_table *nls = sbi->options.nls;
Kmods SIG 8b815c
+	struct nls_table *nls = sbi->options->nls;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	static_assert(sizeof(wchar_t) == sizeof(__le16));
Kmods SIG 8b815c
 
Kmods SIG 8b815c
@@ -186,7 +186,7 @@ int ntfs_nls_to_utf16(struct ntfs_sb_info *sbi, const u8 *name, u32 name_len,
Kmods SIG 8b815c
 {
Kmods SIG 8b815c
 	int ret, slen;
Kmods SIG 8b815c
 	const u8 *end;
Kmods SIG 8b815c
-	struct nls_table *nls = sbi->options.nls;
Kmods SIG 8b815c
+	struct nls_table *nls = sbi->options->nls;
Kmods SIG 8b815c
 	u16 *uname = uni->name;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	static_assert(sizeof(wchar_t) == sizeof(u16));
Kmods SIG 8b815c
@@ -301,10 +301,10 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
Kmods SIG 8b815c
 		return 0;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* Skip meta files. Unless option to show metafiles is set. */
Kmods SIG 8b815c
-	if (!sbi->options.showmeta && ntfs_is_meta_file(sbi, ino))
Kmods SIG 8b815c
+	if (!sbi->options->showmeta && ntfs_is_meta_file(sbi, ino))
Kmods SIG 8b815c
 		return 0;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	if (sbi->options.nohidden && (fname->dup.fa & FILE_ATTRIBUTE_HIDDEN))
Kmods SIG 8b815c
+	if (sbi->options->nohidden && (fname->dup.fa & FILE_ATTRIBUTE_HIDDEN))
Kmods SIG 8b815c
 		return 0;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	name_len = ntfs_utf16_to_nls(sbi, (struct le_str *)&fname->name_len,
Kmods SIG 8b815c
diff --git a/src/file.c b/src/file.c
Kmods SIG 8b815c
index 424450e77ad52ae550e8de444dc393411d97cde6..fef57141b161747101d6898b8da774a372de5cbf 100644
Kmods SIG 8b815c
--- a/src/file.c
Kmods SIG 8b815c
+++ b/src/file.c
Kmods SIG 8b815c
@@ -737,7 +737,7 @@ int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
Kmods SIG 8b815c
 	umode_t mode = inode->i_mode;
Kmods SIG 8b815c
 	int err;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	if (sbi->options.no_acs_rules) {
Kmods SIG 8b815c
+	if (sbi->options->no_acs_rules) {
Kmods SIG 8b815c
 		/* "No access rules" - Force any changes of time etc. */
Kmods SIG 8b815c
 		attr->ia_valid |= ATTR_FORCE;
Kmods SIG 8b815c
 		/* and disable for editing some attributes. */
Kmods SIG 8b815c
@@ -1185,7 +1185,7 @@ static int ntfs_file_release(struct inode *inode, struct file *file)
Kmods SIG 8b815c
 	int err = 0;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* If we are last writer on the inode, drop the block reservation. */
Kmods SIG 8b815c
-	if (sbi->options.prealloc && ((file->f_mode & FMODE_WRITE) &&
Kmods SIG 8b815c
+	if (sbi->options->prealloc && ((file->f_mode & FMODE_WRITE) &&
Kmods SIG 8b815c
 				      atomic_read(&inode->i_writecount) == 1)) {
Kmods SIG 8b815c
 		ni_lock(ni);
Kmods SIG 8b815c
 		down_write(&ni->file.run_lock);
Kmods SIG 8b815c
diff --git a/src/inode.c b/src/inode.c
Kmods SIG 8b815c
index db2a5a4c38e4d62abfb2c7ca16947cd766982b13..9f740fd301b24f2b1a67da0b78d091b3a3ae4705 100644
Kmods SIG 8b815c
--- a/src/inode.c
Kmods SIG 8b815c
+++ b/src/inode.c
Kmods SIG 8b815c
@@ -49,8 +49,8 @@ static struct inode *ntfs_read_mft(struct inode *inode,
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	inode->i_op = NULL;
Kmods SIG 8b815c
 	/* Setup 'uid' and 'gid' */
Kmods SIG 8b815c
-	inode->i_uid = sbi->options.fs_uid;
Kmods SIG 8b815c
-	inode->i_gid = sbi->options.fs_gid;
Kmods SIG 8b815c
+	inode->i_uid = sbi->options->fs_uid;
Kmods SIG 8b815c
+	inode->i_gid = sbi->options->fs_gid;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	err = mi_init(&ni->mi, sbi, ino);
Kmods SIG 8b815c
 	if (err)
Kmods SIG 8b815c
@@ -229,7 +229,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,
Kmods SIG 8b815c
 			t32 = le16_to_cpu(attr->nres.run_off);
Kmods SIG 8b815c
 		}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-		mode = S_IFREG | (0777 & sbi->options.fs_fmask_inv);
Kmods SIG 8b815c
+		mode = S_IFREG | (0777 & sbi->options->fs_fmask_inv);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 		if (!attr->non_res) {
Kmods SIG 8b815c
 			ni->ni_flags |= NI_FLAG_RESIDENT;
Kmods SIG 8b815c
@@ -272,7 +272,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,
Kmods SIG 8b815c
 			goto out;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 		mode = sb->s_root
Kmods SIG 8b815c
-			       ? (S_IFDIR | (0777 & sbi->options.fs_dmask_inv))
Kmods SIG 8b815c
+			       ? (S_IFDIR | (0777 & sbi->options->fs_dmask_inv))
Kmods SIG 8b815c
 			       : (S_IFDIR | 0777);
Kmods SIG 8b815c
 		goto next_attr;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
@@ -443,7 +443,7 @@ static struct inode *ntfs_read_mft(struct inode *inode,
Kmods SIG 8b815c
 		goto out;
Kmods SIG 8b815c
 	}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	if ((sbi->options.sys_immutable &&
Kmods SIG 8b815c
+	if ((sbi->options->sys_immutable &&
Kmods SIG 8b815c
 	     (std5->fa & FILE_ATTRIBUTE_SYSTEM)) &&
Kmods SIG 8b815c
 	    !S_ISFIFO(mode) && !S_ISSOCK(mode) && !S_ISLNK(mode)) {
Kmods SIG 8b815c
 		inode->i_flags |= S_IMMUTABLE;
Kmods SIG 8b815c
@@ -1244,7 +1244,7 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
Kmods SIG 8b815c
 		 *	}
Kmods SIG 8b815c
 		 */
Kmods SIG 8b815c
 	} else if (S_ISREG(mode)) {
Kmods SIG 8b815c
-		if (sbi->options.sparse) {
Kmods SIG 8b815c
+		if (sbi->options->sparse) {
Kmods SIG 8b815c
 			/* Sparsed regular file, cause option 'sparse'. */
Kmods SIG 8b815c
 			fa = FILE_ATTRIBUTE_SPARSE_FILE |
Kmods SIG 8b815c
 			     FILE_ATTRIBUTE_ARCHIVE;
Kmods SIG 8b815c
diff --git a/src/ntfs_fs.h b/src/ntfs_fs.h
Kmods SIG 8b815c
index 97e682ebcfb94dd1ad9677ed5ee82bb6a88401a5..98c90c399ee2f447f3ad5f0847c56ca7561f17fb 100644
Kmods SIG 8b815c
--- a/src/ntfs_fs.h
Kmods SIG 8b815c
+++ b/src/ntfs_fs.h
Kmods SIG 8b815c
@@ -279,7 +279,7 @@ struct ntfs_sb_info {
Kmods SIG 8b815c
 #endif
Kmods SIG 8b815c
 	} compress;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	struct ntfs_mount_options options;
Kmods SIG 8b815c
+	struct ntfs_mount_options *options;
Kmods SIG 8b815c
 	struct ratelimit_state msg_ratelimit;
Kmods SIG 8b815c
 };
Kmods SIG 8b815c
 
Kmods SIG 8b815c
diff --git a/src/super.c b/src/super.c
Kmods SIG 8b815c
index 6cb689605089e2a592143a2b4154a97211f39c6c..0f38203420515b6386bdd51e83c402c431743946 100644
Kmods SIG 8b815c
--- a/src/super.c
Kmods SIG 8b815c
+++ b/src/super.c
Kmods SIG 8b815c
@@ -389,11 +389,11 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *data)
Kmods SIG 8b815c
 		return -ENOMEM;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* Store  original options. */
Kmods SIG 8b815c
-	memcpy(&old_opts, &sbi->options, sizeof(old_opts));
Kmods SIG 8b815c
-	clear_mount_options(&sbi->options);
Kmods SIG 8b815c
-	memset(&sbi->options, 0, sizeof(sbi->options));
Kmods SIG 8b815c
+	memcpy(&old_opts, sbi->options, sizeof(old_opts));
Kmods SIG 8b815c
+	clear_mount_options(sbi->options);
Kmods SIG 8b815c
+	memset(sbi->options, 0, sizeof(old_opts));
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	err = ntfs_parse_options(sb, data, 0, &sbi->options);
Kmods SIG 8b815c
+	err = ntfs_parse_options(sb, data, 0, sbi->options);
Kmods SIG 8b815c
 	if (err)
Kmods SIG 8b815c
 		goto restore_opts;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
@@ -409,7 +409,7 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *data)
Kmods SIG 8b815c
 	sync_filesystem(sb);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	if (ro_rw && (sbi->volume.flags & VOLUME_FLAG_DIRTY) &&
Kmods SIG 8b815c
-	    !sbi->options.force) {
Kmods SIG 8b815c
+	    !sbi->options->force) {
Kmods SIG 8b815c
 		ntfs_warn(sb, "volume is dirty and \"force\" flag is not set!");
Kmods SIG 8b815c
 		err = -EINVAL;
Kmods SIG 8b815c
 		goto restore_opts;
Kmods SIG 8b815c
@@ -422,8 +422,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *data)
Kmods SIG 8b815c
 	goto out;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 restore_opts:
Kmods SIG 8b815c
-	clear_mount_options(&sbi->options);
Kmods SIG 8b815c
-	memcpy(&sbi->options, &old_opts, sizeof(old_opts));
Kmods SIG 8b815c
+	clear_mount_options(sbi->options);
Kmods SIG 8b815c
+	memcpy(sbi->options, &old_opts, sizeof(old_opts));
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 out:
Kmods SIG 8b815c
 	kfree(orig_data);
Kmods SIG 8b815c
@@ -506,7 +506,8 @@ static noinline void put_ntfs(struct ntfs_sb_info *sbi)
Kmods SIG 8b815c
 	xpress_free_decompressor(sbi->compress.xpress);
Kmods SIG 8b815c
 	lzx_free_decompressor(sbi->compress.lzx);
Kmods SIG 8b815c
 #endif
Kmods SIG 8b815c
-	clear_mount_options(&sbi->options);
Kmods SIG 8b815c
+	clear_mount_options(sbi->options);
Kmods SIG 8b815c
+	kfree(sbi->options);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	kfree(sbi);
Kmods SIG 8b815c
 }
Kmods SIG 8b815c
@@ -545,7 +546,7 @@ static int ntfs_show_options(struct seq_file *m, struct dentry *root)
Kmods SIG 8b815c
 {
Kmods SIG 8b815c
 	struct super_block *sb = root->d_sb;
Kmods SIG 8b815c
 	struct ntfs_sb_info *sbi = sb->s_fs_info;
Kmods SIG 8b815c
-	struct ntfs_mount_options *opts = &sbi->options;
Kmods SIG 8b815c
+	struct ntfs_mount_options *opts = sbi->options;
Kmods SIG 8b815c
 	struct user_namespace *user_ns = seq_user_ns(m);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	if (opts->uid)
Kmods SIG 8b815c
@@ -930,6 +931,12 @@ static int ntfs_fill_super(struct super_block *sb, void *data, int silent)
Kmods SIG 8b815c
 	if (!sbi)
Kmods SIG 8b815c
 		return -ENOMEM;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
+	sbi->options = kzalloc(sizeof(struct ntfs_mount_options), GFP_NOFS);
Kmods SIG 8b815c
+	if (!sbi->options) {
Kmods SIG 8b815c
+		kfree(sbi);
Kmods SIG 8b815c
+		return -ENOMEM;
Kmods SIG 8b815c
+	}
Kmods SIG 8b815c
+
Kmods SIG 8b815c
 	sb->s_fs_info = sbi;
Kmods SIG 8b815c
 	sbi->sb = sb;
Kmods SIG 8b815c
 	sb->s_flags |= SB_NODIRATIME;
Kmods SIG 8b815c
@@ -942,7 +949,7 @@ static int ntfs_fill_super(struct super_block *sb, void *data, int silent)
Kmods SIG 8b815c
 	ratelimit_state_init(&sbi->msg_ratelimit, DEFAULT_RATELIMIT_INTERVAL,
Kmods SIG 8b815c
 			     DEFAULT_RATELIMIT_BURST);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	err = ntfs_parse_options(sb, data, silent, &sbi->options);
Kmods SIG 8b815c
+	err = ntfs_parse_options(sb, data, silent, sbi->options);
Kmods SIG 8b815c
 	if (err)
Kmods SIG 8b815c
 		goto out;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
@@ -1074,7 +1081,7 @@ static int ntfs_fill_super(struct super_block *sb, void *data, int silent)
Kmods SIG 8b815c
 			goto out;
Kmods SIG 8b815c
 		}
Kmods SIG 8b815c
 	} else if (sbi->volume.flags & VOLUME_FLAG_DIRTY) {
Kmods SIG 8b815c
-		if (!is_ro && !sbi->options.force) {
Kmods SIG 8b815c
+		if (!is_ro && !sbi->options->force) {
Kmods SIG 8b815c
 			ntfs_warn(
Kmods SIG 8b815c
 				sb,
Kmods SIG 8b815c
 				"volume is dirty and \"force\" flag is not set!");
Kmods SIG 8b815c
@@ -1394,7 +1401,7 @@ int ntfs_discard(struct ntfs_sb_info *sbi, CLST lcn, CLST len)
Kmods SIG 8b815c
 	if (sbi->flags & NTFS_FLAGS_NODISCARD)
Kmods SIG 8b815c
 		return -EOPNOTSUPP;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
-	if (!sbi->options.discard)
Kmods SIG 8b815c
+	if (!sbi->options->discard)
Kmods SIG 8b815c
 		return -EOPNOTSUPP;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	lbo = (u64)lcn << sbi->cluster_bits;
Kmods SIG 8b815c
diff --git a/src/xattr.c b/src/xattr.c
Kmods SIG 8b815c
index b15d532e4a17087b06284d82965c21224f1d4f35..ac4b37bf8832a51b9e32b7c4feb6f1c762d5b271 100644
Kmods SIG 8b815c
--- a/src/xattr.c
Kmods SIG 8b815c
+++ b/src/xattr.c
Kmods SIG 8b815c
@@ -769,7 +769,7 @@ int ntfs_acl_chmod(struct user_namespace *mnt_userns, struct inode *inode)
Kmods SIG 8b815c
 int ntfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
Kmods SIG 8b815c
 		    int mask)
Kmods SIG 8b815c
 {
Kmods SIG 8b815c
-	if (ntfs_sb(inode->i_sb)->options.no_acs_rules) {
Kmods SIG 8b815c
+	if (ntfs_sb(inode->i_sb)->options->no_acs_rules) {
Kmods SIG 8b815c
 		/* "No access rules" mode - Allow all changes. */
Kmods SIG 8b815c
 		return 0;
Kmods SIG 8b815c
 	}
Kmods SIG 8b815c
-- 
Kmods SIG 8b815c
2.31.1
Kmods SIG 8b815c