Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17229
b: refs/heads/master
c: 346f4d3
h: refs/heads/master
i:
  17227: a45b0c9
v: v3
  • Loading branch information
Arnd Bergmann authored and Paul Mackerras committed Jan 9, 2006
1 parent b3075da commit d41a5f3
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0106246594a05f02a6be6ee4695c7584c758fa7f
refs/heads/master: 346f4d3ce948a381a559dcaefb141d79f492335c
54 changes: 37 additions & 17 deletions trunk/arch/powerpc/platforms/cell/spufs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/init.h>
#include <linux/ioctl.h>
#include <linux/module.h>
#include <linux/mount.h>
#include <linux/namei.h>
#include <linux/pagemap.h>
#include <linux/poll.h>
Expand Down Expand Up @@ -251,6 +252,7 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
d_instantiate(dentry, inode);
dget(dentry);
dir->i_nlink++;
dentry->d_inode->i_nlink++;
goto out;

out_free_ctx:
Expand All @@ -261,18 +263,44 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
return ret;
}

static int spufs_context_open(struct dentry *dentry, struct vfsmount *mnt)
{
int ret;
struct file *filp;

ret = get_unused_fd();
if (ret < 0) {
dput(dentry);
mntput(mnt);
goto out;
}

filp = dentry_open(dentry, mnt, O_RDONLY);
if (IS_ERR(filp)) {
put_unused_fd(ret);
ret = PTR_ERR(filp);
goto out;
}

filp->f_op = &spufs_context_fops;
fd_install(ret, filp);
out:
return ret;
}

static struct file_system_type spufs_type;

long
spufs_create_thread(struct nameidata *nd, const char *name,
unsigned int flags, mode_t mode)
{
struct dentry *dentry;
struct file *filp;
int ret;

/* need to be at the root of spufs */
ret = -EINVAL;
if (nd->dentry->d_sb->s_magic != SPUFS_MAGIC ||
nd->dentry != nd->dentry->d_sb->s_root)
if (nd->dentry->d_sb->s_type != &spufs_type ||
nd->dentry != nd->dentry->d_sb->s_root)
goto out;

dentry = lookup_create(nd, 1);
Expand All @@ -289,21 +317,13 @@ spufs_create_thread(struct nameidata *nd, const char *name,
if (ret)
goto out_dput;

ret = get_unused_fd();
/*
* get references for dget and mntget, will be released
* in error path of *_open().
*/
ret = spufs_context_open(dget(dentry), mntget(nd->mnt));
if (ret < 0)
goto out_dput;

dentry->d_inode->i_nlink++;

filp = filp_open(name, O_RDONLY, mode);
if (IS_ERR(filp)) {
// FIXME: remove directory again
put_unused_fd(ret);
ret = PTR_ERR(filp);
} else {
filp->f_op = &spufs_context_fops;
fd_install(ret, filp);
}
spufs_rmdir(nd->dentry->d_inode, dentry);

out_dput:
dput(dentry);
Expand Down

0 comments on commit d41a5f3

Please sign in to comment.