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