xref: /csrg-svn/sys/ufs/lfs/lfs_subr.c (revision 54691)
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