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

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