mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
rpc_mkpipe_dentry(): switch to simple_start_creating()
... and make sure we set the fs-private part of inode up before attaching it to dentry. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5c1da75895
commit
a117bf4caa
|
|
@ -485,31 +485,6 @@ rpc_get_inode(struct super_block *sb, umode_t mode)
|
|||
return inode;
|
||||
}
|
||||
|
||||
static int __rpc_create_common(struct inode *dir, struct dentry *dentry,
|
||||
umode_t mode,
|
||||
const struct file_operations *i_fop,
|
||||
void *private)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
||||
d_drop(dentry);
|
||||
inode = rpc_get_inode(dir->i_sb, mode);
|
||||
if (!inode)
|
||||
goto out_err;
|
||||
inode->i_ino = iunique(dir->i_sb, 100);
|
||||
if (i_fop)
|
||||
inode->i_fop = i_fop;
|
||||
if (private)
|
||||
rpc_inode_setowner(inode, private);
|
||||
d_add(dentry, inode);
|
||||
return 0;
|
||||
out_err:
|
||||
printk(KERN_WARNING "%s: %s failed to allocate inode for dentry %pd\n",
|
||||
__FILE__, __func__, dentry);
|
||||
dput(dentry);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void
|
||||
init_pipe(struct rpc_pipe *pipe)
|
||||
{
|
||||
|
|
@ -546,25 +521,6 @@ struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_mkpipe_data);
|
||||
|
||||
static int __rpc_mkpipe_dentry(struct inode *dir, struct dentry *dentry,
|
||||
umode_t mode,
|
||||
const struct file_operations *i_fop,
|
||||
void *private,
|
||||
struct rpc_pipe *pipe)
|
||||
{
|
||||
struct rpc_inode *rpci;
|
||||
int err;
|
||||
|
||||
err = __rpc_create_common(dir, dentry, S_IFIFO | mode, i_fop, private);
|
||||
if (err)
|
||||
return err;
|
||||
rpci = RPC_I(d_inode(dentry));
|
||||
rpci->private = private;
|
||||
rpci->pipe = pipe;
|
||||
fsnotify_create(dir, dentry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rpc_new_file(struct dentry *parent,
|
||||
const char *name,
|
||||
umode_t mode,
|
||||
|
|
@ -704,8 +660,10 @@ static struct dentry *rpc_mkdir_populate(struct dentry *parent,
|
|||
int rpc_mkpipe_dentry(struct dentry *parent, const char *name,
|
||||
void *private, struct rpc_pipe *pipe)
|
||||
{
|
||||
struct dentry *dentry;
|
||||
struct inode *dir = d_inode(parent);
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
struct rpc_inode *rpci;
|
||||
umode_t umode = S_IFIFO | 0600;
|
||||
int err;
|
||||
|
||||
|
|
@ -715,16 +673,33 @@ int rpc_mkpipe_dentry(struct dentry *parent, const char *name,
|
|||
umode &= ~0222;
|
||||
|
||||
dentry = simple_start_creating(parent, name);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
err = __rpc_mkpipe_dentry(dir, dentry, umode, &rpc_pipe_fops,
|
||||
private, pipe);
|
||||
if (unlikely(err))
|
||||
pr_warn("%s() failed to create pipe %pd/%s (errno = %d)\n",
|
||||
__func__, parent, name, err);
|
||||
else
|
||||
pipe->dentry = dentry;
|
||||
if (IS_ERR(dentry)) {
|
||||
err = PTR_ERR(dentry);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
inode = rpc_get_inode(dir->i_sb, umode);
|
||||
if (unlikely(!inode)) {
|
||||
dput(dentry);
|
||||
inode_unlock(dir);
|
||||
err = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
inode->i_ino = iunique(dir->i_sb, 100);
|
||||
inode->i_fop = &rpc_pipe_fops;
|
||||
rpci = RPC_I(inode);
|
||||
rpci->private = private;
|
||||
rpci->pipe = pipe;
|
||||
rpc_inode_setowner(inode, private);
|
||||
d_instantiate(dentry, inode);
|
||||
pipe->dentry = dentry;
|
||||
fsnotify_create(dir, dentry);
|
||||
inode_unlock(dir);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
pr_warn("%s() failed to create pipe %pd/%s (errno = %d)\n",
|
||||
__func__, parent, name, err);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_mkpipe_dentry);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user