+
+static struct dentry *ll_get_dentry(struct super_block *sb, void *data)
+{
+ struct lu_fid *fid;
+ struct dentry *entry;
+ __u32 mode;
+ ENTRY;
+
+ fid = (struct lu_fid *)data;
+ mode = *((__u32*)data + ONE_FH_LEN - 1);
+
+ entry = ll_iget_for_nfs(sb, fid, mode);
+ RETURN(entry);
+}
+
+static struct dentry *ll_get_parent(struct dentry *dchild)
+{
+ struct ptlrpc_request *req = NULL;
+ struct inode *dir = dchild->d_inode;
+ struct ll_sb_info *sbi;
+ struct dentry *result = NULL;
+ struct mdt_body *body;
+ static char dotdot[] = "..";
+ int rc;
+ ENTRY;
+
+ LASSERT(dir && S_ISDIR(dir->i_mode));
+
+ sbi = ll_s2sbi(dir->i_sb);
+
+ CDEBUG(D_INFO, "getting parent for (%lu,"DFID")\n",
+ dir->i_ino, PFID(ll_inode2fid(dir)));
+
+ rc = md_getattr_name(sbi->ll_md_exp, ll_inode2fid(dir), NULL,
+ dotdot, strlen(dotdot) + 1, 0, 0,
+ ll_i2suppgid(dir), &req);
+ if (rc) {
+ CERROR("failure %d inode %lu get parent\n", rc, dir->i_ino);
+ RETURN(ERR_PTR(rc));
+ }
+ body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
+ LASSERT(body->valid & OBD_MD_FLID);
+
+ CDEBUG(D_INFO, "parent for "DFID" is "DFID"\n",
+ PFID(ll_inode2fid(dir)), PFID(&body->fid1));
+
+ result = ll_iget_for_nfs(dir->i_sb, &body->fid1, S_IFDIR);
+
+ ptlrpc_req_finished(req);
+ RETURN(result);
+}
+
+struct export_operations lustre_export_operations = {
+ .get_parent = ll_get_parent,
+ .get_dentry = ll_get_dentry,
+ .encode_fh = ll_encode_fh,
+ .decode_fh = ll_decode_fh,
+};