xref: /csrg-svn/sys/ufs/lfs/lfs_subr.c (revision 51557)
151500Sbostic /*
251503Sbostic  * Copyright (c) 1991 Regents of the University of California.
351500Sbostic  * All rights reserved.
451500Sbostic  *
551500Sbostic  * %sccs.include.redist.c%
651500Sbostic  *
7*51557Smckusick  *	@(#)lfs_subr.c	7.3 (Berkeley) 11/05/91
851500Sbostic  */
951500Sbostic 
1051500Sbostic #include <sys/param.h>
1151500Sbostic #include <sys/namei.h>
1251500Sbostic #include <sys/vnode.h>
1351500Sbostic #include <sys/buf.h>
1451500Sbostic 
1551500Sbostic #include <ufs/ufs/quota.h>
1651500Sbostic #include <ufs/ufs/inode.h>
1751500Sbostic 
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*51557Smckusick lfs_blkatoff(vp, offset, res, bpp)
28*51557Smckusick 	struct vnode *vp;
2951500Sbostic 	off_t offset;
3051500Sbostic 	char **res;
3151500Sbostic 	struct buf **bpp;
3251500Sbostic {
3351500Sbostic 	register struct lfs *fs;
34*51557Smckusick 	struct inode *ip;
3551500Sbostic 	struct buf *bp;
3651500Sbostic 	daddr_t lbn;
3751500Sbostic 	int bsize, error;
3851500Sbostic 
39*51557Smckusick 	ip = VTOI(vp);
4051500Sbostic 	fs = ip->i_lfs;
4151500Sbostic 	lbn = lblkno(fs, offset);
4251500Sbostic 	bsize = blksize(fs);
4351500Sbostic 
4451500Sbostic 	*bpp = NULL;
45*51557Smckusick 	if (error = bread(vp, lbn, bsize, NOCRED, &bp)) {
4651500Sbostic 		brelse(bp);
4751500Sbostic 		return (error);
4851500Sbostic 	}
4951500Sbostic 	if (res)
5051500Sbostic 		*res = bp->b_un.b_addr + blkoff(fs, offset);
5151500Sbostic 	*bpp = bp;
5251500Sbostic 	return (0);
5351500Sbostic }
5451500Sbostic 
5551500Sbostic /* Return the current version number for a specific inode. */
5651500Sbostic u_long
5751500Sbostic lfs_getversion(fs, ino)
5851500Sbostic 	struct lfs *fs;
5951500Sbostic 	ino_t ino;
6051500Sbostic {
6151500Sbostic 	BUF *bp;
6251500Sbostic 	IFILE *ifp;
6351500Sbostic 	u_long version;
6451500Sbostic 
6551500Sbostic 	/*
6651500Sbostic 	 * Read the appropriate block from the ifile.  Return the
6751500Sbostic 	 * version number.
6851500Sbostic 	 */
6951500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
7051500Sbostic 	version = ifp->if_version;
7151500Sbostic 	brelse(bp);
7251500Sbostic 	return (version);
7351500Sbostic }
7451500Sbostic 
7551500Sbostic /* Search a block for a specific dinode. */
7651500Sbostic DINODE *
7751500Sbostic lfs_ifind(fs, ino, page)
7851500Sbostic 	struct lfs *fs;
7951500Sbostic 	ino_t ino;
8051500Sbostic 	void *page;
8151500Sbostic {
8251500Sbostic 	register DINODE *dip;
8351500Sbostic 	register int cnt;
8451500Sbostic 
8551500Sbostic #ifdef ALLOCPRINT
8651500Sbostic 	printf("lfs_ifind: inode %d\n", ino);
8751500Sbostic #endif
8851500Sbostic 	dip = page;
8951500Sbostic 	for (cnt = INOPB(fs); cnt--; ++dip)
9051500Sbostic 		if (dip->di_inum == ino)
9151500Sbostic 			return (dip);
9251500Sbostic 
9351500Sbostic 	panic("lfs_ifind: dinode %u not found", ino);
9451500Sbostic 	/* NOTREACHED */
9551500Sbostic }
9651500Sbostic 
9751500Sbostic /* Set values in the ifile for the inode. */
9851500Sbostic void
9951500Sbostic lfs_iset(ip, daddr, atime)
10051500Sbostic 	INODE *ip;
10151500Sbostic 	daddr_t daddr;
10251500Sbostic 	time_t atime;
10351500Sbostic {
10451500Sbostic 	BUF *bp;
10551500Sbostic 	IFILE *ifp;
10651500Sbostic 	struct lfs *fs;
10751500Sbostic 	ino_t ino;
10851500Sbostic 
10951500Sbostic #ifdef ALLOCPRINT
11051500Sbostic 	printf("lfs_iset: setting ino %d daddr %lx time %lx\n",
11151500Sbostic 	    ip->i_number, daddr, atime);
11251500Sbostic #endif
11351500Sbostic 
11451500Sbostic 	fs = ip->i_lfs;
11551500Sbostic 	ino = ip->i_number;
11651500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
11751500Sbostic 
11851500Sbostic 	ifp->if_daddr = daddr;
11951500Sbostic 	ifp->if_st_atime = atime;
12051500Sbostic 	lfs_bwrite(bp);
12151500Sbostic }
12251500Sbostic 
12351500Sbostic /* Translate an inode number to a disk address. */
12451500Sbostic daddr_t
12551500Sbostic lfs_itod(fs, ino)
12651500Sbostic 	struct lfs *fs;
12751500Sbostic 	ino_t ino;
12851500Sbostic {
12951500Sbostic 	BUF *bp;
13051500Sbostic 	IFILE *ifp;
13151500Sbostic 	daddr_t iaddr;
13251500Sbostic 
13351500Sbostic 	/* Read the appropriate block from the ifile. */
13451500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
13551500Sbostic 
13651500Sbostic 	if (ifp->if_daddr == LFS_UNUSED_DADDR)
13751500Sbostic 		panic("itod: unused disk address");
13851500Sbostic 	iaddr = ifp->if_daddr;
13951500Sbostic 	brelse(bp);
14051500Sbostic 	return (iaddr);
14151500Sbostic }
142