Blame SOURCES/0082-fs-ntfs3-Move-ni_lock_dir-and-ni_unlock-into-ntfs_cr.patch

Kmods SIG 63c143
From d562e901f25d275b55b0496fe01935beeff0ed37 Mon Sep 17 00:00:00 2001
Kmods SIG 63c143
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 63c143
Date: Thu, 23 Sep 2021 18:04:26 +0300
Kmods SIG 63c143
Subject: [Backport d562e901f25d] src: Move ni_lock_dir and ni_unlock into
Kmods SIG 63c143
 ntfs_create_inode
Kmods SIG 63c143
Kmods SIG 63c143
Now ntfs3 locks mutex for smaller time.
Kmods SIG 63c143
Theoretically in successful cases those locks aren't needed at all.
Kmods SIG 63c143
But proving the same for error cases is difficult.
Kmods SIG 63c143
So instead of removing them we just move them.
Kmods SIG 63c143
Kmods SIG 63c143
Reviewed-by: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 63c143
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 63c143
---
Kmods SIG 63c143
 src/inode.c | 17 ++++++++++++++---
Kmods SIG 63c143
 src/namei.c | 20 --------------------
Kmods SIG 63c143
 2 files changed, 14 insertions(+), 23 deletions(-)
Kmods SIG 63c143
Kmods SIG 63c143
diff --git a/src/inode.c b/src/inode.c
Kmods SIG 63c143
index d51bf40188357e8c292b7ddbbee100d3dfbaeff5..7dd162f6a7e26435b16c08b5efed6e283b975f54 100644
Kmods SIG 63c143
--- a/src/inode.c
Kmods SIG 63c143
+++ b/src/inode.c
Kmods SIG 63c143
@@ -1198,9 +1198,13 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
Kmods SIG 63c143
 	struct REPARSE_DATA_BUFFER *rp = NULL;
Kmods SIG 63c143
 	bool rp_inserted = false;
Kmods SIG 63c143
 
Kmods SIG 63c143
+	ni_lock_dir(dir_ni);
Kmods SIG 63c143
+
Kmods SIG 63c143
 	dir_root = indx_get_root(&dir_ni->dir, dir_ni, NULL, NULL);
Kmods SIG 63c143
-	if (!dir_root)
Kmods SIG 63c143
-		return ERR_PTR(-EINVAL);
Kmods SIG 63c143
+	if (!dir_root) {
Kmods SIG 63c143
+		err = -EINVAL;
Kmods SIG 63c143
+		goto out1;
Kmods SIG 63c143
+	}
Kmods SIG 63c143
 
Kmods SIG 63c143
 	if (S_ISDIR(mode)) {
Kmods SIG 63c143
 		/* Use parent's directory attributes. */
Kmods SIG 63c143
@@ -1549,6 +1553,9 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
Kmods SIG 63c143
 	if (err)
Kmods SIG 63c143
 		goto out6;
Kmods SIG 63c143
 
Kmods SIG 63c143
+	/* Unlock parent directory before ntfs_init_acl. */
Kmods SIG 63c143
+	ni_unlock(dir_ni);
Kmods SIG 63c143
+
Kmods SIG 63c143
 	inode->i_generation = le16_to_cpu(rec->seq);
Kmods SIG 63c143
 
Kmods SIG 63c143
 	dir->i_mtime = dir->i_ctime = inode->i_atime;
Kmods SIG 63c143
@@ -1605,8 +1612,10 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
Kmods SIG 63c143
 out7:
Kmods SIG 63c143
 
Kmods SIG 63c143
 	/* Undo 'indx_insert_entry'. */
Kmods SIG 63c143
+	ni_lock_dir(dir_ni);
Kmods SIG 63c143
 	indx_delete_entry(&dir_ni->dir, dir_ni, new_de + 1,
Kmods SIG 63c143
 			  le16_to_cpu(new_de->key_size), sbi);
Kmods SIG 63c143
+	/* ni_unlock(dir_ni); will be called later. */
Kmods SIG 63c143
 out6:
Kmods SIG 63c143
 	if (rp_inserted)
Kmods SIG 63c143
 		ntfs_remove_reparse(sbi, IO_REPARSE_TAG_SYMLINK, &new_de->ref);
Kmods SIG 63c143
@@ -1630,8 +1639,10 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
Kmods SIG 63c143
 	kfree(rp);
Kmods SIG 63c143
 
Kmods SIG 63c143
 out1:
Kmods SIG 63c143
-	if (err)
Kmods SIG 63c143
+	if (err) {
Kmods SIG 63c143
+		ni_unlock(dir_ni);
Kmods SIG 63c143
 		return ERR_PTR(err);
Kmods SIG 63c143
+	}
Kmods SIG 63c143
 
Kmods SIG 63c143
 	unlock_new_inode(inode);
Kmods SIG 63c143
 
Kmods SIG 63c143
diff --git a/src/namei.c b/src/namei.c
Kmods SIG 63c143
index 1c475da4e19d1158e3c11fcb749fb0825d2d7ae6..bc741213ad84833b7fd434c32d4b784c6e7cb2f7 100644
Kmods SIG 63c143
--- a/src/namei.c
Kmods SIG 63c143
+++ b/src/namei.c
Kmods SIG 63c143
@@ -95,16 +95,11 @@ static struct dentry *ntfs_lookup(struct inode *dir, struct dentry *dentry,
Kmods SIG 63c143
 static int ntfs_create(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 63c143
 		       struct dentry *dentry, umode_t mode, bool excl)
Kmods SIG 63c143
 {
Kmods SIG 63c143
-	struct ntfs_inode *ni = ntfs_i(dir);
Kmods SIG 63c143
 	struct inode *inode;
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_lock_dir(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFREG | mode,
Kmods SIG 63c143
 				  0, NULL, 0, NULL);
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_unlock(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	return IS_ERR(inode) ? PTR_ERR(inode) : 0;
Kmods SIG 63c143
 }
Kmods SIG 63c143
 
Kmods SIG 63c143
@@ -116,16 +111,11 @@ static int ntfs_create(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 63c143
 static int ntfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 63c143
 		      struct dentry *dentry, umode_t mode, dev_t rdev)
Kmods SIG 63c143
 {
Kmods SIG 63c143
-	struct ntfs_inode *ni = ntfs_i(dir);
Kmods SIG 63c143
 	struct inode *inode;
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_lock_dir(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, mode, rdev,
Kmods SIG 63c143
 				  NULL, 0, NULL);
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_unlock(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	return IS_ERR(inode) ? PTR_ERR(inode) : 0;
Kmods SIG 63c143
 }
Kmods SIG 63c143
 
Kmods SIG 63c143
@@ -196,15 +186,10 @@ static int ntfs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 63c143
 {
Kmods SIG 63c143
 	u32 size = strlen(symname);
Kmods SIG 63c143
 	struct inode *inode;
Kmods SIG 63c143
-	struct ntfs_inode *ni = ntfs_i(dir);
Kmods SIG 63c143
-
Kmods SIG 63c143
-	ni_lock_dir(ni);
Kmods SIG 63c143
 
Kmods SIG 63c143
 	inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFLNK | 0777,
Kmods SIG 63c143
 				  0, symname, size, NULL);
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_unlock(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	return IS_ERR(inode) ? PTR_ERR(inode) : 0;
Kmods SIG 63c143
 }
Kmods SIG 63c143
 
Kmods SIG 63c143
@@ -215,15 +200,10 @@ static int ntfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 63c143
 		      struct dentry *dentry, umode_t mode)
Kmods SIG 63c143
 {
Kmods SIG 63c143
 	struct inode *inode;
Kmods SIG 63c143
-	struct ntfs_inode *ni = ntfs_i(dir);
Kmods SIG 63c143
-
Kmods SIG 63c143
-	ni_lock_dir(ni);
Kmods SIG 63c143
 
Kmods SIG 63c143
 	inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFDIR | mode,
Kmods SIG 63c143
 				  0, NULL, 0, NULL);
Kmods SIG 63c143
 
Kmods SIG 63c143
-	ni_unlock(ni);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	return IS_ERR(inode) ? PTR_ERR(inode) : 0;
Kmods SIG 63c143
 }
Kmods SIG 63c143
 
Kmods SIG 63c143
-- 
Kmods SIG 63c143
2.31.1
Kmods SIG 63c143