[BACK]Return to xfs_message.c CVS log [TXT][DIR] Up to [local] / sys / xfs

Annotation of sys/xfs/xfs_message.c, Revision 1.1

1.1     ! nbrk        1: /*
        !             2:  * Copyright (c) 1995 - 2002 Kungliga Tekniska Högskolan
        !             3:  * (Royal Institute of Technology, Stockholm, Sweden).
        !             4:  * All rights reserved.
        !             5:  *
        !             6:  * Redistribution and use in source and binary forms, with or without
        !             7:  * modification, are permitted provided that the following conditions
        !             8:  * are met:
        !             9:  *
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  *
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  *
        !            17:  * 3. Neither the name of the Institute nor the names of its contributors
        !            18:  *    may be used to endorse or promote products derived from this software
        !            19:  *    without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
        !            22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
        !            25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            31:  * SUCH DAMAGE.
        !            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 /* LK_SHARED */, 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 /* LK_SHARED */, 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:         /* If open for writing, return immediately. Last close:er wins! */
        !           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 /* __FreeBSD__ */
        !           305:
        !           306:        /* If node is in use, mark as stale */
        !           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:        /* Dir changed, must invalidate DNLC. */
        !           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:            /* XXX */
        !           342: #endif /* __osf__ */
        !           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:  * Try to clean out nodes for the userland daemon
        !           383:  */
        !           384:
        !           385: static void
        !           386: gc_vnode (struct vnode *vp,
        !           387:          d_thread_t *p)
        !           388: {
        !           389:     /* This node is on the freelist */
        !           390:     if (vp->v_usecount <= 0) {
        !           391:
        !           392:        /*  DIAGNOSTIC */
        !           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 /* !__osf__ */
        !           409:
        !           410: /*
        !           411:  * Try to clean out nodes for the userland daemon
        !           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:     /* This node is on the freelist */
        !           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 /* __FreeBSD__ */
        !           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 /* DIAGNOSTIC */
        !           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:  * Probe what version of xfs this support
        !           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: }

CVSweb