4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2011 Gunnar Beutner
26 #include <sys/zfs_vnops.h>
27 #include <sys/zfs_znode.h>
32 zpl_encode_fh(struct dentry
*dentry
, __u32
*fh
, int *max_len
, int connectable
)
34 fid_t
*fid
= (fid_t
*)fh
;
35 struct inode
*ip
= dentry
->d_inode
;
38 len_bytes
= *max_len
* sizeof (__u32
);
40 if (len_bytes
< offsetof(fid_t
, fid_data
))
43 fid
->fid_len
= len_bytes
- offsetof(fid_t
, fid_data
);
45 rc
= zfs_fid(ip
, fid
);
47 len_bytes
= offsetof(fid_t
, fid_data
) + fid
->fid_len
;
48 *max_len
= roundup(len_bytes
, sizeof (__u32
)) / sizeof (__u32
);
50 return (rc
== 0 ? FILEID_INO32_GEN
: 255);
53 static struct dentry
*
54 zpl_dentry_obtain_alias(struct inode
*ip
)
56 struct dentry
*result
;
58 #ifdef HAVE_D_OBTAIN_ALIAS
59 result
= d_obtain_alias(ip
);
61 result
= d_alloc_anon(ip
);
65 result
= ERR_PTR(-ENOMEM
);
67 #endif /* HAVE_D_OBTAIN_ALIAS */
72 static struct dentry
*
73 zpl_fh_to_dentry(struct super_block
*sb
, struct fid
*fh
,
74 int fh_len
, int fh_type
)
76 fid_t
*fid
= (fid_t
*)fh
;
80 len_bytes
= fh_len
* sizeof (__u32
);
82 if (fh_type
!= FILEID_INO32_GEN
||
83 len_bytes
< offsetof(fid_t
, fid_data
) ||
84 len_bytes
< offsetof(fid_t
, fid_data
) + fid
->fid_len
)
85 return ERR_PTR(-EINVAL
);
87 rc
= zfs_vget(sb
, &ip
, fid
);
92 ASSERT((ip
!= NULL
) && !IS_ERR(ip
));
94 return zpl_dentry_obtain_alias(ip
);
97 static struct dentry
*
98 zpl_get_parent(struct dentry
*child
)
105 error
= -zfs_lookup(child
->d_inode
, "..", &ip
, 0, cr
, NULL
, NULL
);
107 ASSERT3S(error
, <=, 0);
110 return ERR_PTR(error
);
112 return zpl_dentry_obtain_alias(ip
);
115 const struct export_operations zpl_export_operations
= {
116 .encode_fh
= zpl_encode_fh
,
117 .fh_to_dentry
= zpl_fh_to_dentry
,
118 .get_parent
= zpl_get_parent