struct REPARSE_DATA_BUFFER *rp = NULL;
        bool rp_inserted = false;
 
+       ni_lock_dir(dir_ni);
+
        dir_root = indx_get_root(&dir_ni->dir, dir_ni, NULL, NULL);
-       if (!dir_root)
-               return ERR_PTR(-EINVAL);
+       if (!dir_root) {
+               err = -EINVAL;
+               goto out1;
+       }
 
        if (S_ISDIR(mode)) {
                /* Use parent's directory attributes. */
        if (err)
                goto out6;
 
+       /* Unlock parent directory before ntfs_init_acl. */
+       ni_unlock(dir_ni);
+
        inode->i_generation = le16_to_cpu(rec->seq);
 
        dir->i_mtime = dir->i_ctime = inode->i_atime;
 out7:
 
        /* Undo 'indx_insert_entry'. */
+       ni_lock_dir(dir_ni);
        indx_delete_entry(&dir_ni->dir, dir_ni, new_de + 1,
                          le16_to_cpu(new_de->key_size), sbi);
+       /* ni_unlock(dir_ni); will be called later. */
 out6:
        if (rp_inserted)
                ntfs_remove_reparse(sbi, IO_REPARSE_TAG_SYMLINK, &new_de->ref);
        kfree(rp);
 
 out1:
-       if (err)
+       if (err) {
+               ni_unlock(dir_ni);
                return ERR_PTR(err);
+       }
 
        unlock_new_inode(inode);
 
 
 static int ntfs_create(struct user_namespace *mnt_userns, struct inode *dir,
                       struct dentry *dentry, umode_t mode, bool excl)
 {
-       struct ntfs_inode *ni = ntfs_i(dir);
        struct inode *inode;
 
-       ni_lock_dir(ni);
-
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFREG | mode,
                                  0, NULL, 0, NULL);
 
-       ni_unlock(ni);
-
        return IS_ERR(inode) ? PTR_ERR(inode) : 0;
 }
 
 static int ntfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
-       struct ntfs_inode *ni = ntfs_i(dir);
        struct inode *inode;
 
-       ni_lock_dir(ni);
-
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, mode, rdev,
                                  NULL, 0, NULL);
 
-       ni_unlock(ni);
-
        return IS_ERR(inode) ? PTR_ERR(inode) : 0;
 }
 
 {
        u32 size = strlen(symname);
        struct inode *inode;
-       struct ntfs_inode *ni = ntfs_i(dir);
-
-       ni_lock_dir(ni);
 
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFLNK | 0777,
                                  0, symname, size, NULL);
 
-       ni_unlock(ni);
-
        return IS_ERR(inode) ? PTR_ERR(inode) : 0;
 }
 
                      struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
-       struct ntfs_inode *ni = ntfs_i(dir);
-
-       ni_lock_dir(ni);
 
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFDIR | mode,
                                  0, NULL, 0, NULL);
 
-       ni_unlock(ni);
-
        return IS_ERR(inode) ? PTR_ERR(inode) : 0;
 }