inode = rpc_get_inode(dir->i_sb, S_IFREG | mode);
if (unlikely(!inode)) {
- dput(dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
return -ENOMEM;
}
inode->i_ino = iunique(dir->i_sb, 100);
if (i_fop)
inode->i_fop = i_fop;
rpc_inode_setowner(inode, private);
- d_instantiate(dentry, inode);
+ d_make_persistent(dentry, inode);
fsnotify_create(dir, dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
return 0;
}
inode = rpc_get_inode(dir->i_sb, S_IFDIR | mode);
if (unlikely(!inode)) {
- dput(dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
return ERR_PTR(-ENOMEM);
}
inode->i_ino = iunique(dir->i_sb, 100);
inc_nlink(dir);
- d_instantiate(dentry, inode);
+ d_make_persistent(dentry, inode);
fsnotify_mkdir(dir, dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
- return dentry;
+ return dentry; // borrowed
}
static int rpc_populate(struct dentry *parent,
inode = rpc_get_inode(dir->i_sb, umode);
if (unlikely(!inode)) {
- dput(dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
err = -ENOMEM;
goto failed;
}
rpci->private = private;
rpci->pipe = pipe;
rpc_inode_setowner(inode, private);
- d_instantiate(dentry, inode);
- pipe->dentry = dentry;
+ pipe->dentry = dentry; // borrowed
+ d_make_persistent(dentry, inode);
fsnotify_create(dir, dentry);
- inode_unlock(dir);
+ simple_done_creating(dentry);
return 0;
failed:
sb);
mutex_unlock(&sn->pipefs_sb_lock);
out:
- kill_litter_super(sb);
+ kill_anon_super(sb);
put_net(net);
}