Home | History | Annotate | Line # | Download | only in lfs
lfs_alloc.c revision 1.18.2.2.4.1
      1  1.18.2.2.4.1    itojun /*	$NetBSD: lfs_alloc.c,v 1.18.2.2.4.1 1999/11/30 13:36:22 itojun Exp $	*/
      2           1.2       cgd 
      3          1.17  perseant /*-
      4          1.17  perseant  * Copyright (c) 1999 The NetBSD Foundation, Inc.
      5          1.17  perseant  * All rights reserved.
      6          1.17  perseant  *
      7          1.17  perseant  * This code is derived from software contributed to The NetBSD Foundation
      8          1.17  perseant  * by Konrad E. Schroder <perseant (at) hhhh.org>.
      9          1.17  perseant  *
     10          1.17  perseant  * Redistribution and use in source and binary forms, with or without
     11          1.17  perseant  * modification, are permitted provided that the following conditions
     12          1.17  perseant  * are met:
     13          1.17  perseant  * 1. Redistributions of source code must retain the above copyright
     14          1.17  perseant  *    notice, this list of conditions and the following disclaimer.
     15          1.17  perseant  * 2. Redistributions in binary form must reproduce the above copyright
     16          1.17  perseant  *    notice, this list of conditions and the following disclaimer in the
     17          1.17  perseant  *    documentation and/or other materials provided with the distribution.
     18          1.17  perseant  * 3. All advertising materials mentioning features or use of this software
     19          1.17  perseant  *    must display the following acknowledgement:
     20          1.17  perseant  *      This product includes software developed by the NetBSD
     21          1.17  perseant  *      Foundation, Inc. and its contributors.
     22          1.17  perseant  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23          1.17  perseant  *    contributors may be used to endorse or promote products derived
     24          1.17  perseant  *    from this software without specific prior written permission.
     25          1.17  perseant  *
     26          1.17  perseant  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27          1.17  perseant  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28          1.17  perseant  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29          1.17  perseant  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30          1.17  perseant  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31          1.17  perseant  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32          1.17  perseant  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33          1.17  perseant  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34          1.17  perseant  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35          1.17  perseant  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36          1.17  perseant  * POSSIBILITY OF SUCH DAMAGE.
     37          1.17  perseant  */
     38           1.1   mycroft /*
     39           1.1   mycroft  * Copyright (c) 1991, 1993
     40           1.1   mycroft  *	The Regents of the University of California.  All rights reserved.
     41           1.1   mycroft  *
     42           1.1   mycroft  * Redistribution and use in source and binary forms, with or without
     43           1.1   mycroft  * modification, are permitted provided that the following conditions
     44           1.1   mycroft  * are met:
     45           1.1   mycroft  * 1. Redistributions of source code must retain the above copyright
     46           1.1   mycroft  *    notice, this list of conditions and the following disclaimer.
     47           1.1   mycroft  * 2. Redistributions in binary form must reproduce the above copyright
     48           1.1   mycroft  *    notice, this list of conditions and the following disclaimer in the
     49           1.1   mycroft  *    documentation and/or other materials provided with the distribution.
     50           1.1   mycroft  * 3. All advertising materials mentioning features or use of this software
     51           1.1   mycroft  *    must display the following acknowledgement:
     52           1.1   mycroft  *	This product includes software developed by the University of
     53           1.1   mycroft  *	California, Berkeley and its contributors.
     54           1.1   mycroft  * 4. Neither the name of the University nor the names of its contributors
     55           1.1   mycroft  *    may be used to endorse or promote products derived from this software
     56           1.1   mycroft  *    without specific prior written permission.
     57           1.1   mycroft  *
     58           1.1   mycroft  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     59           1.1   mycroft  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     60           1.1   mycroft  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     61           1.1   mycroft  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     62           1.1   mycroft  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     63           1.1   mycroft  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     64           1.1   mycroft  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     65           1.1   mycroft  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     66           1.1   mycroft  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     67           1.1   mycroft  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     68           1.1   mycroft  * SUCH DAMAGE.
     69           1.1   mycroft  *
     70           1.2       cgd  *	@(#)lfs_alloc.c	8.4 (Berkeley) 1/4/94
     71           1.1   mycroft  */
     72          1.12    scottr 
     73          1.13    scottr #if defined(_KERNEL) && !defined(_LKM)
     74          1.12    scottr #include "opt_quota.h"
     75          1.13    scottr #endif
     76           1.1   mycroft 
     77           1.1   mycroft #include <sys/param.h>
     78           1.3  christos #include <sys/systm.h>
     79           1.1   mycroft #include <sys/kernel.h>
     80           1.1   mycroft #include <sys/buf.h>
     81           1.1   mycroft #include <sys/vnode.h>
     82           1.1   mycroft #include <sys/syslog.h>
     83           1.1   mycroft #include <sys/mount.h>
     84           1.1   mycroft #include <sys/malloc.h>
     85          1.15   thorpej #include <sys/pool.h>
     86           1.1   mycroft 
     87           1.1   mycroft #include <vm/vm.h>
     88           1.1   mycroft 
     89           1.1   mycroft #include <ufs/ufs/quota.h>
     90           1.1   mycroft #include <ufs/ufs/inode.h>
     91           1.1   mycroft #include <ufs/ufs/ufsmount.h>
     92           1.3  christos #include <ufs/ufs/ufs_extern.h>
     93           1.1   mycroft 
     94           1.1   mycroft #include <ufs/lfs/lfs.h>
     95           1.1   mycroft #include <ufs/lfs/lfs_extern.h>
     96           1.1   mycroft 
     97          1.17  perseant extern struct lock ufs_hashlock;
     98          1.17  perseant 
     99           1.1   mycroft /* Allocate a new inode. */
    100           1.1   mycroft /* ARGSUSED */
    101           1.1   mycroft int
    102           1.3  christos lfs_valloc(v)
    103           1.3  christos 	void *v;
    104           1.3  christos {
    105           1.1   mycroft 	struct vop_valloc_args /* {
    106          1.17  perseant 				  struct vnode *a_pvp;
    107          1.17  perseant 				  int a_mode;
    108          1.17  perseant 				  struct ucred *a_cred;
    109          1.17  perseant 				  struct vnode **a_vpp;
    110          1.17  perseant 				  } */ *ap = v;
    111           1.1   mycroft 	struct lfs *fs;
    112           1.1   mycroft 	struct buf *bp;
    113           1.1   mycroft 	struct ifile *ifp;
    114           1.1   mycroft 	struct inode *ip;
    115           1.1   mycroft 	struct vnode *vp;
    116          1.11      fvdl 	ufs_daddr_t blkno;
    117           1.1   mycroft 	ino_t new_ino;
    118           1.1   mycroft 	u_long i, max;
    119           1.1   mycroft 	int error;
    120           1.1   mycroft 
    121          1.17  perseant 	fs = VTOI(ap->a_pvp)->i_lfs;
    122          1.17  perseant 
    123          1.17  perseant 	/*
    124          1.17  perseant 	 * Prevent a race getting lfs_free - XXX - KS
    125          1.17  perseant 	 * (this should be a proper lock, in struct lfs)
    126          1.17  perseant 	 */
    127          1.17  perseant 
    128          1.17  perseant 	while(lockmgr(&ufs_hashlock, LK_EXCLUSIVE|LK_SLEEPFAIL, 0))
    129          1.17  perseant 		;
    130          1.17  perseant 
    131           1.1   mycroft 	/* Get the head of the freelist. */
    132           1.1   mycroft 	new_ino = fs->lfs_free;
    133          1.17  perseant #ifdef DIAGNOSTIC
    134          1.17  perseant 	if(new_ino == LFS_UNUSED_INUM) {
    135          1.17  perseant #ifdef DEBUG
    136          1.17  perseant 		lfs_dump_super(fs);
    137          1.17  perseant #endif /* DEBUG */
    138          1.17  perseant 		panic("inode 0 allocated [1]");
    139          1.17  perseant 	}
    140          1.17  perseant #endif /* DIAGNOSTIC */
    141           1.1   mycroft #ifdef ALLOCPRINT
    142           1.6  christos 	printf("lfs_ialloc: allocate inode %d\n", new_ino);
    143           1.1   mycroft #endif
    144          1.17  perseant 
    145           1.1   mycroft 	/*
    146           1.1   mycroft 	 * Remove the inode from the free list and write the new start
    147           1.1   mycroft 	 * of the free list into the superblock.
    148           1.1   mycroft 	 */
    149           1.1   mycroft 	LFS_IENTRY(ifp, fs, new_ino, bp);
    150           1.1   mycroft 	if (ifp->if_daddr != LFS_UNUSED_DADDR)
    151          1.17  perseant 		panic("lfs_ialloc: inuse inode %d on the free list", new_ino);
    152           1.1   mycroft 	fs->lfs_free = ifp->if_nextfree;
    153           1.1   mycroft 	brelse(bp);
    154          1.17  perseant 
    155           1.1   mycroft 	/* Extend IFILE so that the next lfs_valloc will succeed. */
    156           1.1   mycroft 	if (fs->lfs_free == LFS_UNUSED_INUM) {
    157           1.1   mycroft 		vp = fs->lfs_ivnode;
    158          1.17  perseant 		VOP_LOCK(vp,LK_EXCLUSIVE);
    159           1.1   mycroft 		ip = VTOI(vp);
    160           1.8    bouyer 		blkno = lblkno(fs, ip->i_ffs_size);
    161          1.11      fvdl 		lfs_balloc(vp, 0, fs->lfs_bsize, blkno, &bp);
    162           1.8    bouyer 		ip->i_ffs_size += fs->lfs_bsize;
    163          1.10       chs 		uvm_vnp_setsize(vp, ip->i_ffs_size);
    164          1.10       chs 		(void)uvm_vnp_uncache(vp);
    165           1.1   mycroft 
    166           1.1   mycroft 		i = (blkno - fs->lfs_segtabsz - fs->lfs_cleansz) *
    167          1.17  perseant 			fs->lfs_ifpb;
    168           1.1   mycroft 		fs->lfs_free = i;
    169          1.17  perseant #ifdef DIAGNOSTIC
    170          1.17  perseant 		if(fs->lfs_free == LFS_UNUSED_INUM)
    171          1.17  perseant 			panic("inode 0 allocated [2]");
    172          1.17  perseant #endif /* DIAGNOSTIC */
    173           1.1   mycroft 		max = i + fs->lfs_ifpb;
    174           1.1   mycroft 		for (ifp = (struct ifile *)bp->b_data; i < max; ++ifp) {
    175           1.1   mycroft 			ifp->if_version = 1;
    176           1.1   mycroft 			ifp->if_daddr = LFS_UNUSED_DADDR;
    177           1.1   mycroft 			ifp->if_nextfree = ++i;
    178           1.1   mycroft 		}
    179           1.1   mycroft 		ifp--;
    180           1.1   mycroft 		ifp->if_nextfree = LFS_UNUSED_INUM;
    181          1.17  perseant 		VOP_UNLOCK(vp,0);
    182          1.17  perseant 		if ((error = VOP_BWRITE(bp)) != 0) {
    183          1.17  perseant 			lockmgr(&ufs_hashlock, LK_RELEASE, 0);
    184           1.1   mycroft 			return (error);
    185          1.17  perseant 		}
    186           1.1   mycroft 	}
    187          1.17  perseant 	lockmgr(&ufs_hashlock, LK_RELEASE, 0);
    188          1.17  perseant 
    189          1.17  perseant #ifdef DIAGNOSTIC
    190          1.17  perseant 	if(fs->lfs_free == LFS_UNUSED_INUM)
    191          1.17  perseant 		panic("inode 0 allocated [3]");
    192          1.17  perseant #endif /* DIAGNOSTIC */
    193          1.17  perseant 
    194           1.1   mycroft 	/* Create a vnode to associate with the inode. */
    195           1.3  christos 	if ((error = lfs_vcreate(ap->a_pvp->v_mount, new_ino, &vp)) != 0)
    196           1.1   mycroft 		return (error);
    197          1.17  perseant 
    198           1.1   mycroft 	ip = VTOI(vp);
    199           1.1   mycroft 	/* Zero out the direct and indirect block addresses. */
    200          1.16   thorpej 	bzero(&ip->i_din, sizeof(ip->i_din));
    201           1.8    bouyer 	ip->i_din.ffs_din.di_inumber = new_ino;
    202          1.17  perseant 
    203           1.1   mycroft 	/* Set a new generation number for this inode. */
    204           1.8    bouyer 	ip->i_ffs_gen++;
    205          1.17  perseant 
    206           1.1   mycroft 	/* Insert into the inode hash table. */
    207           1.1   mycroft 	ufs_ihashins(ip);
    208          1.17  perseant 
    209          1.14  sommerfe 	error = ufs_vinit(vp->v_mount, lfs_specop_p, lfs_fifoop_p, &vp);
    210           1.3  christos 	if (error) {
    211           1.1   mycroft 		vput(vp);
    212           1.1   mycroft 		*ap->a_vpp = NULL;
    213           1.1   mycroft 		return (error);
    214           1.1   mycroft 	}
    215          1.17  perseant 
    216           1.1   mycroft 	*ap->a_vpp = vp;
    217          1.17  perseant 	if(!(vp->v_flag & VDIROP)) {
    218          1.17  perseant 		lfs_vref(vp);
    219          1.17  perseant 		++fs->lfs_dirvcount;
    220          1.17  perseant 	}
    221           1.1   mycroft 	vp->v_flag |= VDIROP;
    222           1.1   mycroft 	VREF(ip->i_devvp);
    223          1.17  perseant 
    224           1.1   mycroft 	/* Set superblock modified bit and increment file count. */
    225           1.1   mycroft 	fs->lfs_fmod = 1;
    226           1.1   mycroft 	++fs->lfs_nfiles;
    227           1.1   mycroft 	return (0);
    228           1.1   mycroft }
    229           1.1   mycroft 
    230           1.1   mycroft /* Create a new vnode/inode pair and initialize what fields we can. */
    231           1.1   mycroft int
    232           1.1   mycroft lfs_vcreate(mp, ino, vpp)
    233           1.1   mycroft 	struct mount *mp;
    234           1.1   mycroft 	ino_t ino;
    235           1.1   mycroft 	struct vnode **vpp;
    236           1.1   mycroft {
    237           1.3  christos 	extern int (**lfs_vnodeop_p) __P((void *));
    238           1.1   mycroft 	struct inode *ip;
    239           1.1   mycroft 	struct ufsmount *ump;
    240           1.4        pk 	int error;
    241           1.4        pk #ifdef QUOTA
    242           1.4        pk 	int i;
    243           1.4        pk #endif
    244          1.17  perseant 
    245           1.1   mycroft 	/* Create the vnode. */
    246           1.3  christos 	if ((error = getnewvnode(VT_LFS, mp, lfs_vnodeop_p, vpp)) != 0) {
    247           1.1   mycroft 		*vpp = NULL;
    248           1.1   mycroft 		return (error);
    249           1.1   mycroft 	}
    250          1.17  perseant 
    251           1.1   mycroft 	/* Get a pointer to the private mount structure. */
    252           1.1   mycroft 	ump = VFSTOUFS(mp);
    253          1.17  perseant 
    254           1.1   mycroft 	/* Initialize the inode. */
    255          1.15   thorpej 	ip = pool_get(&lfs_inode_pool, PR_WAITOK);
    256          1.11      fvdl 	lockinit(&ip->i_lock, PINOD, "lfsinode", 0, 0);
    257           1.1   mycroft 	(*vpp)->v_data = ip;
    258           1.1   mycroft 	ip->i_vnode = *vpp;
    259           1.1   mycroft 	ip->i_devvp = ump->um_devvp;
    260           1.1   mycroft 	ip->i_flag = IN_MODIFIED;
    261           1.1   mycroft 	ip->i_dev = ump->um_dev;
    262           1.8    bouyer 	ip->i_number = ip->i_din.ffs_din.di_inumber = ino;
    263           1.1   mycroft 	ip->i_lfs = ump->um_lfs;
    264           1.1   mycroft #ifdef QUOTA
    265           1.1   mycroft 	for (i = 0; i < MAXQUOTAS; i++)
    266           1.1   mycroft 		ip->i_dquot[i] = NODQUOT;
    267           1.1   mycroft #endif
    268           1.1   mycroft 	ip->i_lockf = 0;
    269           1.1   mycroft 	ip->i_diroff = 0;
    270           1.8    bouyer 	ip->i_ffs_mode = 0;
    271           1.8    bouyer 	ip->i_ffs_size = 0;
    272           1.8    bouyer 	ip->i_ffs_blocks = 0;
    273           1.1   mycroft 	++ump->um_lfs->lfs_uinodes;
    274           1.1   mycroft 	return (0);
    275           1.1   mycroft }
    276           1.1   mycroft 
    277           1.1   mycroft /* Free an inode. */
    278           1.1   mycroft /* ARGUSED */
    279           1.1   mycroft int
    280           1.3  christos lfs_vfree(v)
    281           1.3  christos 	void *v;
    282           1.3  christos {
    283           1.1   mycroft 	struct vop_vfree_args /* {
    284          1.17  perseant 				 struct vnode *a_pvp;
    285          1.17  perseant 				 ino_t a_ino;
    286          1.17  perseant 				 int a_mode;
    287          1.17  perseant 				 } */ *ap = v;
    288           1.1   mycroft 	SEGUSE *sup;
    289           1.1   mycroft 	struct buf *bp;
    290           1.1   mycroft 	struct ifile *ifp;
    291           1.1   mycroft 	struct inode *ip;
    292           1.1   mycroft 	struct lfs *fs;
    293          1.11      fvdl 	ufs_daddr_t old_iaddr;
    294           1.1   mycroft 	ino_t ino;
    295      1.18.2.2  perseant 	int already_locked;
    296          1.17  perseant 
    297           1.1   mycroft 	/* Get the inode number and file system. */
    298           1.1   mycroft 	ip = VTOI(ap->a_pvp);
    299           1.1   mycroft 	fs = ip->i_lfs;
    300           1.1   mycroft 	ino = ip->i_number;
    301          1.17  perseant 
    302      1.18.2.2  perseant 	/* If we already hold ufs_hashlock, don't panic, just do it anyway */
    303      1.18.2.2  perseant 	already_locked = lockstatus(&ufs_hashlock) && ufs_hashlock.lk_lockholder == curproc->p_pid;
    304          1.17  perseant 	while(WRITEINPROG(ap->a_pvp)
    305          1.17  perseant 	      || fs->lfs_seglock
    306      1.18.2.2  perseant 	      || (!already_locked && lockmgr(&ufs_hashlock, LK_EXCLUSIVE|LK_SLEEPFAIL, 0)))
    307          1.17  perseant 	{
    308          1.17  perseant 		if (WRITEINPROG(ap->a_pvp)) {
    309          1.17  perseant 			tsleep(ap->a_pvp, (PRIBIO+1), "lfs_vfree", 0);
    310          1.17  perseant 		}
    311          1.17  perseant 		if (fs->lfs_seglock) {
    312          1.17  perseant 			if (fs->lfs_lockpid == curproc->p_pid) {
    313          1.17  perseant 				break;
    314          1.17  perseant 			} else {
    315          1.17  perseant 				tsleep(&fs->lfs_seglock, PRIBIO + 1, "lfs_vfr1", 0);
    316          1.17  perseant 			}
    317          1.17  perseant 		}
    318          1.17  perseant 	}
    319          1.17  perseant 
    320          1.17  perseant 	if (ip->i_flag & IN_CLEANING) {
    321          1.17  perseant 		--fs->lfs_uinodes;
    322          1.17  perseant 		ip->i_flag &= ~IN_CLEANING;
    323          1.17  perseant 	}
    324           1.1   mycroft 	if (ip->i_flag & IN_MODIFIED) {
    325           1.1   mycroft 		--fs->lfs_uinodes;
    326           1.1   mycroft 		ip->i_flag &=
    327          1.17  perseant 			~(IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE);
    328           1.1   mycroft 	}
    329          1.17  perseant #ifdef DEBUG_LFS
    330          1.17  perseant 	if((int32_t)fs->lfs_uinodes<0) {
    331          1.17  perseant 		printf("U1");
    332          1.17  perseant 		fs->lfs_uinodes=0;
    333          1.17  perseant 	}
    334          1.17  perseant #endif
    335           1.1   mycroft 	/*
    336           1.1   mycroft 	 * Set the ifile's inode entry to unused, increment its version number
    337           1.1   mycroft 	 * and link it into the free chain.
    338           1.1   mycroft 	 */
    339           1.1   mycroft 	LFS_IENTRY(ifp, fs, ino, bp);
    340           1.1   mycroft 	old_iaddr = ifp->if_daddr;
    341           1.1   mycroft 	ifp->if_daddr = LFS_UNUSED_DADDR;
    342           1.1   mycroft 	++ifp->if_version;
    343           1.1   mycroft 	ifp->if_nextfree = fs->lfs_free;
    344           1.1   mycroft 	fs->lfs_free = ino;
    345           1.1   mycroft 	(void) VOP_BWRITE(bp);
    346          1.17  perseant #ifdef DIAGNOSTIC
    347          1.17  perseant 	if(fs->lfs_free == LFS_UNUSED_INUM) {
    348          1.17  perseant 		panic("inode 0 freed");
    349          1.17  perseant 	}
    350          1.17  perseant #endif /* DIAGNOSTIC */
    351           1.1   mycroft 	if (old_iaddr != LFS_UNUSED_DADDR) {
    352           1.1   mycroft 		LFS_SEGENTRY(sup, fs, datosn(fs, old_iaddr), bp);
    353  1.18.2.2.4.1    itojun #ifdef DIAGNOSTIC
    354          1.17  perseant 		if (sup->su_nbytes < DINODE_SIZE) {
    355  1.18.2.2.4.1    itojun 			printf("lfs_vfree: negative byte count (segment %d short by %d)\n", datosn(fs, old_iaddr), DINODE_SIZE - sup->su_nbytes);
    356  1.18.2.2.4.1    itojun 			panic("lfs_vfree: negative byte count");
    357          1.17  perseant 			sup->su_nbytes = DINODE_SIZE;
    358          1.17  perseant 		}
    359  1.18.2.2.4.1    itojun #endif
    360          1.16   thorpej 		sup->su_nbytes -= DINODE_SIZE;
    361           1.1   mycroft 		(void) VOP_BWRITE(bp);
    362           1.1   mycroft 	}
    363      1.18.2.2  perseant 	if(!already_locked)
    364      1.18.2.2  perseant 		lockmgr(&ufs_hashlock, LK_RELEASE, 0);
    365          1.17  perseant 
    366           1.1   mycroft 	/* Set superblock modified bit and decrement file count. */
    367           1.1   mycroft 	fs->lfs_fmod = 1;
    368           1.1   mycroft 	--fs->lfs_nfiles;
    369          1.17  perseant 
    370           1.1   mycroft 	return (0);
    371           1.1   mycroft }
    372