new wrapper: alloc_file_pseudo()
[muen/linux.git] / fs / file_table.c
index 9b70ed2bbc4ed6a54e758a3207f17176b67d4659..6b3723909342fc9eb95138390e78dc0f0ef2255f 100644 (file)
@@ -184,6 +184,33 @@ struct file *alloc_file(const struct path *path, int flags,
 }
 EXPORT_SYMBOL(alloc_file);
 
 }
 EXPORT_SYMBOL(alloc_file);
 
+struct file *alloc_file_pseudo(struct inode *inode, struct vfsmount *mnt,
+                               const char *name, int flags,
+                               const struct file_operations *fops)
+{
+       static const struct dentry_operations anon_ops = {
+               .d_dname = simple_dname
+       };
+       struct qstr this = QSTR_INIT(name, strlen(name));
+       struct path path;
+       struct file *file;
+
+       path.dentry = d_alloc_pseudo(mnt->mnt_sb, &this);
+       if (!path.dentry)
+               return ERR_PTR(-ENOMEM);
+       if (!mnt->mnt_sb->s_d_op)
+               d_set_d_op(path.dentry, &anon_ops);
+       path.mnt = mntget(mnt);
+       d_instantiate(path.dentry, inode);
+       file = alloc_file(&path, flags, fops);
+       if (IS_ERR(file)) {
+               ihold(inode);
+               path_put(&path);
+       }
+       return file;
+}
+EXPORT_SYMBOL(alloc_file_pseudo);
+
 /* the real guts of fput() - releasing the last reference to file
  */
 static void __fput(struct file *file)
 /* the real guts of fput() - releasing the last reference to file
  */
 static void __fput(struct file *file)