|
@@ -104,8 +104,8 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
|
|
|
|
|
|
tid = txBegin(dip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dip)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
rc = jfs_init_acl(tid, ip, dip);
|
|
|
if (rc)
|
|
@@ -238,8 +238,8 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
|
|
|
|
|
|
tid = txBegin(dip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dip)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
rc = jfs_init_acl(tid, ip, dip);
|
|
|
if (rc)
|
|
@@ -365,8 +365,8 @@ static int jfs_rmdir(struct inode *dip, struct dentry *dentry)
|
|
|
|
|
|
tid = txBegin(dip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dip)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
iplist[0] = dip;
|
|
|
iplist[1] = ip;
|
|
@@ -483,12 +483,12 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry)
|
|
|
if ((rc = get_UCSname(&dname, dentry)))
|
|
|
goto out;
|
|
|
|
|
|
- IWRITE_LOCK(ip);
|
|
|
+ IWRITE_LOCK(ip, RDWRLOCK_NORMAL);
|
|
|
|
|
|
tid = txBegin(dip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dip)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
iplist[0] = dip;
|
|
|
iplist[1] = ip;
|
|
@@ -802,8 +802,8 @@ static int jfs_link(struct dentry *old_dentry,
|
|
|
|
|
|
tid = txBegin(ip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dir)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dir)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
/*
|
|
|
* scan parent directory for entry/freespace
|
|
@@ -913,8 +913,8 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
|
|
|
|
|
|
tid = txBegin(dip->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dip)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
rc = jfs_init_security(tid, ip, dip);
|
|
|
if (rc)
|
|
@@ -1127,7 +1127,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
|
goto out3;
|
|
|
}
|
|
|
} else if (new_ip) {
|
|
|
- IWRITE_LOCK(new_ip);
|
|
|
+ IWRITE_LOCK(new_ip, RDWRLOCK_NORMAL);
|
|
|
/* Init inode for quota operations. */
|
|
|
DQUOT_INIT(new_ip);
|
|
|
}
|
|
@@ -1137,13 +1137,21 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
|
*/
|
|
|
tid = txBegin(new_dir->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(new_dir)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(old_ip)->commit_mutex);
|
|
|
+ /*
|
|
|
+ * How do we know the locking is safe from deadlocks?
|
|
|
+ * The vfs does the hard part for us. Any time we are taking nested
|
|
|
+ * commit_mutexes, the vfs already has i_mutex held on the parent.
|
|
|
+ * Here, the vfs has already taken i_mutex on both old_dir and new_dir.
|
|
|
+ */
|
|
|
+ mutex_lock_nested(&JFS_IP(new_dir)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(old_ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
if (old_dir != new_dir)
|
|
|
- mutex_lock(&JFS_IP(old_dir)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(old_dir)->commit_mutex,
|
|
|
+ COMMIT_MUTEX_SECOND_PARENT);
|
|
|
|
|
|
if (new_ip) {
|
|
|
- mutex_lock(&JFS_IP(new_ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(new_ip)->commit_mutex,
|
|
|
+ COMMIT_MUTEX_VICTIM);
|
|
|
/*
|
|
|
* Change existing directory entry to new inode number
|
|
|
*/
|
|
@@ -1357,8 +1365,8 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
|
|
|
|
|
|
tid = txBegin(dir->i_sb, 0);
|
|
|
|
|
|
- mutex_lock(&JFS_IP(dir)->commit_mutex);
|
|
|
- mutex_lock(&JFS_IP(ip)->commit_mutex);
|
|
|
+ mutex_lock_nested(&JFS_IP(dir)->commit_mutex, COMMIT_MUTEX_PARENT);
|
|
|
+ mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD);
|
|
|
|
|
|
rc = jfs_init_acl(tid, ip, dir);
|
|
|
if (rc)
|