summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/9p/v9fs_vfs.h2
-rw-r--r--fs/9p/vfs_inode.c30
2 files changed, 32 insertions, 0 deletions
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
index 6873850ad93e..0e8418066a48 100644
--- a/fs/9p/v9fs_vfs.h
+++ b/fs/9p/v9fs_vfs.h
@@ -40,6 +40,8 @@ extern struct kmem_cache *v9fs_inode_cache;
struct inode *v9fs_alloc_inode(struct super_block *sb);
void v9fs_free_inode(struct inode *inode);
+struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode,
+ dev_t rdev);
void v9fs_set_netfs_context(struct inode *inode);
int v9fs_init_inode(struct v9fs_session_info *v9ses,
struct inode *inode, umode_t mode, dev_t rdev);
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 8da32de3c318..32572982f72e 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -332,6 +332,36 @@ error:
}
/**
+ * v9fs_get_inode - helper function to setup an inode
+ * @sb: superblock
+ * @mode: mode to setup inode with
+ * @rdev: The device numbers to set
+ */
+
+struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)
+{
+ int err;
+ struct inode *inode;
+ struct v9fs_session_info *v9ses = sb->s_fs_info;
+
+ p9_debug(P9_DEBUG_VFS, "super block: %p mode: %ho\n", sb, mode);
+
+ inode = new_inode(sb);
+ if (!inode) {
+ pr_warn("%s (%d): Problem allocating inode\n",
+ __func__, task_pid_nr(current));
+ return ERR_PTR(-ENOMEM);
+ }
+ err = v9fs_init_inode(v9ses, inode, mode, rdev);
+ if (err) {
+ iput(inode);
+ return ERR_PTR(err);
+ }
+ v9fs_set_netfs_context(inode);
+ return inode;
+}
+
+/**
* v9fs_evict_inode - Remove an inode from the inode cache
* @inode: inode to release
*