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