|
@@ -456,13 +456,13 @@ static int remove_file(struct dentry *parent, char *name)
|
|
|
|
|
|
spin_lock(&tmp->d_lock);
|
|
|
if (!(d_unhashed(tmp) && tmp->d_inode)) {
|
|
|
- dget_dlock(tmp);
|
|
|
__d_drop(tmp);
|
|
|
spin_unlock(&tmp->d_lock);
|
|
|
simple_unlink(parent->d_inode, tmp);
|
|
|
} else {
|
|
|
spin_unlock(&tmp->d_lock);
|
|
|
}
|
|
|
+ dput(tmp);
|
|
|
|
|
|
ret = 0;
|
|
|
bail:
|
|
@@ -491,6 +491,7 @@ static int remove_device_files(struct super_block *sb,
|
|
|
goto bail;
|
|
|
}
|
|
|
|
|
|
+ mutex_lock(&dir->d_inode->i_mutex);
|
|
|
remove_file(dir, "counters");
|
|
|
remove_file(dir, "counter_names");
|
|
|
remove_file(dir, "portcounter_names");
|
|
@@ -505,8 +506,10 @@ static int remove_device_files(struct super_block *sb,
|
|
|
}
|
|
|
}
|
|
|
remove_file(dir, "flash");
|
|
|
- d_delete(dir);
|
|
|
+ mutex_unlock(&dir->d_inode->i_mutex);
|
|
|
ret = simple_rmdir(root->d_inode, dir);
|
|
|
+ d_delete(dir);
|
|
|
+ dput(dir);
|
|
|
|
|
|
bail:
|
|
|
mutex_unlock(&root->d_inode->i_mutex);
|