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