This source file includes following definitions.
- xfs_mount_common_sys
- xfs_mount_common
- xfs_unmount_common
- xfs_root_common
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <xfs/xfs_locl.h>
35
36 RCSID("$arla: xfs_vfsops-common.c,v 1.40 2003/06/02 18:26:40 lha Exp $");
37
38
39
40
41
42 #include <xfs/xfs_common.h>
43 #include <xfs/xfs_message.h>
44 #include <xfs/xfs_fs.h>
45 #include <xfs/xfs_dev.h>
46 #include <xfs/xfs_deb.h>
47 #include <xfs/xfs_syscalls.h>
48 #include <xfs/xfs_vfsops.h>
49
50 #ifdef HAVE_KERNEL_UDEV2DEV
51 #define VA_RDEV_TO_DEV(x) udev2dev(x, 0)
52 #else
53 #define VA_RDEV_TO_DEV(x) x
54 #endif
55
56
57 struct xfs xfs[NNNPFS];
58
59
60
61
62
63 int
64 xfs_mount_common_sys(struct mount *mp,
65 const char *path,
66 void *data,
67 struct nameidata *ndp,
68 d_thread_t *p)
69 {
70 struct vnode *devvp;
71 dev_t dev;
72 int error;
73 struct vattr vat;
74
75 NNPFSDEB(XDEBVFOPS, ("xfs_mount: "
76 "struct mount mp = %lx path = '%s' data = '%s'\n",
77 (unsigned long)mp, path, (char *)data));
78
79 #ifdef ARLA_KNFS
80 NNPFSDEB(XDEBVFOPS, ("xfs_mount: mount flags = %x\n", mp->mnt_flag));
81
82
83
84
85
86
87 if (mp->mnt_flag & MNT_UPDATE ||
88 mp->mnt_flag & MNT_DELEXPORT) {
89
90 NNPFSDEB(XDEBVFOPS,
91 ("xfs_mount: ignoreing MNT_UPDATE or MNT_DELEXPORT\n"));
92 return 0;
93 }
94 #endif
95
96 NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, data, p);
97 error = namei(ndp);
98 if (error) {
99 NNPFSDEB(XDEBVFOPS, ("namei failed, errno = %d\n", error));
100 return error;
101 }
102
103 devvp = ndp->ni_vp;
104
105 if (devvp->v_type != VCHR) {
106 vput(devvp);
107 NNPFSDEB(XDEBVFOPS, ("not VCHR (%d)\n", devvp->v_type));
108 return ENXIO;
109 }
110 #if defined(__osf__)
111 VOP_GETATTR(devvp, &vat, ndp->ni_cred, error);
112 #elif defined(HAVE_FREEBSD_THREAD)
113 error = VOP_GETATTR(devvp, &vat, p->td_proc->p_ucred, p);
114 #else
115 error = VOP_GETATTR(devvp, &vat, p->p_ucred, p);
116 #endif
117 vput(devvp);
118 if (error) {
119 NNPFSDEB(XDEBVFOPS, ("VOP_GETATTR failed, error = %d\n", error));
120 return error;
121 }
122
123 dev = VA_RDEV_TO_DEV(vat.va_rdev);
124
125 NNPFSDEB(XDEBVFOPS, ("dev = %d.%d\n", major(dev), minor(dev)));
126
127 if (!xfs_is_xfs_dev (dev)) {
128 NNPFSDEB(XDEBVFOPS, ("%s is not a xfs device\n", (char *)data));
129 return ENXIO;
130 }
131
132 if (xfs[minor(dev)].status & NNPFS_MOUNTED)
133 return EBUSY;
134
135 xfs[minor(dev)].status = NNPFS_MOUNTED;
136 xfs[minor(dev)].mp = mp;
137 xfs[minor(dev)].root = 0;
138 xfs[minor(dev)].nnodes = 0;
139 xfs[minor(dev)].fd = minor(dev);
140
141 nnfs_init_head(&xfs[minor(dev)].nodehead);
142
143 VFS_TO_NNPFS(mp) = &xfs[minor(dev)];
144 #if defined(HAVE_KERNEL_VFS_GETNEWFSID)
145 #if defined(HAVE_TWO_ARGUMENT_VFS_GETNEWFSID)
146 vfs_getnewfsid(mp, MOUNT_AFS);
147 #else
148 vfs_getnewfsid(mp);
149 #endif
150 #endif
151
152 mp->mnt_stat.f_bsize = DEV_BSIZE;
153 #ifndef __osf__
154 mp->mnt_stat.f_iosize = DEV_BSIZE;
155 mp->mnt_stat.f_owner = 0;
156 #endif
157 mp->mnt_stat.f_blocks = 4711 * 4711;
158 mp->mnt_stat.f_bfree = 4711 * 4711;
159 mp->mnt_stat.f_bavail = 4711 * 4711;
160 mp->mnt_stat.f_files = 4711;
161 mp->mnt_stat.f_ffree = 4711;
162 mp->mnt_stat.f_flags = mp->mnt_flag;
163
164 #ifdef __osf__
165 mp->mnt_stat.f_fsid.val[0] = dev;
166 mp->mnt_stat.f_fsid.val[1] = MOUNT_NNPFS;
167
168 MALLOC(mp->m_stat.f_mntonname, char *, strlen(path) + 1,
169 M_PATHNAME, M_WAITOK);
170 strcpy(mp->m_stat.f_mntonname, path);
171
172 MALLOC(mp->m_stat.f_mntfromname, char *, sizeof("arla"),
173 M_PATHNAME, M_WAITOK);
174 strcpy(mp->m_stat.f_mntfromname, "arla");
175 #else
176 strncpy(mp->mnt_stat.f_mntonname,
177 path,
178 sizeof(mp->mnt_stat.f_mntonname));
179
180 strncpy(mp->mnt_stat.f_mntfromname,
181 data,
182 sizeof(mp->mnt_stat.f_mntfromname));
183
184 strncpy(mp->mnt_stat.f_fstypename,
185 "xfs",
186 sizeof(mp->mnt_stat.f_fstypename));
187 #endif
188
189 return 0;
190 }
191
192 int
193 xfs_mount_common(struct mount *mp,
194 const char *user_path,
195 void *user_data,
196 struct nameidata *ndp,
197 d_thread_t *p)
198 {
199 char *path = NULL;
200 char *data = NULL;
201 size_t count;
202 int error = 0;
203
204 data = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
205 if (data == NULL) {
206 error = ENOMEM;
207 goto done;
208 }
209 path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
210 if (path == NULL) {
211 error = ENOMEM;
212 goto done;
213 }
214
215 error = copyinstr(user_path, path, MAXPATHLEN, &count);
216 if (error)
217 goto done;
218
219 error = copyinstr(user_data, data, MAXPATHLEN, &count);
220 if (error)
221 goto done;
222 error = xfs_mount_common_sys (mp, path, data, ndp, p);
223 done:
224 free(data, M_TEMP);
225 free(path, M_TEMP);
226 return(error);
227 }
228
229 #ifdef HAVE_KERNEL_DOFORCE
230 extern int doforce;
231 #endif
232
233 int
234 xfs_unmount_common(struct mount *mp, int mntflags)
235 {
236 struct xfs *xfsp = VFS_TO_NNPFS(mp);
237 int flags = 0;
238 int error;
239
240 if (mntflags & MNT_FORCE) {
241 #ifdef HAVE_KERNEL_DOFORCE
242 if (!doforce)
243 return EINVAL;
244 #endif
245 flags |= FORCECLOSE;
246 }
247
248 error = free_all_xfs_nodes(xfsp, flags, 1);
249 if (error)
250 return error;
251
252 xfsp->status = 0;
253 NNPFS_TO_VFS(xfsp) = NULL;
254 return 0;
255 }
256
257 int
258 xfs_root_common(struct mount *mp, struct vnode **vpp,
259 d_thread_t *proc, struct ucred *cred)
260 {
261 struct xfs *xfsp = VFS_TO_NNPFS(mp);
262 struct xfs_message_getroot msg;
263 int error;
264
265 do {
266 if (xfsp->root != NULL) {
267 *vpp = XNODE_TO_VNODE(xfsp->root);
268 xfs_do_vget(*vpp, LK_EXCLUSIVE, proc);
269 return 0;
270 }
271 msg.header.opcode = NNPFS_MSG_GETROOT;
272 msg.cred.uid = cred->cr_uid;
273 msg.cred.pag = xfs_get_pag(cred);
274 error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), proc);
275 if (error == 0)
276 error = ((struct xfs_message_wakeup *) & msg)->error;
277 } while (error == 0);
278
279
280
281
282
283 if ((error = xfs_make_dead_vnode(mp, vpp)))
284 return error;
285
286 NNPFS_MAKE_VROOT(*vpp);
287 return 0;
288 }