|
@@ -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) &&
|