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