1b819cea2SGordon Ross /*
2b819cea2SGordon Ross  * This file and its contents are supplied under the terms of the
3b819cea2SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4b819cea2SGordon Ross  * You may only use this file in accordance with the terms of version
5b819cea2SGordon Ross  * 1.0 of the CDDL.
6b819cea2SGordon Ross  *
7b819cea2SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8b819cea2SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9b819cea2SGordon Ross  * http://www.illumos.org/license/CDDL.
10b819cea2SGordon Ross  */
11b819cea2SGordon Ross 
12b819cea2SGordon Ross /*
13*55f0a249SGordon Ross  * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
14b819cea2SGordon Ross  */
15b819cea2SGordon Ross 
16b819cea2SGordon Ross #include <sys/types.h>
17b819cea2SGordon Ross #include <sys/param.h>
18b819cea2SGordon Ross #include <sys/t_lock.h>
19b819cea2SGordon Ross #include <sys/errno.h>
20b819cea2SGordon Ross #include <sys/cred.h>
21b819cea2SGordon Ross #include <sys/user.h>
22b819cea2SGordon Ross #include <sys/uio.h>
23b819cea2SGordon Ross #include <sys/file.h>
24b819cea2SGordon Ross #include <sys/pathname.h>
25b819cea2SGordon Ross #include <sys/vfs.h>
26b819cea2SGordon Ross #include <sys/vnode.h>
27b819cea2SGordon Ross #include <sys/stat.h>
28b819cea2SGordon Ross #include <sys/mode.h>
29b819cea2SGordon Ross #include <sys/conf.h>
30b819cea2SGordon Ross #include <sys/sysmacros.h>
31b819cea2SGordon Ross #include <sys/cmn_err.h>
32b819cea2SGordon Ross #include <sys/systm.h>
33b819cea2SGordon Ross #include <sys/kmem.h>
34b819cea2SGordon Ross #include <sys/debug.h>
35b819cea2SGordon Ross #include <sys/acl.h>
36b819cea2SGordon Ross #include <sys/nbmlock.h>
37b819cea2SGordon Ross #include <sys/fcntl.h>
38b819cea2SGordon Ross #include <sys/poll.h>
39b819cea2SGordon Ross 
40b819cea2SGordon Ross #include <errno.h>
41b819cea2SGordon Ross #include <fcntl.h>
42b819cea2SGordon Ross #include <unistd.h>
43b819cea2SGordon Ross 
44b819cea2SGordon Ross #include "vncache.h"
45b819cea2SGordon Ross 
46b819cea2SGordon Ross #define	VFTBITS(feature)	((feature) & 0xFFFFFFFFLL)
47b819cea2SGordon Ross 
48b819cea2SGordon Ross static uint64_t vfs_features = VFSFT_XVATTR;
49b819cea2SGordon Ross 
50b819cea2SGordon Ross vnode_t *rootdir = NULL;	/* pointer to root inode vnode. */
51b819cea2SGordon Ross 
52b819cea2SGordon Ross static struct vfs fake_rootvfs;
53*55f0a249SGordon Ross static struct vfsops fake_vfsops;
54b819cea2SGordon Ross struct vfs *rootvfs = NULL;
55*55f0a249SGordon Ross static struct vfssw fake_vfssw = {
56*55f0a249SGordon Ross 	.vsw_name = "fake"	/* see smb_tree.c:smb_mtype[] */
57*55f0a249SGordon Ross };
58b819cea2SGordon Ross 
59b819cea2SGordon Ross int
fksmbsrv_vfs_init(void)60b819cea2SGordon Ross fksmbsrv_vfs_init(void)
61b819cea2SGordon Ross {
62b819cea2SGordon Ross 	struct stat st;
63b819cea2SGordon Ross 	int err, fd;
64b819cea2SGordon Ross 	vnode_t *vp;
65b819cea2SGordon Ross 	char *name = "/";
66b819cea2SGordon Ross 
67b819cea2SGordon Ross 	if (rootvfs == NULL) {
68b819cea2SGordon Ross 		rootvfs = &fake_rootvfs;
69b819cea2SGordon Ross 		rootvfs->vfs_mntpt = refstr_alloc(name);
70b819cea2SGordon Ross 		rootvfs->vfs_fsid.val[0] = 1;
71*55f0a249SGordon Ross 		rootvfs->vfs_op = &fake_vfsops;
72b819cea2SGordon Ross 	}
73b819cea2SGordon Ross 
74b819cea2SGordon Ross 	if (rootdir == NULL) {
75b819cea2SGordon Ross 		if (lstat(name, &st) == -1)
76b819cea2SGordon Ross 			return (errno);
77b819cea2SGordon Ross 		fd = open(name, O_RDONLY, 0);
78b819cea2SGordon Ross 		if (fd < 0) {
79b819cea2SGordon Ross 			return (errno);
80b819cea2SGordon Ross 		}
81b819cea2SGordon Ross 		if (fstat(fd, &st) == -1) {
82b819cea2SGordon Ross 			err = errno;
83b819cea2SGordon Ross 			(void) close(fd);
84b819cea2SGordon Ross 			return (err);
85b819cea2SGordon Ross 		}
86b819cea2SGordon Ross 		vp = vncache_enter(&st, NULL, "", fd);
87b819cea2SGordon Ross 		/* extra hold for rootvp */
88b819cea2SGordon Ross 		vn_hold(vp);
89b819cea2SGordon Ross 		rootdir = vp;
90b819cea2SGordon Ross 
91b819cea2SGordon Ross 		/* VFS stuff in global zone struct. */
92b819cea2SGordon Ross 		zone0.zone_rootvp = rootdir;
93b819cea2SGordon Ross 		zone0.zone_rootpath = "/";
94b819cea2SGordon Ross 	}
95b819cea2SGordon Ross 
96b819cea2SGordon Ross 	return (0);
97b819cea2SGordon Ross 
98b819cea2SGordon Ross }
99b819cea2SGordon Ross 
100b819cea2SGordon Ross 
101b819cea2SGordon Ross /*
102b819cea2SGordon Ross  * Query a vfs for a feature.
103b819cea2SGordon Ross  * Returns 1 if feature is present, 0 if not
104b819cea2SGordon Ross  */
105b819cea2SGordon Ross /* ARGSUSED */
106b819cea2SGordon Ross int
vfs_has_feature(vfs_t * vfsp,vfs_feature_t feature)107b819cea2SGordon Ross vfs_has_feature(vfs_t *vfsp, vfs_feature_t feature)
108b819cea2SGordon Ross {
109b819cea2SGordon Ross 	int	ret = 0;
110b819cea2SGordon Ross 
111b819cea2SGordon Ross 	if (vfs_features & VFTBITS(feature))
112b819cea2SGordon Ross 		ret = 1;
113b819cea2SGordon Ross 
114b819cea2SGordon Ross 	return (ret);
115b819cea2SGordon Ross }
116b819cea2SGordon Ross 
117b819cea2SGordon Ross /* ARGSUSED */
118b819cea2SGordon Ross struct vfs *
getvfs(fsid_t * fsid)119b819cea2SGordon Ross getvfs(fsid_t *fsid)
120b819cea2SGordon Ross {
121b819cea2SGordon Ross 	return (rootvfs);
122b819cea2SGordon Ross }
123b819cea2SGordon Ross 
124b819cea2SGordon Ross vfsops_t *
vfs_getops(vfs_t * vfsp)125b819cea2SGordon Ross vfs_getops(vfs_t *vfsp)
126b819cea2SGordon Ross {
127b819cea2SGordon Ross 	return (vfsp->vfs_op);
128b819cea2SGordon Ross }
129b819cea2SGordon Ross 
130b819cea2SGordon Ross /* ARGSUSED */
131b819cea2SGordon Ross struct vfssw *
vfs_getvfsswbyvfsops(vfsops_t * vfsops)132b819cea2SGordon Ross vfs_getvfsswbyvfsops(vfsops_t *vfsops)
133b819cea2SGordon Ross {
134*55f0a249SGordon Ross 	if (vfsops == &fake_vfsops)
135*55f0a249SGordon Ross 		return (&fake_vfssw);
136b819cea2SGordon Ross 	return (NULL);
137b819cea2SGordon Ross }
138b819cea2SGordon Ross 
139b819cea2SGordon Ross /* ARGSUSED */
140b819cea2SGordon Ross void
vfs_unrefvfssw(struct vfssw * vswp)141b819cea2SGordon Ross vfs_unrefvfssw(struct vfssw *vswp)
142b819cea2SGordon Ross {
143b819cea2SGordon Ross }
144b819cea2SGordon Ross 
145b819cea2SGordon Ross /* ARGSUSED */
146b819cea2SGordon Ross int
fsop_root(vfs_t * vfsp,vnode_t ** vpp)147b819cea2SGordon Ross fsop_root(vfs_t *vfsp, vnode_t **vpp)
148b819cea2SGordon Ross {
149b819cea2SGordon Ross 	vnode_t *vp;
150b819cea2SGordon Ross 
151b819cea2SGordon Ross 	if ((vp = rootdir) == NULL)
152b819cea2SGordon Ross 		return (ENXIO);
153b819cea2SGordon Ross 
154b819cea2SGordon Ross 	vn_hold(vp);
155b819cea2SGordon Ross 	*vpp = vp;
156b819cea2SGordon Ross 	return (0);
157b819cea2SGordon Ross }
158b819cea2SGordon Ross 
159b819cea2SGordon Ross /* ARGSUSED */
160b819cea2SGordon Ross int
fsop_statfs(vfs_t * vfsp,statvfs64_t * sp)161b819cea2SGordon Ross fsop_statfs(vfs_t *vfsp, statvfs64_t *sp)
162b819cea2SGordon Ross {
163b819cea2SGordon Ross 	vnode_t *vp;
164b819cea2SGordon Ross 	int rc;
165b819cea2SGordon Ross 
166b819cea2SGordon Ross 	if ((vp = rootdir) == NULL)
167b819cea2SGordon Ross 		return (ENXIO);
168b819cea2SGordon Ross 
169b819cea2SGordon Ross 	rc = fstatvfs64(vp->v_fd, sp);
170b819cea2SGordon Ross 	if (rc == -1) {
171b819cea2SGordon Ross 		rc = errno;
172b819cea2SGordon Ross 	}
173b819cea2SGordon Ross 
174b819cea2SGordon Ross 	return (rc);
175b819cea2SGordon Ross }
176b819cea2SGordon Ross 
177b819cea2SGordon Ross refstr_t *
vfs_getmntpoint(const struct vfs * vfsp)178b819cea2SGordon Ross vfs_getmntpoint(const struct vfs *vfsp)
179b819cea2SGordon Ross {
180b819cea2SGordon Ross 	refstr_t *mntpt;
181b819cea2SGordon Ross 
182b819cea2SGordon Ross 	mntpt = vfsp->vfs_mntpt;
183b819cea2SGordon Ross 	refstr_hold(mntpt);
184b819cea2SGordon Ross 
185b819cea2SGordon Ross 	return (mntpt);
186b819cea2SGordon Ross }
187b819cea2SGordon Ross 
188b819cea2SGordon Ross /* ARGSUSED */
189b819cea2SGordon Ross void
vfs_hold(vfs_t * vfsp)190b819cea2SGordon Ross vfs_hold(vfs_t *vfsp)
191b819cea2SGordon Ross {
192b819cea2SGordon Ross }
193b819cea2SGordon Ross 
194b819cea2SGordon Ross /* ARGSUSED */
195b819cea2SGordon Ross void
vfs_rele(vfs_t * vfsp)196b819cea2SGordon Ross vfs_rele(vfs_t *vfsp)
197b819cea2SGordon Ross {
198b819cea2SGordon Ross }
199b819cea2SGordon Ross 
200b819cea2SGordon Ross /* ARGSUSED */
201b819cea2SGordon Ross int
vfs_lock(vfs_t * vfsp)202b819cea2SGordon Ross vfs_lock(vfs_t *vfsp)
203b819cea2SGordon Ross {
204b819cea2SGordon Ross 	return (0);
205b819cea2SGordon Ross }
206b819cea2SGordon Ross 
207b819cea2SGordon Ross /* ARGSUSED */
208b819cea2SGordon Ross int
vfs_rlock(vfs_t * vfsp)209b819cea2SGordon Ross vfs_rlock(vfs_t *vfsp)
210b819cea2SGordon Ross {
211b819cea2SGordon Ross 	return (0);
212b819cea2SGordon Ross }
213b819cea2SGordon Ross 
214b819cea2SGordon Ross /* ARGSUSED */
215b819cea2SGordon Ross void
vfs_lock_wait(vfs_t * vfsp)216b819cea2SGordon Ross vfs_lock_wait(vfs_t *vfsp)
217b819cea2SGordon Ross {
218b819cea2SGordon Ross }
219b819cea2SGordon Ross 
220b819cea2SGordon Ross /* ARGSUSED */
221b819cea2SGordon Ross void
vfs_rlock_wait(vfs_t * vfsp)222b819cea2SGordon Ross vfs_rlock_wait(vfs_t *vfsp)
223b819cea2SGordon Ross {
224b819cea2SGordon Ross }
225b819cea2SGordon Ross 
226b819cea2SGordon Ross /* ARGSUSED */
227b819cea2SGordon Ross void
vfs_unlock(vfs_t * vfsp)228b819cea2SGordon Ross vfs_unlock(vfs_t *vfsp)
229b819cea2SGordon Ross {
230b819cea2SGordon Ross }
231b819cea2SGordon Ross 
232b819cea2SGordon Ross 
233b819cea2SGordon Ross static u_longlong_t fs_caller_id;
234b819cea2SGordon Ross u_longlong_t
fs_new_caller_id(void)235b819cea2SGordon Ross fs_new_caller_id(void)
236b819cea2SGordon Ross {
237b819cea2SGordon Ross 	return (++fs_caller_id);
238b819cea2SGordon Ross }
239b819cea2SGordon Ross 
240b819cea2SGordon Ross static sysid_t lm_sysid;
241b819cea2SGordon Ross sysid_t
lm_alloc_sysidt(void)242b819cea2SGordon Ross lm_alloc_sysidt(void)
243b819cea2SGordon Ross {
244b819cea2SGordon Ross 	return (++lm_sysid);
245b819cea2SGordon Ross }
246b819cea2SGordon Ross 
247b819cea2SGordon Ross /* ARGSUSED */
248b819cea2SGordon Ross void
lm_free_sysidt(sysid_t id)249b819cea2SGordon Ross lm_free_sysidt(sysid_t id)
250b819cea2SGordon Ross {
251b819cea2SGordon Ross }
252