3.16.7-ckt15 -stable review patch.  If anyone has any objections, please let me 
know.

------------------

From: Fabian Frederick <f...@skynet.be>

commit 13b987ea275840d74d9df9a44326632fab1894da upstream.

This reverts commit 9ef7db7f38d0 ("ufs: fix deadlocks introduced by sb
mutex merge") That patch tried to solve commit 0244756edc4b98c ("ufs: sb
mutex merge + mutex_destroy") which is itself partially reverted due to
multiple deadlocks.

Signed-off-by: Fabian Frederick <f...@skynet.be>
Suggested-by: Jan Kara <j...@suse.cz>
Cc: Ian Campbell <ian.campb...@citrix.com>
Cc: Evgeniy Dushistov <dushis...@mail.ru>
Cc: Alexey Khoroshilov <khoroshi...@ispras.ru>
Cc: Roger Pau Monne <roger....@citrix.com>
Cc: Ian Jackson <ian.jack...@eu.citrix.com>
Cc: Al Viro <v...@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <a...@linux-foundation.org>
Signed-off-by: Luis Henriques <luis.henriq...@canonical.com>
---
 fs/ufs/inode.c |  5 ++++-
 fs/ufs/namei.c | 14 ++++++++------
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c
index 42234a871b22..40d6423429cb 100644
--- a/fs/ufs/inode.c
+++ b/fs/ufs/inode.c
@@ -902,6 +902,9 @@ void ufs_evict_inode(struct inode * inode)
        invalidate_inode_buffers(inode);
        clear_inode(inode);
 
-       if (want_delete)
+       if (want_delete) {
+               lock_ufs(inode->i_sb);
                ufs_free_inode(inode);
+               unlock_ufs(inode->i_sb);
+       }
 }
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c
index 2df62a73f20c..90d74b8f8eba 100644
--- a/fs/ufs/namei.c
+++ b/fs/ufs/namei.c
@@ -126,12 +126,12 @@ static int ufs_symlink (struct inode * dir, struct dentry 
* dentry,
        if (l > sb->s_blocksize)
                goto out_notlocked;
 
+       lock_ufs(dir->i_sb);
        inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO);
        err = PTR_ERR(inode);
        if (IS_ERR(inode))
-               goto out_notlocked;
+               goto out;
 
-       lock_ufs(dir->i_sb);
        if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) {
                /* slow symlink */
                inode->i_op = &ufs_symlink_inode_operations;
@@ -181,9 +181,13 @@ static int ufs_mkdir(struct inode * dir, struct dentry * 
dentry, umode_t mode)
        struct inode * inode;
        int err;
 
+       lock_ufs(dir->i_sb);
+       inode_inc_link_count(dir);
+
        inode = ufs_new_inode(dir, S_IFDIR|mode);
+       err = PTR_ERR(inode);
        if (IS_ERR(inode))
-               return PTR_ERR(inode);
+               goto out_dir;
 
        inode->i_op = &ufs_dir_inode_operations;
        inode->i_fop = &ufs_dir_operations;
@@ -191,9 +195,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * 
dentry, umode_t mode)
 
        inode_inc_link_count(inode);
 
-       lock_ufs(dir->i_sb);
-       inode_inc_link_count(dir);
-
        err = ufs_make_empty(inode, dir);
        if (err)
                goto out_fail;
@@ -211,6 +212,7 @@ out_fail:
        inode_dec_link_count(inode);
        inode_dec_link_count(inode);
        iput (inode);
+out_dir:
        inode_dec_link_count(dir);
        unlock_ufs(dir->i_sb);
        goto out;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to