This source file includes following definitions.
- send_inactive_node
- xfs_message_installroot
- xfs_message_installnode
- xfs_message_installattr
- xfs_message_installdata
- xfs_message_invalidnode
- xfs_message_updatefid
- gc_vnode
- gc_vnode
- xfs_message_gc_nodes
- xfs_message_version
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 #include <xfs/xfs_deb.h>
36 #include <xfs/xfs_fs.h>
37 #include <xfs/xfs_message.h>
38 #include <xfs/xfs_msg_locl.h>
39 #include <xfs/xfs_syscalls.h>
40 #include <xfs/xfs_vfsops.h>
41 #include <xfs/xfs_vnodeops.h>
42 #include <xfs/xfs_dev.h>
43
44 RCSID("$arla: xfs_message.c,v 1.84 2003/06/02 18:25:20 lha Exp $");
45
46 static void
47 send_inactive_node(int fd, xfs_handle *handle)
48 {
49 struct xfs_message_inactivenode msg;
50
51 msg.header.opcode = NNPFS_MSG_INACTIVENODE;
52 msg.handle = *handle;
53 msg.flag = NNPFS_NOREFS | NNPFS_DELETE;
54 xfs_message_send(fd, &msg.header, sizeof(msg));
55 }
56
57
58 int
59 xfs_message_installroot(int fd,
60 struct xfs_message_installroot * message,
61 u_int size,
62 d_thread_t *p)
63 {
64 int error = 0;
65
66 NNPFSDEB(XDEBMSG, ("xfs_message_installroot (%d,%d,%d,%d)\n",
67 message->node.handle.a,
68 message->node.handle.b,
69 message->node.handle.c,
70 message->node.handle.d));
71
72 if (xfs[fd].root != NULL) {
73 printf("NNPFS PANIC WARNING! xfs_message_installroot: called again!\n");
74 error = EBUSY;
75 } else {
76 error = new_xfs_node(&xfs[fd], &message->node, &xfs[fd].root, p);
77 if (error)
78 return error;
79 NNPFS_MAKE_VROOT(xfs[fd].root->vn);
80 }
81 return error;
82 }
83
84 int
85 xfs_message_installnode(int fd,
86 struct xfs_message_installnode * message,
87 u_int size,
88 d_thread_t *p)
89 {
90 int error = 0;
91 struct xfs_node *n, *dp;
92
93 NNPFSDEB(XDEBMSG, ("xfs_message_installnode (%d,%d,%d,%d)\n",
94 message->node.handle.a,
95 message->node.handle.b,
96 message->node.handle.c,
97 message->node.handle.d));
98
99 retry:
100 dp = xfs_node_find(&xfs[fd].nodehead, &message->parent_handle);
101 if (dp) {
102 struct vnode *t_vnode = XNODE_TO_VNODE(dp);
103
104 NNPFSDEB(XDEBMSG, ("xfs_message_installnode: t_vnode = %lx\n",
105 (unsigned long)t_vnode));
106
107 if (xfs_do_vget(t_vnode, 0 , p))
108 goto retry;
109
110 error = new_xfs_node(&xfs[fd], &message->node, &n, p);
111 if (error) {
112 vrele (t_vnode);
113 return error;
114 }
115
116 xfs_dnlc_enter_name(t_vnode,
117 message->name,
118 XNODE_TO_VNODE(n));
119 vrele (XNODE_TO_VNODE(n));
120 vrele (t_vnode);
121 } else {
122 printf("NNPFS PANIC WARNING! xfs_message_installnode: no parent\n");
123 error = ENOENT;
124 }
125 NNPFSDEB(XDEBMSG, ("return: xfs_message_installnode: %d\n", error));
126
127 return error;
128 }
129
130 int
131 xfs_message_installattr(int fd,
132 struct xfs_message_installattr * message,
133 u_int size,
134 d_thread_t *p)
135 {
136 int error = 0;
137 struct xfs_node *t;
138
139 NNPFSDEB(XDEBMSG, ("xfs_message_installattr (%d,%d,%d,%d) \n",
140 message->node.handle.a,
141 message->node.handle.b,
142 message->node.handle.c,
143 message->node.handle.d));
144
145 t = xfs_node_find(&xfs[fd].nodehead, &message->node.handle);
146 if (t != 0) {
147 t->tokens = message->node.tokens;
148 if ((t->tokens & NNPFS_DATA_MASK) && DATA_FROM_XNODE(t) == NULL) {
149 printf ("xfs_message_installattr: tokens and no data\n");
150 t->tokens &= ~NNPFS_DATA_MASK;
151 }
152 xfs_attr2vattr(&message->node.attr, &t->attr, 0);
153 if ((t->flags & NNPFS_VMOPEN) == 0)
154 xfs_set_vp_size(XNODE_TO_VNODE(t), t->attr.va_size);
155 bcopy(message->node.id, t->id, sizeof(t->id));
156 bcopy(message->node.rights, t->rights, sizeof(t->rights));
157 t->anonrights = message->node.anonrights;
158 } else {
159 NNPFSDEB(XDEBMSG, ("xfs_message_installattr: no such node\n"));
160 }
161
162 return error;
163 }
164
165 int
166 xfs_message_installdata(int fd,
167 struct xfs_message_installdata * message,
168 u_int size,
169 d_thread_t *p)
170 {
171 struct xfs_node *t;
172 int error = 0;
173
174 NNPFSDEB(XDEBMSG, ("xfs_message_installdata (%d,%d,%d,%d)\n",
175 message->node.handle.a,
176 message->node.handle.b,
177 message->node.handle.c,
178 message->node.handle.d));
179
180 retry:
181 t = xfs_node_find(&xfs[fd].nodehead, &message->node.handle);
182 if (t != NULL) {
183 struct xfs_fhandle_t *fh =
184 (struct xfs_fhandle_t *)&message->cache_handle;
185 struct vnode *t_vnode = XNODE_TO_VNODE(t);
186 struct vnode *vp;
187
188 message->cache_name[sizeof(message->cache_name)-1] = '\0';
189 NNPFSDEB(XDEBMSG, ("cache_name = '%s'\n", message->cache_name));
190
191 if (xfs_do_vget(t_vnode, 0 , p))
192 goto retry;
193
194 if (message->flag & NNPFS_ID_HANDLE_VALID) {
195 error = xfs_fhlookup (p, fh, &vp);
196 } else {
197 error = EINVAL;
198 }
199 if (error != 0) {
200 #ifdef __osf__
201 struct nameidata *ndp = &u.u_nd;
202 #else
203 struct nameidata nd;
204 struct nameidata *ndp = &nd;
205 #endif
206
207 NNPFSDEB(XDEBMSG,
208 ("xfs_message_installdata: fhlookup failed: %d, "
209 "opening by name\n", error));
210
211 NDINIT(ndp, LOOKUP, FOLLOW | NNPFS_LOCKLEAF, UIO_SYSSPACE,
212 message->cache_name, p);
213 error = namei(ndp);
214 vp = ndp->ni_vp;
215 }
216
217 if (error == 0) {
218 #ifndef __osf__
219 xfs_vfs_unlock(vp, p);
220 #endif
221 if (DATA_FROM_XNODE(t))
222 vrele(DATA_FROM_XNODE(t));
223 DATA_FROM_XNODE(t) = vp;
224
225 NNPFSDEB(XDEBMSG, ("xfs_message_installdata: t = %lx;"
226 " tokens = %x\n",
227 (unsigned long)t, message->node.tokens));
228
229 t->tokens = message->node.tokens;
230 xfs_attr2vattr(&message->node.attr, &t->attr, 1);
231 if ((t->flags & NNPFS_VMOPEN) == 0)
232 xfs_set_vp_size(XNODE_TO_VNODE(t), t->attr.va_size);
233 if (XNODE_TO_VNODE(t)->v_type == VDIR
234 && (message->flag & NNPFS_ID_INVALID_DNLC))
235 xfs_dnlc_purge (XNODE_TO_VNODE(t));
236 bcopy(message->node.id, t->id, sizeof(t->id));
237 bcopy(message->node.rights, t->rights, sizeof(t->rights));
238 t->anonrights = message->node.anonrights;
239 t->offset = message->offset;
240 #if 0
241 if (message->flag & NNPFS_ID_AFSDIR)
242 t->flags |= NNPFS_AFSDIR;
243 #endif
244 } else {
245 printf("NNPFS PANIC WARNING! xfs_message_installdata failed!\n");
246 printf("Reason: lookup failed on cache file '%s', error = %d\n",
247 message->cache_name, error);
248 }
249 vrele (t_vnode);
250 } else {
251 printf("NNPFS PANIC WARNING! xfs_message_installdata failed\n");
252 printf("Reason: No node to install the data into!\n");
253 error = ENOENT;
254 }
255
256 return error;
257 }
258
259 #ifdef __osf__
260 #define xfs_writecount v_wrcnt
261 #else
262 #define xfs_writecount v_writecount
263 #endif
264
265 int
266 xfs_message_invalidnode(int fd,
267 struct xfs_message_invalidnode * message,
268 u_int size,
269 d_thread_t *p)
270 {
271 int error = 0;
272 struct xfs_node *t;
273
274 NNPFSDEB(XDEBMSG, ("xfs_message_invalidnode (%d,%d,%d,%d)\n",
275 message->handle.a,
276 message->handle.b,
277 message->handle.c,
278 message->handle.d));
279
280 #ifdef __APPLE__
281 retry:
282 #endif
283 t = xfs_node_find(&xfs[fd].nodehead, &message->handle);
284 if (t != 0) {
285 struct vnode *vp = XNODE_TO_VNODE(t);
286
287
288 if (vp->v_usecount >= 0 && vp->xfs_writecount >= 1)
289 return 0;
290
291 #ifdef __FreeBSD__
292 {
293 vm_object_t obj = vp->v_object;
294
295 if (obj != NULL
296 && (obj->ref_count != 0
297 #ifdef OBJ_MIGHTBEDIRTY
298 || (obj->flags & OBJ_MIGHTBEDIRTY) != 0
299 #endif
300 ))
301 return 0;
302
303 }
304 #endif
305
306
307 if (vp->v_usecount > 0 && vp->v_type != VDIR) {
308 #ifdef __APPLE__
309 if (vget(vp, 0, p))
310 goto retry;
311
312 if (UBCISVALID(vp) && !ubc_isinuse(vp, 1)) {
313 ubc_setsize(vp, 0);
314 vrele(vp);
315 } else {
316 vrele(vp);
317 t->flags |= NNPFS_STALE;
318 return 0;
319 }
320 #else
321 t->flags |= NNPFS_STALE;
322 return 0;
323 #endif
324 }
325
326 if (DATA_FROM_XNODE(t)) {
327 vrele(DATA_FROM_XNODE(t));
328 DATA_FROM_XNODE(t) = (struct vnode *) 0;
329 }
330 NNPFS_TOKEN_CLEAR(t, ~0,
331 NNPFS_OPEN_MASK | NNPFS_ATTR_MASK |
332 NNPFS_DATA_MASK | NNPFS_LOCK_MASK);
333
334 if (vp->v_type == VDIR)
335 xfs_dnlc_purge(vp);
336 if (vp->v_usecount == 0) {
337 #ifndef __osf__
338 NNPFSDEB(XDEBVNOPS, ("xfs_message_invalidnode: vrecycle\n"));
339 vrecycle(vp, p);
340 #else
341
342 #endif
343 }
344 } else {
345 NNPFSDEB(XDEBMSG, ("xfs_message_invalidnode: no such node\n"));
346 send_inactive_node(fd, &message->handle);
347 error = ENOENT;
348 }
349
350 return error;
351 }
352
353 int
354 xfs_message_updatefid(int fd,
355 struct xfs_message_updatefid * message,
356 u_int size,
357 d_thread_t *p)
358 {
359 int error = 0;
360
361 NNPFSDEB(XDEBMSG, ("xfs_message_updatefid (%d,%d,%d,%d) (%d,%d,%d,%d)\n",
362 message->old_handle.a,
363 message->old_handle.b,
364 message->old_handle.c,
365 message->old_handle.d,
366 message->new_handle.a,
367 message->new_handle.b,
368 message->new_handle.c,
369 message->new_handle.d));
370
371 error = xfs_update_handle(&xfs[fd].nodehead,
372 &message->old_handle,
373 &message->new_handle);
374 if (error)
375 printf ("NNPFS PANIC WARNING! xfs_message_updatefid: %d\n", error);
376 return error;
377 }
378
379 #if __osf__
380
381
382
383
384
385 static void
386 gc_vnode (struct vnode *vp,
387 d_thread_t *p)
388 {
389
390 if (vp->v_usecount <= 0) {
391
392
393 if (vp->v_usecount < 0) {
394 vprint("vrele: bad ref count", vp);
395 panic("vrele: ref cnt");
396 }
397
398 NNPFSDEB(XDEBMSG, ("xfs_message_gc: success\n"));
399
400 vgone(vp, VX_NOSLEEP, NULL);
401 } else {
402 NNPFSDEB(XDEBMSG, ("xfs_message_gc: used\n"));
403 }
404
405 }
406
407
408 #else
409
410
411
412
413
414 static void
415 gc_vnode (struct vnode *vp,
416 d_thread_t *p)
417 {
418 #ifdef HAVE_SYS_MUTEX_H
419 mtx_lock(&vp->v_interlock);
420 #else
421 simple_lock(&vp->v_interlock);
422 #endif
423
424
425 if (vp->v_usecount <= 0) {
426 #if __FreeBSD__
427 vm_object_t obj;
428
429 obj = vp->v_object;
430
431 if (obj != NULL
432 && (obj->ref_count != 0
433 #ifdef OBJ_MIGHTBEDIRTY
434 || (obj->flags & OBJ_MIGHTBEDIRTY) != 0
435 #endif
436 )) {
437 #ifdef HAVE_SYS_MUTEX_H
438 mtx_unlock(&vp->v_interlock);
439 #else
440 simple_unlock (&vp->v_interlock);
441 #endif
442 return;
443 }
444 #endif
445
446 #ifdef DIAGNOSTIC
447 if (vp->v_usecount < 0 || vp->v_writecount != 0) {
448 vprint("vrele: bad ref count", vp);
449 panic("vrele: ref cnt");
450 }
451 #endif
452
453 NNPFSDEB(XDEBMSG, ("xfs_message_gc: success\n"));
454
455 #ifdef HAVE_KERNEL_VGONEL
456 vgonel (vp, p);
457 #else
458 #ifdef HAVE_SYS_MUTEX_H
459 mtx_unlock(&vp->v_interlock);
460 #else
461 simple_unlock(&vp->v_interlock);
462 #endif
463 vgone (vp);
464 #endif
465
466 } else {
467 #ifdef HAVE_SYS_MUTEX_H
468 mtx_unlock(&vp->v_interlock);
469 #else
470 simple_unlock(&vp->v_interlock);
471 #endif
472 NNPFSDEB(XDEBMSG, ("xfs_message_gc: used\n"));
473 }
474
475 }
476
477 #endif
478
479 int
480 xfs_message_gc_nodes(int fd,
481 struct xfs_message_gc_nodes *message,
482 u_int size,
483 d_thread_t *p)
484 {
485 struct xfs_node *node;
486 int i;
487
488 NNPFSDEB(XDEBMSG, ("xfs_message_gc\n"));
489
490 for (i = 0; i < message->len; i++) {
491 node = xfs_node_find (&xfs[fd].nodehead, &message->handle[i]);
492 if (node)
493 gc_vnode(XNODE_TO_VNODE(node), p);
494 else {
495 NNPFSDEB(XDEBMSG, ("xfs_message_gc_nodes: no such node\n"));
496 send_inactive_node(fd, &message->handle[i]);
497 }
498 }
499
500 return 0;
501 }
502
503
504
505
506
507
508 int
509 xfs_message_version(int fd,
510 struct xfs_message_version *message,
511 u_int size,
512 d_thread_t *p)
513 {
514 struct xfs_message_wakeup msg;
515 int ret;
516
517 ret = NNPFS_VERSION;
518
519 msg.header.opcode = NNPFS_MSG_WAKEUP;
520 msg.sleepers_sequence_num = message->header.sequence_num;
521 msg.error = ret;
522
523 return xfs_message_send(fd,
524 (struct xfs_message_header *) &msg, sizeof(msg));
525 }