|
@@ -349,37 +349,6 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int spufs_rmgang(struct inode *root, struct dentry *dir)
|
|
|
-{
|
|
|
- /* FIXME: this fails if the dir is not empty,
|
|
|
- which causes a leak of gangs. */
|
|
|
- return simple_rmdir(root, dir);
|
|
|
-}
|
|
|
-
|
|
|
-static int spufs_gang_close(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- struct inode *parent;
|
|
|
- struct dentry *dir;
|
|
|
- int ret;
|
|
|
-
|
|
|
- dir = file->f_path.dentry;
|
|
|
- parent = dir->d_parent->d_inode;
|
|
|
-
|
|
|
- ret = spufs_rmgang(parent, dir);
|
|
|
- WARN_ON(ret);
|
|
|
-
|
|
|
- return dcache_dir_close(inode, file);
|
|
|
-}
|
|
|
-
|
|
|
-const struct file_operations spufs_gang_fops = {
|
|
|
- .open = dcache_dir_open,
|
|
|
- .release = spufs_gang_close,
|
|
|
- .llseek = dcache_dir_lseek,
|
|
|
- .read = generic_read_dir,
|
|
|
- .readdir = dcache_readdir,
|
|
|
- .fsync = simple_sync_file,
|
|
|
-};
|
|
|
-
|
|
|
static int
|
|
|
spufs_mkgang(struct inode *dir, struct dentry *dentry, int mode)
|
|
|
{
|
|
@@ -407,7 +376,6 @@ spufs_mkgang(struct inode *dir, struct dentry *dentry, int mode)
|
|
|
inode->i_fop = &simple_dir_operations;
|
|
|
|
|
|
d_instantiate(dentry, inode);
|
|
|
- dget(dentry);
|
|
|
dir->i_nlink++;
|
|
|
dentry->d_inode->i_nlink++;
|
|
|
return ret;
|
|
@@ -437,7 +405,7 @@ static int spufs_gang_open(struct dentry *dentry, struct vfsmount *mnt)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- filp->f_op = &spufs_gang_fops;
|
|
|
+ filp->f_op = &simple_dir_operations;
|
|
|
fd_install(ret, filp);
|
|
|
out:
|
|
|
return ret;
|
|
@@ -458,8 +426,10 @@ static int spufs_create_gang(struct inode *inode,
|
|
|
* in error path of *_open().
|
|
|
*/
|
|
|
ret = spufs_gang_open(dget(dentry), mntget(mnt));
|
|
|
- if (ret < 0)
|
|
|
- WARN_ON(spufs_rmgang(inode, dentry));
|
|
|
+ if (ret < 0) {
|
|
|
+ int err = simple_rmdir(inode, dentry);
|
|
|
+ WARN_ON(err);
|
|
|
+ }
|
|
|
|
|
|
out:
|
|
|
mutex_unlock(&inode->i_mutex);
|