From: Andiry Xu <jix...@cs.ucsd.edu>

Signed-off-by: Andiry Xu <jix...@cs.ucsd.edu>
---
 fs/nova/super.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/fs/nova/super.c b/fs/nova/super.c
index daf3270..0847e57 100644
--- a/fs/nova/super.c
+++ b/fs/nova/super.c
@@ -51,6 +51,7 @@ module_param(nova_dbgmask, int, 0444);
 MODULE_PARM_DESC(nova_dbgmask, "Control debugging output");
 
 static struct super_operations nova_sops;
+static const struct export_operations nova_export_ops;
 
 static struct kmem_cache *nova_inode_cachep;
 static struct kmem_cache *nova_range_node_cachep;
@@ -631,6 +632,7 @@ static int nova_fill_super(struct super_block *sb, void 
*data, int silent)
        sb->s_op = &nova_sops;
        sb->s_maxbytes = nova_max_size(sb->s_blocksize_bits);
        sb->s_time_gran = 1000000000; // 1 second.
+       sb->s_export_op = &nova_export_ops;
        sb->s_xattr = NULL;
        sb->s_flags |= MS_NOSEC;
 
@@ -904,6 +906,52 @@ static struct file_system_type nova_fs_type = {
        .kill_sb        = kill_block_super,
 };
 
+static struct inode *nova_nfs_get_inode(struct super_block *sb,
+                                        u64 ino, u32 generation)
+{
+       struct inode *inode;
+
+       if (ino < NOVA_ROOT_INO)
+               return ERR_PTR(-ESTALE);
+
+       if (ino > LONG_MAX)
+               return ERR_PTR(-ESTALE);
+
+       inode = nova_iget(sb, ino);
+       if (IS_ERR(inode))
+               return ERR_CAST(inode);
+
+       if (generation && inode->i_generation != generation) {
+               /* we didn't find the right inode.. */
+               iput(inode);
+               return ERR_PTR(-ESTALE);
+       }
+
+       return inode;
+}
+
+static struct dentry *nova_fh_to_dentry(struct super_block *sb,
+                                        struct fid *fid, int fh_len,
+                                        int fh_type)
+{
+       return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
+                                   nova_nfs_get_inode);
+}
+
+static struct dentry *nova_fh_to_parent(struct super_block *sb,
+                                        struct fid *fid, int fh_len,
+                                        int fh_type)
+{
+       return generic_fh_to_parent(sb, fid, fh_len, fh_type,
+                                   nova_nfs_get_inode);
+}
+
+static const struct export_operations nova_export_ops = {
+       .fh_to_dentry   = nova_fh_to_dentry,
+       .fh_to_parent   = nova_fh_to_parent,
+       .get_parent     = nova_get_parent,
+};
+
 static int __init init_nova_fs(void)
 {
        int rc = 0;
-- 
2.7.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to