|
@@ -37,17 +37,11 @@ static struct dentry *lock_parent(struct dentry *dentry)
|
|
{
|
|
{
|
|
struct dentry *dir;
|
|
struct dentry *dir;
|
|
|
|
|
|
- dir = dget(dentry->d_parent);
|
|
|
|
|
|
+ dir = dget_parent(dentry);
|
|
mutex_lock_nested(&(dir->d_inode->i_mutex), I_MUTEX_PARENT);
|
|
mutex_lock_nested(&(dir->d_inode->i_mutex), I_MUTEX_PARENT);
|
|
return dir;
|
|
return dir;
|
|
}
|
|
}
|
|
|
|
|
|
-static void unlock_parent(struct dentry *dentry)
|
|
|
|
-{
|
|
|
|
- mutex_unlock(&(dentry->d_parent->d_inode->i_mutex));
|
|
|
|
- dput(dentry->d_parent);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void unlock_dir(struct dentry *dir)
|
|
static void unlock_dir(struct dentry *dir)
|
|
{
|
|
{
|
|
mutex_unlock(&dir->d_inode->i_mutex);
|
|
mutex_unlock(&dir->d_inode->i_mutex);
|
|
@@ -426,8 +420,9 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
|
|
int rc = 0;
|
|
int rc = 0;
|
|
struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
|
|
struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
|
|
struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
|
|
struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
|
|
|
|
+ struct dentry *lower_dir_dentry;
|
|
|
|
|
|
- lock_parent(lower_dentry);
|
|
|
|
|
|
+ lower_dir_dentry = lock_parent(lower_dentry);
|
|
rc = vfs_unlink(lower_dir_inode, lower_dentry);
|
|
rc = vfs_unlink(lower_dir_inode, lower_dentry);
|
|
if (rc) {
|
|
if (rc) {
|
|
printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
|
|
printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
|
|
@@ -439,7 +434,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
|
|
dentry->d_inode->i_ctime = dir->i_ctime;
|
|
dentry->d_inode->i_ctime = dir->i_ctime;
|
|
d_drop(dentry);
|
|
d_drop(dentry);
|
|
out_unlock:
|
|
out_unlock:
|
|
- unlock_parent(lower_dentry);
|
|
|
|
|
|
+ unlock_dir(lower_dir_dentry);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|