new primitive: vfs_mkobj()
Similar to vfs_create(), but with caller-supplied callback (and argument for it) to be used instead of ->create(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
ae64f9bd1d
commit
8e6c848ece
21
fs/namei.c
21
fs/namei.c
|
@ -2898,6 +2898,27 @@ int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(vfs_create);
|
EXPORT_SYMBOL(vfs_create);
|
||||||
|
|
||||||
|
int vfs_mkobj(struct dentry *dentry, umode_t mode,
|
||||||
|
int (*f)(struct dentry *, umode_t, void *),
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
struct inode *dir = dentry->d_parent->d_inode;
|
||||||
|
int error = may_create(dir, dentry);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
mode &= S_IALLUGO;
|
||||||
|
mode |= S_IFREG;
|
||||||
|
error = security_inode_create(dir, dentry, mode);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
error = f(dentry, mode, arg);
|
||||||
|
if (!error)
|
||||||
|
fsnotify_create(dir, dentry);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(vfs_mkobj);
|
||||||
|
|
||||||
bool may_open_dev(const struct path *path)
|
bool may_open_dev(const struct path *path)
|
||||||
{
|
{
|
||||||
return !(path->mnt->mnt_flags & MNT_NODEV) &&
|
return !(path->mnt->mnt_flags & MNT_NODEV) &&
|
||||||
|
|
|
@ -1608,6 +1608,10 @@ extern int vfs_whiteout(struct inode *, struct dentry *);
|
||||||
extern struct dentry *vfs_tmpfile(struct dentry *dentry, umode_t mode,
|
extern struct dentry *vfs_tmpfile(struct dentry *dentry, umode_t mode,
|
||||||
int open_flag);
|
int open_flag);
|
||||||
|
|
||||||
|
int vfs_mkobj(struct dentry *, umode_t,
|
||||||
|
int (*f)(struct dentry *, umode_t, void *),
|
||||||
|
void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VFS file helper functions.
|
* VFS file helper functions.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue