[BACK]Return to vnode.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/vnode.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: vnode.h,v 1.88 2007/06/14 20:36:34 otto Exp $ */
        !             2: /*     $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $   */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1989, 1993
        !             6:  *     The Regents of the University of California.  All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            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:  * 3. Neither the name of the University nor the names of its contributors
        !            17:  *    may be used to endorse or promote products derived from this software
        !            18:  *    without specific prior written permission.
        !            19:  *
        !            20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            30:  * SUCH DAMAGE.
        !            31:  *
        !            32:  *     @(#)vnode.h     8.11 (Berkeley) 11/21/94
        !            33:  */
        !            34:
        !            35: #include <sys/types.h>
        !            36: #include <sys/queue.h>
        !            37: #include <sys/lock.h>
        !            38: #include <sys/selinfo.h>
        !            39:
        !            40: #include <uvm/uvm.h>
        !            41: #include <uvm/uvm_vnode.h>
        !            42:
        !            43: /*
        !            44:  * The vnode is the focus of all file activity in UNIX.  There is a
        !            45:  * unique vnode allocated for each active file, each current directory,
        !            46:  * each mounted-on file, text file, and the root.
        !            47:  */
        !            48:
        !            49: /*
        !            50:  * Vnode types.  VNON means no type.
        !            51:  */
        !            52: enum vtype     { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
        !            53:
        !            54: #define        VTYPE_NAMES \
        !            55:     "VNON", "VREG", "VDIR", "VBLK", "VCHR", "VLNK", "VSOCK", "VFIFO", "VBAD"
        !            56:
        !            57: /*
        !            58:  * Vnode tag types.
        !            59:  * These are for the benefit of external programs only (e.g., pstat)
        !            60:  * and should NEVER be inspected by the kernel.
        !            61:  *
        !            62:  * Note that v_tag is actually used to tell MFS from FFS, and EXT2FS from
        !            63:  * the rest, so don't believe the above comment!
        !            64:  */
        !            65: enum vtagtype  {
        !            66:        VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS,
        !            67:        VT_PORTAL, VT_PROCFS, VT_AFS, VT_ISOFS, VT_ADOSFS,
        !            68:        VT_EXT2FS, VT_VFS, VT_XFS, VT_NTFS, VT_UDF
        !            69: };
        !            70:
        !            71: #define        VTAG_NAMES \
        !            72:     "NON", "UFS", "NFS", "MFS", "MSDOSFS",                     \
        !            73:     "PORTAL", "PROCFS", "AFS", "ISOFS", "ADOSFS",              \
        !            74:     "EXT2FS", "VFS", "XFS", "NTFS", "UDF"
        !            75:
        !            76: /*
        !            77:  * Each underlying filesystem allocates its own private area and hangs
        !            78:  * it from v_data.  If non-null, this area is freed in getnewvnode().
        !            79:  */
        !            80: LIST_HEAD(buflists, buf);
        !            81:
        !            82: struct vnode {
        !            83:        struct uvm_vnode v_uvm;                 /* uvm data */
        !            84:        int     (**v_op)(void *);               /* vnode operations vector */
        !            85:        enum    vtype v_type;                   /* vnode type */
        !            86:        u_int   v_flag;                         /* vnode flags (see below) */
        !            87:        u_int   v_usecount;                     /* reference count of users */
        !            88:        /* reference count of writers */
        !            89:        u_int   v_writecount;
        !            90:        /* Flags that can be read/written in interrupts */
        !            91:        u_int   v_bioflag;
        !            92:        u_int   v_holdcnt;                      /* buffer references */
        !            93:        u_int   v_id;                           /* capability identifier */
        !            94:        struct  mount *v_mount;                 /* ptr to vfs we are in */
        !            95:        TAILQ_ENTRY(vnode) v_freelist;          /* vnode freelist */
        !            96:        LIST_ENTRY(vnode) v_mntvnodes;          /* vnodes for mount point */
        !            97:        struct  buflists v_cleanblkhd;          /* clean blocklist head */
        !            98:        struct  buflists v_dirtyblkhd;          /* dirty blocklist head */
        !            99:        u_int   v_numoutput;                    /* num of writes in progress */
        !           100:        LIST_ENTRY(vnode) v_synclist;           /* vnode with dirty buffers */
        !           101:        union {
        !           102:                struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
        !           103:                struct socket   *vu_socket;     /* unix ipc (VSOCK) */
        !           104:                struct specinfo *vu_specinfo;   /* device (VCHR, VBLK) */
        !           105:                struct fifoinfo *vu_fifoinfo;   /* fifo (VFIFO) */
        !           106:        } v_un;
        !           107:
        !           108:        enum    vtagtype v_tag;                 /* type of underlying data */
        !           109:        void    *v_data;                        /* private data for fs */
        !           110:        struct  selinfo v_selectinfo;           /* identity of poller(s) */
        !           111: };
        !           112: #define        v_mountedhere   v_un.vu_mountedhere
        !           113: #define        v_socket        v_un.vu_socket
        !           114: #define        v_specinfo      v_un.vu_specinfo
        !           115: #define        v_fifoinfo      v_un.vu_fifoinfo
        !           116:
        !           117: /*
        !           118:  * Vnode flags.
        !           119:  */
        !           120: #define        VROOT           0x0001  /* root of its file system */
        !           121: #define        VTEXT           0x0002  /* vnode is a pure text prototype */
        !           122: #define        VSYSTEM         0x0004  /* vnode being used by kernel */
        !           123: #define        VISTTY          0x0008  /* vnode represents a tty */
        !           124: #define        VXLOCK          0x0100  /* vnode is locked to change underlying type */
        !           125: #define        VXWANT          0x0200  /* process is waiting for vnode */
        !           126: #define        VCLONED         0x0400  /* vnode was cloned */
        !           127: #define        VALIASED        0x0800  /* vnode has an alias */
        !           128: #define        VLOCKSWORK      0x4000  /* FS supports locking discipline */
        !           129: #define        VBITS   "\010\001ROOT\002TEXT\003SYSTEM\004ISTTY\010XLOCK" \
        !           130:     "\011XWANT\013ALIASED\016LOCKSWORK"
        !           131:
        !           132: /*
        !           133:  * (v_bioflag) Flags that may be manipulated by interrupt handlers
        !           134:  */
        !           135: #define        VBIOWAIT        0x0001  /* waiting for output to complete */
        !           136: #define VBIOONSYNCLIST 0x0002  /* Vnode is on syncer worklist */
        !           137: #define VBIOONFREELIST  0x0004  /* Vnode is on a free list */
        !           138:
        !           139: /*
        !           140:  * Vnode attributes.  A field value of VNOVAL represents a field whose value
        !           141:  * is unavailable (getattr) or which is not to be changed (setattr).
        !           142:  */
        !           143: struct vattr {
        !           144:        enum vtype      va_type;        /* vnode type (for create) */
        !           145:        mode_t          va_mode;        /* files access mode and type */
        !           146:        nlink_t         va_nlink;       /* number of references to file */
        !           147:        uid_t           va_uid;         /* owner user id */
        !           148:        gid_t           va_gid;         /* owner group id */
        !           149:        long            va_fsid;        /* file system id (dev for now) */
        !           150:        long            va_fileid;      /* file id */
        !           151:        u_quad_t        va_size;        /* file size in bytes */
        !           152:        long            va_blocksize;   /* blocksize preferred for i/o */
        !           153:        struct timespec va_atime;       /* time of last access */
        !           154:        struct timespec va_mtime;       /* time of last modification */
        !           155:        struct timespec va_ctime;       /* time file changed */
        !           156:        u_long          va_gen;         /* generation number of file */
        !           157:        u_long          va_flags;       /* flags defined for file */
        !           158:        dev_t           va_rdev;        /* device the special file represents */
        !           159:        u_quad_t        va_bytes;       /* bytes of disk space held by file */
        !           160:        u_quad_t        va_filerev;     /* file modification number */
        !           161:        u_int           va_vaflags;     /* operations flags, see below */
        !           162:        long            va_spare;       /* remain quad aligned */
        !           163: };
        !           164:
        !           165: /*
        !           166:  * Flags for va_cflags.
        !           167:  */
        !           168: #define        VA_UTIMES_NULL  0x01            /* utimes argument was NULL */
        !           169: #define VA_EXCLUSIVE    0x02           /* exclusive create request */
        !           170: /*
        !           171:  * Flags for ioflag.
        !           172:  */
        !           173: #define        IO_UNIT         0x01            /* do I/O as atomic unit */
        !           174: #define        IO_APPEND       0x02            /* append write to end */
        !           175: #define        IO_SYNC         0x04            /* do I/O synchronously */
        !           176: #define        IO_NODELOCKED   0x08            /* underlying node already locked */
        !           177: #define        IO_NDELAY       0x10            /* FNDELAY flag set in file table */
        !           178: #define        IO_NOLIMIT      0x20            /* don't enforce limits on i/o */
        !           179:
        !           180: /*
        !           181:  *  Modes.  Some values same as Ixxx entries from inode.h for now.
        !           182:  */
        !           183: #define        VSUID   04000           /* set user id on execution */
        !           184: #define        VSGID   02000           /* set group id on execution */
        !           185: #define        VSVTX   01000           /* save swapped text even after use */
        !           186: #define        VREAD   00400           /* read, write, execute permissions */
        !           187: #define        VWRITE  00200
        !           188: #define        VEXEC   00100
        !           189:
        !           190: /*
        !           191:  * Token indicating no attribute value yet assigned.
        !           192:  */
        !           193: #define        VNOVAL  (-1)
        !           194:
        !           195: /*
        !           196:  * Structure returned by the KERN_VNODE sysctl
        !           197:  */
        !           198: struct e_vnode {
        !           199:        struct vnode *vptr;
        !           200:        struct vnode vnode;
        !           201: };
        !           202:
        !           203: #ifdef _KERNEL
        !           204: /*
        !           205:  * Convert between vnode types and inode formats (since POSIX.1
        !           206:  * defines mode word of stat structure in terms of inode formats).
        !           207:  */
        !           208: extern enum vtype      iftovt_tab[];
        !           209: extern int             vttoif_tab[];
        !           210: #define IFTOVT(mode)   (iftovt_tab[((mode) & S_IFMT) >> 12])
        !           211: #define VTTOIF(indx)   (vttoif_tab[(int)(indx)])
        !           212: #define MAKEIMODE(indx, mode)  (int)(VTTOIF(indx) | (mode))
        !           213:
        !           214: /*
        !           215:  * Flags to various vnode functions.
        !           216:  */
        !           217: #define        SKIPSYSTEM      0x0001          /* vflush: skip vnodes marked VSYSTEM */
        !           218: #define        FORCECLOSE      0x0002          /* vflush: force file closeure */
        !           219: #define        WRITECLOSE      0x0004          /* vflush: only close writeable files */
        !           220: #define        DOCLOSE         0x0008          /* vclean: close active files */
        !           221: #define        V_SAVE          0x0001          /* vinvalbuf: sync file first */
        !           222: #define        V_SAVEMETA      0x0002          /* vinvalbuf: leave indirect blocks */
        !           223:
        !           224: #define REVOKEALL      0x0001          /* vop_revoke: revoke all aliases */
        !           225:
        !           226:
        !           227: TAILQ_HEAD(freelst, vnode);
        !           228: extern struct freelst vnode_hold_list; /* free vnodes referencing buffers */
        !           229: extern struct freelst vnode_free_list; /* vnode free list */
        !           230:
        !           231: #define        VATTR_NULL(vap) vattr_null(vap)
        !           232: #define        VREF(vp)        vref(vp)                /* increase reference */
        !           233: #define        NULLVP  ((struct vnode *)NULL)
        !           234: #define        VN_KNOTE(vp, b)                                 \
        !           235:        KNOTE(&vp->v_selectinfo.si_note, (b))
        !           236:
        !           237: /*
        !           238:  * Global vnode data.
        !           239:  */
        !           240: extern struct vnode *rootvnode;        /* root (i.e. "/") vnode */
        !           241: extern int desiredvnodes;              /* XXX number of vnodes desired */
        !           242: extern int maxvnodes;                  /* XXX number of vnodes to allocate */
        !           243: extern time_t syncdelay;               /* time to delay syncing vnodes */
        !           244: extern int rushjob;                    /* # of slots syncer should run ASAP */
        !           245: #endif /* _KERNEL */
        !           246:
        !           247:
        !           248: /*
        !           249:  * Mods for exensibility.
        !           250:  */
        !           251:
        !           252: /*
        !           253:  * Flags for vdesc_flags:
        !           254:  */
        !           255: #define VDESC_MAX_VPS          16
        !           256: /* Low order 16 flag bits are reserved for willrele flags for vp arguments. */
        !           257: #define VDESC_VP0_WILLRELE      0x00000001
        !           258: #define VDESC_VP1_WILLRELE      0x00000002
        !           259: #define VDESC_VP2_WILLRELE      0x00000004
        !           260: #define VDESC_VP3_WILLRELE      0x00000008
        !           261: #define VDESC_VP0_WILLUNLOCK    0x00000100
        !           262: #define VDESC_VP1_WILLUNLOCK    0x00000200
        !           263: #define VDESC_VP2_WILLUNLOCK    0x00000400
        !           264: #define VDESC_VP3_WILLUNLOCK    0x00000800
        !           265: #define VDESC_VP0_WILLPUT       0x00000101
        !           266: #define VDESC_VP1_WILLPUT       0x00000202
        !           267: #define VDESC_VP2_WILLPUT       0x00000404
        !           268: #define VDESC_VP3_WILLPUT       0x00000808
        !           269: #define VDESC_NOMAP_VPP         0x00010000
        !           270: #define VDESC_VPP_WILLRELE      0x00020000
        !           271:
        !           272: /*
        !           273:  * VDESC_NO_OFFSET is used to identify the end of the offset list
        !           274:  * and in places where no such field exists.
        !           275:  */
        !           276: #define VDESC_NO_OFFSET -1
        !           277:
        !           278: /*
        !           279:  * This structure describes the vnode operation taking place.
        !           280:  */
        !           281: struct vnodeop_desc {
        !           282:        int     vdesc_offset;           /* offset in vector--first for speed */
        !           283:        char    *vdesc_name;            /* a readable name for debugging */
        !           284:        int     vdesc_flags;            /* VDESC_* flags */
        !           285:
        !           286:        /*
        !           287:         * These ops are used by bypass routines to map and locate arguments.
        !           288:         * Creds and procs are not needed in bypass routines, but sometimes
        !           289:         * they are useful to (for example) transport layers.
        !           290:         * Nameidata is useful because it has a cred in it.
        !           291:         */
        !           292:        int     *vdesc_vp_offsets;      /* list ended by VDESC_NO_OFFSET */
        !           293:        int     vdesc_vpp_offset;       /* return vpp location */
        !           294:        int     vdesc_cred_offset;      /* cred location, if any */
        !           295:        int     vdesc_proc_offset;      /* proc location, if any */
        !           296:        int     vdesc_componentname_offset; /* if any */
        !           297:        /*
        !           298:         * Finally, we've got a list of private data (about each operation)
        !           299:         * for each transport layer.  (Support to manage this list is not
        !           300:         * yet part of BSD.)
        !           301:         */
        !           302:        caddr_t *vdesc_transports;
        !           303: };
        !           304:
        !           305: #ifdef _KERNEL
        !           306: /*
        !           307:  * A list of all the operation descs.
        !           308:  */
        !           309: extern struct vnodeop_desc *vnodeop_descs[];
        !           310:
        !           311:
        !           312: /*
        !           313:  * This macro is very helpful in defining those offsets in the vdesc struct.
        !           314:  *
        !           315:  * This is stolen from X11R4.  I ingored all the fancy stuff for
        !           316:  * Crays, so if you decide to port this to such a serious machine,
        !           317:  * you might want to consult Intrisics.h's XtOffset{,Of,To}.
        !           318:  */
        !           319: #define VOPARG_OFFSET(p_type,field) \
        !           320:        ((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
        !           321: #define VOPARG_OFFSETOF(s_type,field) \
        !           322:        VOPARG_OFFSET(s_type*,field)
        !           323: #define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \
        !           324:        ((S_TYPE)(((char *)(STRUCT_P))+(S_OFFSET)))
        !           325:
        !           326:
        !           327: /*
        !           328:  * This structure is used to configure the new vnodeops vector.
        !           329:  */
        !           330: struct vnodeopv_entry_desc {
        !           331:        struct vnodeop_desc *opve_op;   /* which operation this is */
        !           332:        int (*opve_impl)(void *);       /* code implementing this operation */
        !           333: };
        !           334: struct vnodeopv_desc {
        !           335:                        /* ptr to the ptr to the vector where op should go */
        !           336:        int (***opv_desc_vector_p)(void *);
        !           337:        struct vnodeopv_entry_desc *opv_desc_ops;   /* null terminated list */
        !           338: };
        !           339:
        !           340: /*
        !           341:  * A default routine which just returns an error.
        !           342:  */
        !           343: int vn_default_error(void *);
        !           344:
        !           345: /*
        !           346:  * A generic structure.
        !           347:  * This can be used by bypass routines to identify generic arguments.
        !           348:  */
        !           349: struct vop_generic_args {
        !           350:        struct vnodeop_desc *a_desc;
        !           351:        /* other random data follows, presumably */
        !           352: };
        !           353:
        !           354: /*
        !           355:  * VOCALL calls an op given an ops vector.  We break it out because BSD's
        !           356:  * vclean changes the ops vector and then wants to call ops with the old
        !           357:  * vector.
        !           358:  */
        !           359: #define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP))
        !           360:
        !           361: /*
        !           362:  * This call works for vnodes in the kernel.
        !           363:  */
        !           364: #define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP))
        !           365: #define VDESC(OP) (& __CONCAT(OP,_desc))
        !           366: #define VOFFSET(OP) (VDESC(OP)->vdesc_offset)
        !           367:
        !           368: /*
        !           369:  * Finally, include the default set of vnode operations.
        !           370:  */
        !           371: #include <sys/vnode_if.h>
        !           372:
        !           373: /*
        !           374:  * Public vnode manipulation functions.
        !           375:  */
        !           376: struct file;
        !           377: struct filedesc;
        !           378: struct mount;
        !           379: struct nameidata;
        !           380: struct proc;
        !           381: struct stat;
        !           382: struct ucred;
        !           383: struct uio;
        !           384: struct vattr;
        !           385: struct vnode;
        !           386:
        !           387: /* vfs_subr */
        !           388: int    bdevvp(dev_t, struct vnode **);
        !           389: int    cdevvp(dev_t, struct vnode **);
        !           390: struct vnode *checkalias(struct vnode *, dev_t, struct mount *);
        !           391: int    getnewvnode(enum vtagtype, struct mount *, int (**vops)(void *),
        !           392:            struct vnode **);
        !           393: int    vaccess(mode_t, uid_t, gid_t, mode_t, struct ucred *);
        !           394: void   vattr_null(struct vattr *);
        !           395: void   vdevgone(int, int, int, enum vtype);
        !           396: int    vcount(struct vnode *);
        !           397: int    vfinddev(dev_t, enum vtype, struct vnode **);
        !           398: void   vflushbuf(struct vnode *, int);
        !           399: int    vflush(struct mount *, struct vnode *, int);
        !           400: int    vget(struct vnode *, int, struct proc *);
        !           401: void   vgone(struct vnode *);
        !           402: void   vgonel(struct vnode *, struct proc *);
        !           403: int    vinvalbuf(struct vnode *, int, struct ucred *, struct proc *,
        !           404:            int, int);
        !           405: void   vntblinit(void);
        !           406: int    vwaitforio(struct vnode *, int, char *, int);
        !           407: void   vwakeup(struct vnode *);
        !           408: void   vput(struct vnode *);
        !           409: int    vrecycle(struct vnode *, struct proc *);
        !           410: void   vrele(struct vnode *);
        !           411: void   vref(struct vnode *);
        !           412: void   vprint(char *, struct vnode *);
        !           413:
        !           414: /* vfs_getcwd.c */
        !           415: int vfs_getcwd_scandir(struct vnode **, struct vnode **, char **, char *,
        !           416:     struct proc *);
        !           417: int vfs_getcwd_common(struct vnode *, struct vnode *, char **, char *, int,
        !           418:     int, struct proc *);
        !           419: int vfs_getcwd_getcache(struct vnode **, struct vnode **, char **, char *);
        !           420:
        !           421: /* vfs_default.c */
        !           422: int    vop_generic_abortop(void *);
        !           423: int    vop_generic_bwrite(void *);
        !           424: int    vop_generic_islocked(void *);
        !           425: int    vop_generic_lock(void *);
        !           426: int    vop_generic_unlock(void *);
        !           427: int    vop_generic_revoke(void *);
        !           428: int    vop_generic_kqfilter(void *);
        !           429:
        !           430: /* vfs_vnops.c */
        !           431: int    vn_isunder(struct vnode *, struct vnode *, struct proc *);
        !           432: int    vn_close(struct vnode *, int, struct ucred *, struct proc *);
        !           433: int    vn_open(struct nameidata *, int, int);
        !           434: int    vn_rdwr(enum uio_rw, struct vnode *, caddr_t, int, off_t,
        !           435:            enum uio_seg, int, struct ucred *, size_t *, struct proc *);
        !           436: int    vn_stat(struct vnode *, struct stat *, struct proc *);
        !           437: int    vn_statfile(struct file *, struct stat *, struct proc *);
        !           438: int    vn_lock(struct vnode *, int, struct proc *);
        !           439: int    vn_writechk(struct vnode *);
        !           440: int    vn_ioctl(struct file *, u_long, caddr_t, struct proc *);
        !           441: void   vn_marktext(struct vnode *);
        !           442:
        !           443: /* vfs_sync.c */
        !           444: void   sched_sync(struct proc *);
        !           445: void   vn_initialize_syncerd(void);
        !           446: void   vn_syncer_add_to_worklist(struct vnode *, int);
        !           447:
        !           448: /* misc */
        !           449: int    vn_isdisk(struct vnode *, int *);
        !           450: int    softdep_fsync(struct vnode *);
        !           451: int    getvnode(struct filedesc *, int, struct file **);
        !           452:
        !           453: #endif /* _KERNEL */

CVSweb