SCCS-vsn: sbin/restore/main.c 1.14
SCCS-vsn: sys/ufs/ffs/ffs_alloc.c 1.19
SCCS-vsn: sys/ufs/lfs/lfs_alloc.c 1.19
/* Copyright (c) 1981 Regents of the University of California */
/* Copyright (c) 1981 Regents of the University of California */
-char version[] = "@(#)main.c 1.13 %G%";
+char version[] = "@(#)main.c 1.14 %G%";
/* Modified to include h option (recursively extract all files within
* a subtree) and m option (recreate the heirarchical structure of
/* Modified to include h option (recursively extract all files within
* a subtree) and m option (recreate the heirarchical structure of
char mounted = 0;
dev_t dev = 0;
char mounted = 0;
dev_t dev = 0;
+struct fs *fsptr;
+struct inode parentino;
char tapename[] = "/dev/rmt8";
char *magtape = tapename;
int mt;
char tapename[] = "/dev/rmt8";
char *magtape = tapename;
int mt;
char *ststore();
register struct xtrlist *xp;
struct xtrlist **xpp;
char *ststore();
register struct xtrlist *xp;
struct xtrlist **xpp;
ino_t d;
int xtrfile(), xtrskip(), xtrcvtdir(), xtrcvtskip(), null();
int mode;
ino_t d;
int xtrfile(), xtrskip(), xtrcvtdir(), xtrcvtskip(), null();
int mode;
if (checkvol(&spcl, 1) == 0) {
fprintf(stderr, "Tape is not volume 1 of the dump\n");
}
if (checkvol(&spcl, 1) == 0) {
fprintf(stderr, "Tape is not volume 1 of the dump\n");
}
- fs = getfs(dev);
- msiz = roundup(howmany(fs->fs_ipg * fs->fs_ncg, NBBY), TP_BSIZE);
+ fsptr = getfs(dev);
+ msiz = roundup(howmany(fsptr->fs_ipg * fsptr->fs_ncg, NBBY), TP_BSIZE);
clrimap = (char *)calloc(msiz, sizeof(char));
dumpmap = (char *)calloc(msiz, sizeof(char));
pass1(1); /* This sets the various maps on the way by */
clrimap = (char *)calloc(msiz, sizeof(char));
dumpmap = (char *)calloc(msiz, sizeof(char));
pass1(1); /* This sets the various maps on the way by */
int null(), rstrfile(), rstrskip(), rstrcvtdir(), rstrcvtskip();
register struct dinode *dp;
register struct inode *ip;
int null(), rstrfile(), rstrskip(), rstrcvtdir(), rstrcvtskip();
register struct dinode *dp;
register struct inode *ip;
int mode, type;
char mount[BUFSIZ + 1];
char *ptr[2];
int mode, type;
char mount[BUFSIZ + 1];
char *ptr[2];
mounted++;
iput(u.u_cdir); /* release root inode */
iput(u.u_rdir); /* release root inode */
mounted++;
iput(u.u_cdir); /* release root inode */
iput(u.u_rdir); /* release root inode */
- fs = getfs(dev);
- maxi = fs->fs_ipg * fs->fs_ncg;
+ fsptr = getfs(dev);
+ parentino.i_fs = fsptr;
+ parentino.i_dev = dev;
+ maxi = fsptr->fs_ipg * fsptr->fs_ncg;
#ifndef STANDALONE
msiz = roundup(howmany(maxi, NBBY), TP_BSIZE);
clrimap = (char *)calloc(msiz, sizeof(char));
#ifndef STANDALONE
msiz = roundup(howmany(maxi, NBBY), TP_BSIZE);
clrimap = (char *)calloc(msiz, sizeof(char));
BIS(LOSTFOUNDINO + 1, clrimap);
for (ino = ROOTINO; ino <= maxi; ino++)
if (BIT(ino, clrimap) == 0) {
BIS(LOSTFOUNDINO + 1, clrimap);
for (ino = ROOTINO; ino <= maxi; ino++)
if (BIT(ino, clrimap) == 0) {
+ if (!iexist(&parentino, ino))
+ ip = iget(dev, fsptr, ino);
if (ip == NULL) {
fprintf(stderr, "can't find inode %u\n", ino);
done(1);
if (ip == NULL) {
fprintf(stderr, "can't find inode %u\n", ino);
done(1);
getfile(null, null, dp->di_size);
continue;
}
getfile(null, null, dp->di_size);
continue;
}
- if (iexist(dev, ino)) {
- ip = iget(dev, ino);
+ if (iexist(&parentino, ino)) {
+ ip = iget(dev, fsptr, ino);
if (ip == NULL) {
fprintf(stderr, "can't find inode %u\n",
ino);
if (ip == NULL) {
fprintf(stderr, "can't find inode %u\n",
ino);
ip->i_flag |= ICHG;
iput(ip);
}
ip->i_flag |= ICHG;
iput(ip);
}
- ip = ialloc(dev, ino, dp->di_mode);
+ ip = ialloc(&parentino, ino, dp->di_mode);
if (ip == NULL || ip->i_number != ino) {
fprintf(stderr, "can't create inode %u\n", ino);
done(1);
if (ip == NULL || ip->i_number != ino) {
fprintf(stderr, "can't create inode %u\n", ino);
done(1);
register int i;
char buf[MAXBSIZE / TP_BSIZE][TP_BSIZE];
union u_spcl addrblk;
register int i;
char buf[MAXBSIZE / TP_BSIZE][TP_BSIZE];
union u_spcl addrblk;
- register struct fs *fs;
# define addrblock addrblk.s_spcl
addrblock = spcl;
# define addrblock addrblk.s_spcl
addrblock = spcl;
for (;;) {
for (i = 0; i < addrblock.c_count; i++) {
if (addrblock.c_addr[i]) {
readtape(&buf[curblk++][0]);
for (;;) {
for (i = 0; i < addrblock.c_count; i++) {
if (addrblock.c_addr[i]) {
readtape(&buf[curblk++][0]);
- if (curblk == BLKING(fs) * fs->fs_frag) {
+ if (curblk == BLKING(fsptr) * fsptr->fs_frag) {
(*f1)(buf, size > TP_BSIZE ?
(*f1)(buf, size > TP_BSIZE ?
- (long) (BLKING(fs) * fs->fs_frag * TP_BSIZE) :
+ (long) (BLKING(fsptr) * fsptr->fs_frag * TP_BSIZE) :
(curblk - 1) * TP_BSIZE + size);
curblk = 0;
}
(curblk - 1) * TP_BSIZE + size);
curblk = 0;
}
while ((rp = wait(&i)) >= 0 && rp != pid)
;
xmount(envp);
while ((rp = wait(&i)) >= 0 && rp != pid)
;
xmount(envp);
+ fsptr = getfs(dev);
+ parentino.i_fs = fsptr;
* tell whether an inode is allocated
* this is drawn from ialloccg in sys/alloc.c
*/
* tell whether an inode is allocated
* this is drawn from ialloccg in sys/alloc.c
*/
-iexist(dev, ino)
- dev_t dev;
+iexist(ip, ino)
+ struct inode *ip;
ino_t ino;
{
register struct fs *fs;
ino_t ino;
{
register struct fs *fs;
register struct buf *bp;
int cg;
register struct buf *bp;
int cg;
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
return (0);
cg = itog(fs, ino);
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
return (0);
cg = itog(fs, ino);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return(0);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return(0);
/* Copyright (c) 1981 Regents of the University of California */
/* Copyright (c) 1981 Regents of the University of California */
-static char vers[] = "@(#)ffs_alloc.c 1.18 %G%";
+static char vers[] = "@(#)ffs_alloc.c 1.19 %G%";
/* alloc.c 4.8 81/03/08 */
/* alloc.c 4.8 81/03/08 */
* available block is located.
*/
struct buf *
* available block is located.
*/
struct buf *
-alloc(dev, ip, bpref, size)
- dev_t dev;
register struct inode *ip;
daddr_t bpref;
int size;
register struct inode *ip;
daddr_t bpref;
int size;
register struct buf *bp;
int cg;
register struct buf *bp;
int cg;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("alloc: bad size");
if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0)
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("alloc: bad size");
if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0)
cg = itog(fs, ip->i_number);
else
cg = dtog(fs, bpref);
cg = itog(fs, ip->i_number);
else
cg = dtog(fs, bpref);
- bno = (daddr_t)hashalloc(dev, fs, cg, (long)bpref, size, alloccg);
+ bno = (daddr_t)hashalloc(ip, cg, (long)bpref, size, alloccg);
if (bno == 0)
goto nospace;
if (bno == 0)
goto nospace;
- bp = getblk(dev, fsbtodb(fs, bno), size);
+ bp = getblk(ip->i_dev, fsbtodb(fs, bno), size);
clrbuf(bp);
return (bp);
nospace:
clrbuf(bp);
return (bp);
nospace:
* invoked to get an appropriate block.
*/
struct buf *
* invoked to get an appropriate block.
*/
struct buf *
-realloccg(dev, bprev, bpref, osize, nsize)
- dev_t dev;
+realloccg(ip, bprev, bpref, osize, nsize)
+ register struct inode *ip;
daddr_t bprev, bpref;
int osize, nsize;
{
daddr_t bprev, bpref;
int osize, nsize;
{
if ((unsigned)osize > fs->fs_bsize || fragoff(fs, osize) != 0 ||
(unsigned)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0)
panic("realloccg: bad size");
if ((unsigned)osize > fs->fs_bsize || fragoff(fs, osize) != 0 ||
(unsigned)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0)
panic("realloccg: bad size");
cg = dtog(fs, bprev);
else
panic("realloccg: bad bprev");
cg = dtog(fs, bprev);
else
panic("realloccg: bad bprev");
- bno = fragextend(dev, fs, cg, (long)bprev, osize, nsize);
+ bno = fragextend(ip, cg, (long)bprev, osize, nsize);
- bp = bread(dev, fsbtodb(fs, bno), osize);
+ bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
}
if (bpref >= fs->fs_size)
bpref = 0;
}
if (bpref >= fs->fs_size)
bpref = 0;
- bno = (daddr_t)hashalloc(dev, fs, cg, (long)bpref, nsize, alloccg);
+ bno = (daddr_t)hashalloc(ip, cg, (long)bpref, nsize, alloccg);
if (bno != 0) {
/*
* make a new copy
*/
if (bno != 0) {
/*
* make a new copy
*/
- obp = bread(dev, fsbtodb(fs, bprev), osize);
+ obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize);
if (obp->b_flags & B_ERROR) {
brelse(obp);
return 0;
}
if (obp->b_flags & B_ERROR) {
brelse(obp);
return 0;
}
- bp = getblk(dev, fsbtodb(fs, bno), nsize);
+ bp = getblk(ip->i_dev, fsbtodb(fs, bno), nsize);
cp = bp->b_un.b_addr;
bp->b_un.b_addr = obp->b_un.b_addr;
obp->b_un.b_addr = cp;
obp->b_flags |= B_INVAL;
brelse(obp);
cp = bp->b_un.b_addr;
bp->b_un.b_addr = obp->b_un.b_addr;
obp->b_un.b_addr = cp;
obp->b_flags |= B_INVAL;
brelse(obp);
- fre(dev, bprev, (off_t)osize);
+ fre(ip, bprev, (off_t)osize);
blkclr(bp->b_un.b_addr + osize, nsize - osize);
return(bp);
}
blkclr(bp->b_un.b_addr + osize, nsize - osize);
return(bp);
}
* available inode is located.
*/
struct inode *
* available inode is located.
*/
struct inode *
-ialloc(dev, ipref, mode)
- dev_t dev;
+ialloc(pip, ipref, mode)
+ register struct inode *pip;
register struct inode *ip;
int cg;
register struct inode *ip;
int cg;
if (fs->fs_cstotal.cs_nifree == 0)
goto noinodes;
if (ipref >= fs->fs_ncg * fs->fs_ipg)
ipref = 0;
cg = itog(fs, ipref);
if (fs->fs_cstotal.cs_nifree == 0)
goto noinodes;
if (ipref >= fs->fs_ncg * fs->fs_ipg)
ipref = 0;
cg = itog(fs, ipref);
- ino = (ino_t)hashalloc(dev, fs, cg, (long)ipref, mode, ialloccg);
+ ino = (ino_t)hashalloc(pip, cg, (long)ipref, mode, ialloccg);
if (ino == 0)
goto noinodes;
if (ino == 0)
goto noinodes;
+ ip = iget(pip->i_dev, pip->i_fs, ino);
return (NULL);
}
if (ip->i_mode)
return (NULL);
}
if (ip->i_mode)
* among those cylinder groups with above the average number of
* free inodes, the one with the smallest number of directories.
*/
* among those cylinder groups with above the average number of
* free inodes, the one with the smallest number of directories.
*/
-dirpref(dev)
- dev_t dev;
-{
int cg, minndir, mincg, avgifree;
int cg, minndir, mincg, avgifree;
avgifree = fs->fs_cstotal.cs_nifree / fs->fs_ncg;
minndir = fs->fs_ipg;
mincg = 0;
avgifree = fs->fs_cstotal.cs_nifree / fs->fs_ncg;
minndir = fs->fs_ipg;
mincg = 0;
* greater than the average number of free blocks is found.
*/
daddr_t
* greater than the average number of free blocks is found.
*/
daddr_t
-blkpref(dev)
- dev_t dev;
-{
avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg;
for (cg = fs->fs_cgrotor + 1; cg < fs->fs_ncg; cg++)
if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) {
avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg;
for (cg = fs->fs_cgrotor + 1; cg < fs->fs_ncg; cg++)
if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) {
-hashalloc(dev, fs, cg, pref, size, allocator)
- dev_t dev;
- register struct fs *fs;
+hashalloc(ip, cg, pref, size, allocator)
+ struct inode *ip;
int cg;
long pref;
int size; /* size for data blocks, mode for inodes */
u_long (*allocator)();
{
int cg;
long pref;
int size; /* size for data blocks, mode for inodes */
u_long (*allocator)();
{
+ register struct fs *fs;
long result;
int i, icg = cg;
long result;
int i, icg = cg;
/*
* 1: preferred cylinder group
*/
/*
* 1: preferred cylinder group
*/
- result = (*allocator)(dev, fs, cg, pref, size);
+ result = (*allocator)(ip, cg, pref, size);
if (result)
return (result);
/*
if (result)
return (result);
/*
cg += i;
if (cg >= fs->fs_ncg)
cg -= fs->fs_ncg;
cg += i;
if (cg >= fs->fs_ncg)
cg -= fs->fs_ncg;
- result = (*allocator)(dev, fs, cg, 0, size);
+ result = (*allocator)(ip, cg, 0, size);
if (result)
return (result);
}
if (result)
return (result);
}
*/
cg = icg;
for (i = 0; i < fs->fs_ncg; i++) {
*/
cg = icg;
for (i = 0; i < fs->fs_ncg; i++) {
- result = (*allocator)(dev, fs, cg, 0, size);
+ result = (*allocator)(ip, cg, 0, size);
if (result)
return (result);
cg++;
if (result)
return (result);
cg++;
* if they are, allocate them.
*/
daddr_t
* if they are, allocate them.
*/
daddr_t
-fragextend(dev, fs, cg, bprev, osize, nsize)
- dev_t dev;
- register struct fs *fs;
+fragextend(ip, cg, bprev, osize, nsize)
+ struct inode *ip;
int cg;
long bprev;
int osize, nsize;
{
int cg;
long bprev;
int osize, nsize;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
long bno;
int frags, bbase;
int i;
register struct buf *bp;
register struct cg *cgp;
long bno;
int frags, bbase;
int i;
frags = numfrags(fs, nsize);
bbase = fragoff(fs, bprev);
if (bbase > (bprev + frags - 1) % fs->fs_frag) {
/* cannot extend across a block boundry */
return (0);
}
frags = numfrags(fs, nsize);
bbase = fragoff(fs, bprev);
if (bbase > (bprev + frags - 1) % fs->fs_frag) {
/* cannot extend across a block boundry */
return (0);
}
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
* and if it is, allocate it.
*/
daddr_t
* and if it is, allocate it.
*/
daddr_t
-alloccg(dev, fs, cg, bpref, size)
- dev_t dev;
- register struct fs *fs;
+alloccg(ip, cg, bpref, size)
+ struct inode *ip;
int cg;
daddr_t bpref;
int size;
{
int cg;
daddr_t bpref;
int size;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
int bno, frags;
int allocsiz;
register int i;
register struct buf *bp;
register struct cg *cgp;
int bno, frags;
int allocsiz;
register int i;
if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize)
return (0);
if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize)
return (0);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
*/
daddr_t
alloccgblk(fs, cgp, bpref)
*/
daddr_t
alloccgblk(fs, cgp, bpref)
+ register struct fs *fs;
register struct cg *cgp;
daddr_t bpref;
{
register struct cg *cgp;
daddr_t bpref;
{
* inode in the specified cylinder group.
*/
ino_t
* inode in the specified cylinder group.
*/
ino_t
-ialloccg(dev, fs, cg, ipref, mode)
- dev_t dev;
- register struct fs *fs;
+ialloccg(ip, cg, ipref, mode)
+ struct inode *ip;
int cg;
daddr_t ipref;
int mode;
{
int cg;
daddr_t ipref;
int mode;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
int i;
register struct buf *bp;
register struct cg *cgp;
int i;
if (fs->fs_cs(fs, cg).cs_nifree == 0)
return (0);
if (fs->fs_cs(fs, cg).cs_nifree == 0)
return (0);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
-fre(dev, bno, size)
- dev_t dev;
+fre(ip, bno, size)
+ register struct inode *ip;
daddr_t bno;
off_t size;
{
daddr_t bno;
off_t size;
{
int cg, blk, frags, bbase;
register int i;
int cg, blk, frags, bbase;
register int i;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("free: bad size");
cg = dtog(fs, bno);
if (badblock(fs, bno))
return;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("free: bad size");
cg = dtog(fs, bno);
if (badblock(fs, bno))
return;
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
*
* The specified inode is placed back in the free map.
*/
*
* The specified inode is placed back in the free map.
*/
-ifree(dev, ino, mode)
- dev_t dev;
+ifree(ip, ino, mode)
+ struct inode *ip;
register struct buf *bp;
int cg;
register struct buf *bp;
int cg;
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
panic("ifree: range");
cg = itog(fs, ino);
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
panic("ifree: range");
cg = itog(fs, ino);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
/* Copyright (c) 1981 Regents of the University of California */
/* Copyright (c) 1981 Regents of the University of California */
-static char vers[] = "@(#)lfs_alloc.c 1.18 %G%";
+static char vers[] = "@(#)lfs_alloc.c 1.19 %G%";
/* alloc.c 4.8 81/03/08 */
/* alloc.c 4.8 81/03/08 */
* available block is located.
*/
struct buf *
* available block is located.
*/
struct buf *
-alloc(dev, ip, bpref, size)
- dev_t dev;
register struct inode *ip;
daddr_t bpref;
int size;
register struct inode *ip;
daddr_t bpref;
int size;
register struct buf *bp;
int cg;
register struct buf *bp;
int cg;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("alloc: bad size");
if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0)
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("alloc: bad size");
if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0)
cg = itog(fs, ip->i_number);
else
cg = dtog(fs, bpref);
cg = itog(fs, ip->i_number);
else
cg = dtog(fs, bpref);
- bno = (daddr_t)hashalloc(dev, fs, cg, (long)bpref, size, alloccg);
+ bno = (daddr_t)hashalloc(ip, cg, (long)bpref, size, alloccg);
if (bno == 0)
goto nospace;
if (bno == 0)
goto nospace;
- bp = getblk(dev, fsbtodb(fs, bno), size);
+ bp = getblk(ip->i_dev, fsbtodb(fs, bno), size);
clrbuf(bp);
return (bp);
nospace:
clrbuf(bp);
return (bp);
nospace:
* invoked to get an appropriate block.
*/
struct buf *
* invoked to get an appropriate block.
*/
struct buf *
-realloccg(dev, bprev, bpref, osize, nsize)
- dev_t dev;
+realloccg(ip, bprev, bpref, osize, nsize)
+ register struct inode *ip;
daddr_t bprev, bpref;
int osize, nsize;
{
daddr_t bprev, bpref;
int osize, nsize;
{
if ((unsigned)osize > fs->fs_bsize || fragoff(fs, osize) != 0 ||
(unsigned)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0)
panic("realloccg: bad size");
if ((unsigned)osize > fs->fs_bsize || fragoff(fs, osize) != 0 ||
(unsigned)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0)
panic("realloccg: bad size");
cg = dtog(fs, bprev);
else
panic("realloccg: bad bprev");
cg = dtog(fs, bprev);
else
panic("realloccg: bad bprev");
- bno = fragextend(dev, fs, cg, (long)bprev, osize, nsize);
+ bno = fragextend(ip, cg, (long)bprev, osize, nsize);
- bp = bread(dev, fsbtodb(fs, bno), osize);
+ bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
}
if (bpref >= fs->fs_size)
bpref = 0;
}
if (bpref >= fs->fs_size)
bpref = 0;
- bno = (daddr_t)hashalloc(dev, fs, cg, (long)bpref, nsize, alloccg);
+ bno = (daddr_t)hashalloc(ip, cg, (long)bpref, nsize, alloccg);
if (bno != 0) {
/*
* make a new copy
*/
if (bno != 0) {
/*
* make a new copy
*/
- obp = bread(dev, fsbtodb(fs, bprev), osize);
+ obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize);
if (obp->b_flags & B_ERROR) {
brelse(obp);
return 0;
}
if (obp->b_flags & B_ERROR) {
brelse(obp);
return 0;
}
- bp = getblk(dev, fsbtodb(fs, bno), nsize);
+ bp = getblk(ip->i_dev, fsbtodb(fs, bno), nsize);
cp = bp->b_un.b_addr;
bp->b_un.b_addr = obp->b_un.b_addr;
obp->b_un.b_addr = cp;
obp->b_flags |= B_INVAL;
brelse(obp);
cp = bp->b_un.b_addr;
bp->b_un.b_addr = obp->b_un.b_addr;
obp->b_un.b_addr = cp;
obp->b_flags |= B_INVAL;
brelse(obp);
- fre(dev, bprev, (off_t)osize);
+ fre(ip, bprev, (off_t)osize);
blkclr(bp->b_un.b_addr + osize, nsize - osize);
return(bp);
}
blkclr(bp->b_un.b_addr + osize, nsize - osize);
return(bp);
}
* available inode is located.
*/
struct inode *
* available inode is located.
*/
struct inode *
-ialloc(dev, ipref, mode)
- dev_t dev;
+ialloc(pip, ipref, mode)
+ register struct inode *pip;
register struct inode *ip;
int cg;
register struct inode *ip;
int cg;
if (fs->fs_cstotal.cs_nifree == 0)
goto noinodes;
if (ipref >= fs->fs_ncg * fs->fs_ipg)
ipref = 0;
cg = itog(fs, ipref);
if (fs->fs_cstotal.cs_nifree == 0)
goto noinodes;
if (ipref >= fs->fs_ncg * fs->fs_ipg)
ipref = 0;
cg = itog(fs, ipref);
- ino = (ino_t)hashalloc(dev, fs, cg, (long)ipref, mode, ialloccg);
+ ino = (ino_t)hashalloc(pip, cg, (long)ipref, mode, ialloccg);
if (ino == 0)
goto noinodes;
if (ino == 0)
goto noinodes;
+ ip = iget(pip->i_dev, pip->i_fs, ino);
return (NULL);
}
if (ip->i_mode)
return (NULL);
}
if (ip->i_mode)
* among those cylinder groups with above the average number of
* free inodes, the one with the smallest number of directories.
*/
* among those cylinder groups with above the average number of
* free inodes, the one with the smallest number of directories.
*/
-dirpref(dev)
- dev_t dev;
-{
int cg, minndir, mincg, avgifree;
int cg, minndir, mincg, avgifree;
avgifree = fs->fs_cstotal.cs_nifree / fs->fs_ncg;
minndir = fs->fs_ipg;
mincg = 0;
avgifree = fs->fs_cstotal.cs_nifree / fs->fs_ncg;
minndir = fs->fs_ipg;
mincg = 0;
* greater than the average number of free blocks is found.
*/
daddr_t
* greater than the average number of free blocks is found.
*/
daddr_t
-blkpref(dev)
- dev_t dev;
-{
avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg;
for (cg = fs->fs_cgrotor + 1; cg < fs->fs_ncg; cg++)
if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) {
avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg;
for (cg = fs->fs_cgrotor + 1; cg < fs->fs_ncg; cg++)
if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) {
-hashalloc(dev, fs, cg, pref, size, allocator)
- dev_t dev;
- register struct fs *fs;
+hashalloc(ip, cg, pref, size, allocator)
+ struct inode *ip;
int cg;
long pref;
int size; /* size for data blocks, mode for inodes */
u_long (*allocator)();
{
int cg;
long pref;
int size; /* size for data blocks, mode for inodes */
u_long (*allocator)();
{
+ register struct fs *fs;
long result;
int i, icg = cg;
long result;
int i, icg = cg;
/*
* 1: preferred cylinder group
*/
/*
* 1: preferred cylinder group
*/
- result = (*allocator)(dev, fs, cg, pref, size);
+ result = (*allocator)(ip, cg, pref, size);
if (result)
return (result);
/*
if (result)
return (result);
/*
cg += i;
if (cg >= fs->fs_ncg)
cg -= fs->fs_ncg;
cg += i;
if (cg >= fs->fs_ncg)
cg -= fs->fs_ncg;
- result = (*allocator)(dev, fs, cg, 0, size);
+ result = (*allocator)(ip, cg, 0, size);
if (result)
return (result);
}
if (result)
return (result);
}
*/
cg = icg;
for (i = 0; i < fs->fs_ncg; i++) {
*/
cg = icg;
for (i = 0; i < fs->fs_ncg; i++) {
- result = (*allocator)(dev, fs, cg, 0, size);
+ result = (*allocator)(ip, cg, 0, size);
if (result)
return (result);
cg++;
if (result)
return (result);
cg++;
* if they are, allocate them.
*/
daddr_t
* if they are, allocate them.
*/
daddr_t
-fragextend(dev, fs, cg, bprev, osize, nsize)
- dev_t dev;
- register struct fs *fs;
+fragextend(ip, cg, bprev, osize, nsize)
+ struct inode *ip;
int cg;
long bprev;
int osize, nsize;
{
int cg;
long bprev;
int osize, nsize;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
long bno;
int frags, bbase;
int i;
register struct buf *bp;
register struct cg *cgp;
long bno;
int frags, bbase;
int i;
frags = numfrags(fs, nsize);
bbase = fragoff(fs, bprev);
if (bbase > (bprev + frags - 1) % fs->fs_frag) {
/* cannot extend across a block boundry */
return (0);
}
frags = numfrags(fs, nsize);
bbase = fragoff(fs, bprev);
if (bbase > (bprev + frags - 1) % fs->fs_frag) {
/* cannot extend across a block boundry */
return (0);
}
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
* and if it is, allocate it.
*/
daddr_t
* and if it is, allocate it.
*/
daddr_t
-alloccg(dev, fs, cg, bpref, size)
- dev_t dev;
- register struct fs *fs;
+alloccg(ip, cg, bpref, size)
+ struct inode *ip;
int cg;
daddr_t bpref;
int size;
{
int cg;
daddr_t bpref;
int size;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
int bno, frags;
int allocsiz;
register int i;
register struct buf *bp;
register struct cg *cgp;
int bno, frags;
int allocsiz;
register int i;
if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize)
return (0);
if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize)
return (0);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
*/
daddr_t
alloccgblk(fs, cgp, bpref)
*/
daddr_t
alloccgblk(fs, cgp, bpref)
+ register struct fs *fs;
register struct cg *cgp;
daddr_t bpref;
{
register struct cg *cgp;
daddr_t bpref;
{
* inode in the specified cylinder group.
*/
ino_t
* inode in the specified cylinder group.
*/
ino_t
-ialloccg(dev, fs, cg, ipref, mode)
- dev_t dev;
- register struct fs *fs;
+ialloccg(ip, cg, ipref, mode)
+ struct inode *ip;
int cg;
daddr_t ipref;
int mode;
{
int cg;
daddr_t ipref;
int mode;
{
+ register struct fs *fs;
register struct buf *bp;
register struct cg *cgp;
int i;
register struct buf *bp;
register struct cg *cgp;
int i;
if (fs->fs_cs(fs, cg).cs_nifree == 0)
return (0);
if (fs->fs_cs(fs, cg).cs_nifree == 0)
return (0);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return 0;
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
-fre(dev, bno, size)
- dev_t dev;
+fre(ip, bno, size)
+ register struct inode *ip;
daddr_t bno;
off_t size;
{
daddr_t bno;
off_t size;
{
int cg, blk, frags, bbase;
register int i;
int cg, blk, frags, bbase;
register int i;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("free: bad size");
cg = dtog(fs, bno);
if (badblock(fs, bno))
return;
if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0)
panic("free: bad size");
cg = dtog(fs, bno);
if (badblock(fs, bno))
return;
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
*
* The specified inode is placed back in the free map.
*/
*
* The specified inode is placed back in the free map.
*/
-ifree(dev, ino, mode)
- dev_t dev;
+ifree(ip, ino, mode)
+ struct inode *ip;
register struct buf *bp;
int cg;
register struct buf *bp;
int cg;
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
panic("ifree: range");
cg = itog(fs, ino);
if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg)
panic("ifree: range");
cg = itog(fs, ino);
- bp = bread(dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
+ bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), fs->fs_bsize);
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;
if (bp->b_flags & B_ERROR) {
brelse(bp);
return;