[BACK]Return to ufs_inode.c CVS log [TXT][DIR] Up to [local] / sys / ufs / ufs

Annotation of sys/ufs/ufs/ufs_inode.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ufs_inode.c,v 1.37 2007/06/01 23:47:57 deraadt Exp $  */
                      2: /*     $NetBSD: ufs_inode.c,v 1.7 1996/05/11 18:27:52 mycroft Exp $    */
                      3:
                      4: /*
                      5:  * Copyright (c) 1991, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  * (c) UNIX System Laboratories, Inc.
                      8:  * All or some portions of this file are derived from material licensed
                      9:  * to the University of California by American Telephone and Telegraph
                     10:  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
                     11:  * the permission of UNIX System Laboratories, Inc.
                     12:  *
                     13:  * Redistribution and use in source and binary forms, with or without
                     14:  * modification, are permitted provided that the following conditions
                     15:  * are met:
                     16:  * 1. Redistributions of source code must retain the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer.
                     18:  * 2. Redistributions in binary form must reproduce the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer in the
                     20:  *    documentation and/or other materials provided with the distribution.
                     21:  * 3. Neither the name of the University nor the names of its contributors
                     22:  *    may be used to endorse or promote products derived from this software
                     23:  *    without specific prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  *     @(#)ufs_inode.c 8.7 (Berkeley) 7/22/94
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/proc.h>
                     43: #include <sys/vnode.h>
                     44: #include <sys/mount.h>
                     45: #include <sys/kernel.h>
                     46: #include <sys/malloc.h>
                     47: #include <sys/namei.h>
                     48:
                     49: #include <ufs/ufs/quota.h>
                     50: #include <ufs/ufs/inode.h>
                     51: #include <ufs/ufs/ufsmount.h>
                     52: #include <ufs/ufs/ufs_extern.h>
                     53: #ifdef UFS_DIRHASH
                     54: #include <ufs/ufs/dir.h>
                     55: #include <ufs/ufs/dirhash.h>
                     56: #endif
                     57:
                     58: /*
                     59:  * Last reference to an inode.  If necessary, write or delete it.
                     60:  */
                     61: int
                     62: ufs_inactive(void *v)
                     63: {
                     64:        struct vop_inactive_args *ap = v;
                     65:        struct vnode *vp = ap->a_vp;
                     66:        struct inode *ip = VTOI(vp);
                     67:        struct proc *p = ap->a_p;
                     68:        mode_t mode;
                     69:        int error = 0;
                     70: #ifdef DIAGNOSTIC
                     71:        extern int prtactive;
                     72:
                     73:        if (prtactive && vp->v_usecount != 0)
                     74:                vprint("ffs_inactive: pushing active", vp);
                     75: #endif
                     76:
                     77:        /*
                     78:         * Ignore inodes related to stale file handles.
                     79:         */
                     80:        if (ip->i_din1 == NULL || DIP(ip, mode) == 0)
                     81:                goto out;
                     82:
                     83:        if (DIP(ip, nlink) <= 0 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0) {
                     84:                if (getinoquota(ip) == 0)
                     85:                        (void)ufs_quota_free_inode(ip, NOCRED);
                     86:
                     87:                error = UFS_TRUNCATE(ip, (off_t)0, 0, NOCRED);
                     88:
                     89:                DIP_ASSIGN(ip, rdev, 0);
                     90:                mode = DIP(ip, mode);
                     91:                DIP_ASSIGN(ip, mode, 0);
                     92:                ip->i_flag |= IN_CHANGE | IN_UPDATE;
                     93:
                     94:                /*
                     95:                 * Setting the mode to zero needs to wait for the inode to be
                     96:                 * written just as does a change to the link count. So, rather
                     97:                 * than creating a new entry point to do the same thing, we
                     98:                 * just use softdep_change_linkcnt(). Also, we can't let
                     99:                 * softdep co-opt us to help on its worklist, as we may end up
                    100:                 * trying to recycle vnodes and getting to this same point a
                    101:                 * couple of times, blowing the kernel stack. However, this
                    102:                 * could be optimized by checking if we are coming from
                    103:                 * vrele(), vput() or vclean() (by checking for VXLOCK) and
                    104:                 * just avoiding the co-opt to happen in the last case.
                    105:                 */
                    106:                if (DOINGSOFTDEP(vp))
                    107:                        softdep_change_linkcnt(ip, 1);
                    108:
                    109:                UFS_INODE_FREE(ip, ip->i_number, mode);
                    110:        }
                    111:
                    112:        if (ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) {
                    113:                UFS_UPDATE(ip, 0);
                    114:        }
                    115: out:
                    116:        VOP_UNLOCK(vp, 0, p);
                    117:
                    118:        /*
                    119:         * If we are done with the inode, reclaim it
                    120:         * so that it can be reused immediately.
                    121:         */
                    122:        if (ip->i_din1 == NULL || DIP(ip, mode) == 0)
                    123:                vrecycle(vp, p);
                    124:
                    125:        return (error);
                    126: }
                    127:
                    128: /*
                    129:  * Reclaim an inode so that it can be used for other purposes.
                    130:  */
                    131: int
                    132: ufs_reclaim(struct vnode *vp, struct proc *p)
                    133: {
                    134:        struct inode *ip;
                    135: #ifdef DIAGNOSTIC
                    136:        extern int prtactive;
                    137:
                    138:        if (prtactive && vp->v_usecount != 0)
                    139:                vprint("ufs_reclaim: pushing active", vp);
                    140: #endif
                    141:
                    142:        /*
                    143:         * Remove the inode from its hash chain.
                    144:         */
                    145:        ip = VTOI(vp);
                    146:        ufs_ihashrem(ip);
                    147:        /*
                    148:         * Purge old data structures associated with the inode.
                    149:         */
                    150:        cache_purge(vp);
                    151:
                    152:        if (ip->i_devvp) {
                    153:                vrele(ip->i_devvp);
                    154:        }
                    155: #ifdef UFS_DIRHASH
                    156:        if (ip->i_dirhash != NULL)
                    157:                ufsdirhash_free(ip);
                    158: #endif
                    159:        ufs_quota_delete(ip);
                    160:        return (0);
                    161: }

CVSweb