xref: /csrg-svn/sys/ufs/lfs/lfs_subr.c (revision 51500)
1*51500Sbostic /*
2*51500Sbostic  * Copyright (c) 1986, 1989, 1991 Regents of the University of California.
3*51500Sbostic  * All rights reserved.
4*51500Sbostic  *
5*51500Sbostic  * %sccs.include.redist.c%
6*51500Sbostic  *
7*51500Sbostic  *	@(#)lfs_subr.c	7.1 (Berkeley) 11/01/91
8*51500Sbostic  */
9*51500Sbostic 
10*51500Sbostic #include <sys/param.h>
11*51500Sbostic #include <sys/namei.h>
12*51500Sbostic #include <sys/vnode.h>
13*51500Sbostic #include <sys/buf.h>
14*51500Sbostic 
15*51500Sbostic #include <ufs/ufs/quota.h>
16*51500Sbostic #include <ufs/ufs/inode.h>
17*51500Sbostic 
18*51500Sbostic #include <ufs/lfs/lfs.h>
19*51500Sbostic #include <ufs/lfs/lfs_extern.h>
20*51500Sbostic 
21*51500Sbostic /*
22*51500Sbostic  * Return buffer with the contents of block "offset" from the beginning of
23*51500Sbostic  * directory "ip".  If "res" is non-zero, fill it in with a pointer to the
24*51500Sbostic  * remaining space in the directory.
25*51500Sbostic  */
26*51500Sbostic int
27*51500Sbostic lfs_blkatoff(ip, offset, res, bpp)
28*51500Sbostic 	struct inode *ip;
29*51500Sbostic 	off_t offset;
30*51500Sbostic 	char **res;
31*51500Sbostic 	struct buf **bpp;
32*51500Sbostic {
33*51500Sbostic 	register struct lfs *fs;
34*51500Sbostic 	struct buf *bp;
35*51500Sbostic 	daddr_t lbn;
36*51500Sbostic 	int bsize, error;
37*51500Sbostic 
38*51500Sbostic 	fs = ip->i_lfs;
39*51500Sbostic 	lbn = lblkno(fs, offset);
40*51500Sbostic 	bsize = blksize(fs);
41*51500Sbostic 
42*51500Sbostic 	*bpp = NULL;
43*51500Sbostic 	if (error = bread(ITOV(ip), lbn, bsize, NOCRED, &bp)) {
44*51500Sbostic 		brelse(bp);
45*51500Sbostic 		return (error);
46*51500Sbostic 	}
47*51500Sbostic 	if (res)
48*51500Sbostic 		*res = bp->b_un.b_addr + blkoff(fs, offset);
49*51500Sbostic 	*bpp = bp;
50*51500Sbostic 	return (0);
51*51500Sbostic }
52*51500Sbostic 
53*51500Sbostic /* Return the current version number for a specific inode. */
54*51500Sbostic u_long
55*51500Sbostic lfs_getversion(fs, ino)
56*51500Sbostic 	struct lfs *fs;
57*51500Sbostic 	ino_t ino;
58*51500Sbostic {
59*51500Sbostic 	BUF *bp;
60*51500Sbostic 	IFILE *ifp;
61*51500Sbostic 	u_long version;
62*51500Sbostic 
63*51500Sbostic 	/*
64*51500Sbostic 	 * Read the appropriate block from the ifile.  Return the
65*51500Sbostic 	 * version number.
66*51500Sbostic 	 */
67*51500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
68*51500Sbostic 	version = ifp->if_version;
69*51500Sbostic 	brelse(bp);
70*51500Sbostic 	return (version);
71*51500Sbostic }
72*51500Sbostic 
73*51500Sbostic /* Search a block for a specific dinode. */
74*51500Sbostic DINODE *
75*51500Sbostic lfs_ifind(fs, ino, page)
76*51500Sbostic 	struct lfs *fs;
77*51500Sbostic 	ino_t ino;
78*51500Sbostic 	void *page;
79*51500Sbostic {
80*51500Sbostic 	register DINODE *dip;
81*51500Sbostic 	register int cnt;
82*51500Sbostic 
83*51500Sbostic #ifdef ALLOCPRINT
84*51500Sbostic 	printf("lfs_ifind: inode %d\n", ino);
85*51500Sbostic #endif
86*51500Sbostic 	dip = page;
87*51500Sbostic 	for (cnt = INOPB(fs); cnt--; ++dip)
88*51500Sbostic 		if (dip->di_inum == ino)
89*51500Sbostic 			return (dip);
90*51500Sbostic 
91*51500Sbostic 	panic("lfs_ifind: dinode %u not found", ino);
92*51500Sbostic 	/* NOTREACHED */
93*51500Sbostic }
94*51500Sbostic 
95*51500Sbostic /* Set values in the ifile for the inode. */
96*51500Sbostic void
97*51500Sbostic lfs_iset(ip, daddr, atime)
98*51500Sbostic 	INODE *ip;
99*51500Sbostic 	daddr_t daddr;
100*51500Sbostic 	time_t atime;
101*51500Sbostic {
102*51500Sbostic 	BUF *bp;
103*51500Sbostic 	IFILE *ifp;
104*51500Sbostic 	struct lfs *fs;
105*51500Sbostic 	ino_t ino;
106*51500Sbostic 
107*51500Sbostic #ifdef ALLOCPRINT
108*51500Sbostic 	printf("lfs_iset: setting ino %d daddr %lx time %lx\n",
109*51500Sbostic 	    ip->i_number, daddr, atime);
110*51500Sbostic #endif
111*51500Sbostic 
112*51500Sbostic 	fs = ip->i_lfs;
113*51500Sbostic 	ino = ip->i_number;
114*51500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
115*51500Sbostic 
116*51500Sbostic 	ifp->if_daddr = daddr;
117*51500Sbostic 	ifp->if_st_atime = atime;
118*51500Sbostic 	lfs_bwrite(bp);
119*51500Sbostic }
120*51500Sbostic 
121*51500Sbostic /* Translate an inode number to a disk address. */
122*51500Sbostic daddr_t
123*51500Sbostic lfs_itod(fs, ino)
124*51500Sbostic 	struct lfs *fs;
125*51500Sbostic 	ino_t ino;
126*51500Sbostic {
127*51500Sbostic 	BUF *bp;
128*51500Sbostic 	IFILE *ifp;
129*51500Sbostic 	daddr_t iaddr;
130*51500Sbostic 
131*51500Sbostic 	/* Read the appropriate block from the ifile. */
132*51500Sbostic 	LFS_IENTRY(ifp, fs, ino, bp);
133*51500Sbostic 
134*51500Sbostic 	if (ifp->if_daddr == LFS_UNUSED_DADDR)
135*51500Sbostic 		panic("itod: unused disk address");
136*51500Sbostic 	iaddr = ifp->if_daddr;
137*51500Sbostic 	brelse(bp);
138*51500Sbostic 	return (iaddr);
139*51500Sbostic }
140