151500Sbostic /* 251503Sbostic * Copyright (c) 1991 Regents of the University of California. 351500Sbostic * All rights reserved. 451500Sbostic * 551500Sbostic * %sccs.include.redist.c% 651500Sbostic * 7*54691Sbostic * @(#)lfs_subr.c 7.13 (Berkeley) 07/05/92 851500Sbostic */ 951500Sbostic 1051500Sbostic #include <sys/param.h> 1151500Sbostic #include <sys/namei.h> 1251500Sbostic #include <sys/vnode.h> 1351500Sbostic #include <sys/buf.h> 1454264Sbostic #include <sys/mount.h> 1551500Sbostic 1651500Sbostic #include <ufs/ufs/quota.h> 1751500Sbostic #include <ufs/ufs/inode.h> 1851500Sbostic #include <ufs/lfs/lfs.h> 1951500Sbostic #include <ufs/lfs/lfs_extern.h> 2051500Sbostic 2151500Sbostic /* 2251500Sbostic * Return buffer with the contents of block "offset" from the beginning of 2351500Sbostic * directory "ip". If "res" is non-zero, fill it in with a pointer to the 2451500Sbostic * remaining space in the directory. 2551500Sbostic */ 2651500Sbostic int 27*54691Sbostic lfs_blkatoff(ap) 28*54691Sbostic struct vop_blkatoff_args /* { 29*54691Sbostic struct vnode *a_vp; 30*54691Sbostic off_t a_offset; 31*54691Sbostic char **a_res; 32*54691Sbostic struct buf **a_bpp; 33*54691Sbostic } */ *ap; 3451500Sbostic { 3551500Sbostic register struct lfs *fs; 3651557Smckusick struct inode *ip; 3751500Sbostic struct buf *bp; 3851500Sbostic daddr_t lbn; 3951500Sbostic int bsize, error; 4051500Sbostic 4153592Sheideman ip = VTOI(ap->a_vp); 4251500Sbostic fs = ip->i_lfs; 4353592Sheideman lbn = lblkno(fs, ap->a_offset); 4451500Sbostic bsize = blksize(fs); 4551500Sbostic 4653592Sheideman *ap->a_bpp = NULL; 4753592Sheideman if (error = bread(ap->a_vp, lbn, bsize, NOCRED, &bp)) { 4851500Sbostic brelse(bp); 4951500Sbostic return (error); 5051500Sbostic } 5153592Sheideman if (ap->a_res) 5253592Sheideman *ap->a_res = bp->b_un.b_addr + blkoff(fs, ap->a_offset); 5353592Sheideman *ap->a_bpp = bp; 5451500Sbostic return (0); 5551500Sbostic } 5654264Sbostic 57*54691Sbostic /* 58*54691Sbostic * lfs_seglock -- 59*54691Sbostic * Single thread the segment writer. 60*54691Sbostic */ 61*54691Sbostic void 62*54691Sbostic lfs_seglock(fs) 63*54691Sbostic struct lfs *fs; 6454264Sbostic { 65*54691Sbostic while (fs->lfs_seglock) 66*54691Sbostic (void)tsleep(&fs->lfs_seglock, PRIBIO + 1, "lfs seglock", 0); 67*54691Sbostic fs->lfs_seglock = 1; 6854264Sbostic } 6954264Sbostic 7054264Sbostic /* 71*54691Sbostic * lfs_segunlock -- 72*54691Sbostic * Single thread the segment writer. 7354264Sbostic */ 74*54691Sbostic void 75*54691Sbostic lfs_segunlock(fs) 76*54691Sbostic struct lfs *fs; 7754264Sbostic { 78*54691Sbostic fs->lfs_seglock = 0; 79*54691Sbostic wakeup(&fs->lfs_seglock); /* XXX: May not be necessary. */ 8054264Sbostic } 81