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

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