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