mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-04 09:09:56 +00:00
This commit was generated by cvs2svn to compensate for changes in r41461,
which included commits to RCS files with non-trunk default branches.
This commit is contained in:
commit
f5dcaaf48e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=41462
270
sbin/fsck/ffs_subr.c
Normal file
270
sbin/fsck/ffs_subr.c
Normal file
@ -0,0 +1,270 @@
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ffs_subr.c 8.5 (Berkeley) 3/21/95
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#ifndef KERNEL
|
||||
#include <sys/time.h>
|
||||
#include <ufs/ufs/dinode.h>
|
||||
#include <ufs/ffs/fs.h>
|
||||
#include "fsck.h"
|
||||
|
||||
#else
|
||||
|
||||
#include <sys/systm.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/buf.h>
|
||||
#include <ufs/ufs/quota.h>
|
||||
#include <ufs/ufs/inode.h>
|
||||
#include <ufs/ffs/fs.h>
|
||||
#include <ufs/ffs/ffs_extern.h>
|
||||
|
||||
/*
|
||||
* Return buffer with the contents of block "offset" from the beginning of
|
||||
* directory "ip". If "res" is non-zero, fill it in with a pointer to the
|
||||
* remaining space in the directory.
|
||||
*/
|
||||
int
|
||||
ffs_blkatoff(ap)
|
||||
struct vop_blkatoff_args /* {
|
||||
struct vnode *a_vp;
|
||||
off_t a_offset;
|
||||
char **a_res;
|
||||
struct buf **a_bpp;
|
||||
} */ *ap;
|
||||
{
|
||||
struct inode *ip;
|
||||
register struct fs *fs;
|
||||
struct buf *bp;
|
||||
ufs_daddr_t lbn;
|
||||
int bsize, error;
|
||||
|
||||
ip = VTOI(ap->a_vp);
|
||||
fs = ip->i_fs;
|
||||
lbn = lblkno(fs, ap->a_offset);
|
||||
bsize = blksize(fs, ip, lbn);
|
||||
|
||||
*ap->a_bpp = NULL;
|
||||
if ((error = bread(ap->a_vp, lbn, bsize, NOCRED, &bp)) != 0) {
|
||||
brelse(bp);
|
||||
return (error);
|
||||
}
|
||||
if (ap->a_res)
|
||||
*ap->a_res = (char *)bp->b_data + blkoff(fs, ap->a_offset);
|
||||
*ap->a_bpp = bp;
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Update the frsum fields to reflect addition or deletion
|
||||
* of some frags.
|
||||
*/
|
||||
void
|
||||
ffs_fragacct(fs, fragmap, fraglist, cnt)
|
||||
struct fs *fs;
|
||||
int fragmap;
|
||||
int32_t fraglist[];
|
||||
int cnt;
|
||||
{
|
||||
int inblk;
|
||||
register int field, subfield;
|
||||
register int siz, pos;
|
||||
|
||||
inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
|
||||
fragmap <<= 1;
|
||||
for (siz = 1; siz < fs->fs_frag; siz++) {
|
||||
if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
|
||||
continue;
|
||||
field = around[siz];
|
||||
subfield = inside[siz];
|
||||
for (pos = siz; pos <= fs->fs_frag; pos++) {
|
||||
if ((fragmap & field) == subfield) {
|
||||
fraglist[siz] += cnt;
|
||||
pos += siz;
|
||||
field <<= siz;
|
||||
subfield <<= siz;
|
||||
}
|
||||
field <<= 1;
|
||||
subfield <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* defined(KERNEL) && defined(DIAGNOSTIC) */
|
||||
void
|
||||
ffs_checkoverlap(bp, ip)
|
||||
struct buf *bp;
|
||||
struct inode *ip;
|
||||
{
|
||||
register struct buf *ebp, *ep;
|
||||
register ufs_daddr_t start, last;
|
||||
struct vnode *vp;
|
||||
|
||||
ebp = &buf[nbuf];
|
||||
start = bp->b_blkno;
|
||||
last = start + btodb(bp->b_bcount) - 1;
|
||||
for (ep = buf; ep < ebp; ep++) {
|
||||
if (ep == bp || (ep->b_flags & B_INVAL) ||
|
||||
ep->b_vp == NULL)
|
||||
continue;
|
||||
if (VOP_BMAP(ep->b_vp, (daddr_t)0, &vp, NULL, NULL))
|
||||
continue;
|
||||
if (vp != ip->i_devvp)
|
||||
continue;
|
||||
/* look for overlap */
|
||||
if (ep->b_bcount == 0 || ep->b_blkno > last ||
|
||||
ep->b_blkno + btodb(ep->b_bcount) <= start)
|
||||
continue;
|
||||
vprint("Disk overlap", vp);
|
||||
(void)printf("\tstart %d, end %d overlap start %d, end %d\n",
|
||||
start, last, ep->b_blkno,
|
||||
ep->b_blkno + btodb(ep->b_bcount) - 1);
|
||||
panic("Disk buffer overlap");
|
||||
}
|
||||
}
|
||||
#endif /* DIAGNOSTIC */
|
||||
|
||||
/*
|
||||
* block operations
|
||||
*
|
||||
* check if a block is available
|
||||
*/
|
||||
int
|
||||
ffs_isblock(fs, cp, h)
|
||||
struct fs *fs;
|
||||
unsigned char *cp;
|
||||
ufs_daddr_t h;
|
||||
{
|
||||
unsigned char mask;
|
||||
|
||||
switch ((int)fs->fs_frag) {
|
||||
case 8:
|
||||
return (cp[h] == 0xff);
|
||||
case 4:
|
||||
mask = 0x0f << ((h & 0x1) << 2);
|
||||
return ((cp[h >> 1] & mask) == mask);
|
||||
case 2:
|
||||
mask = 0x03 << ((h & 0x3) << 1);
|
||||
return ((cp[h >> 2] & mask) == mask);
|
||||
case 1:
|
||||
mask = 0x01 << (h & 0x7);
|
||||
return ((cp[h >> 3] & mask) == mask);
|
||||
default:
|
||||
panic("ffs_isblock");
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* check if a block is free
|
||||
*/
|
||||
int
|
||||
ffs_isfreeblock(fs, cp, h)
|
||||
struct fs *fs;
|
||||
unsigned char *cp;
|
||||
ufs_daddr_t h;
|
||||
{
|
||||
|
||||
switch ((int)fs->fs_frag) {
|
||||
case 8:
|
||||
return (cp[h] == 0);
|
||||
case 4:
|
||||
return ((cp[h >> 1] & (0x0f << ((h & 0x1) << 2))) == 0);
|
||||
case 2:
|
||||
return ((cp[h >> 2] & (0x03 << ((h & 0x3) << 1))) == 0);
|
||||
case 1:
|
||||
return ((cp[h >> 3] & (0x01 << (h & 0x7))) == 0);
|
||||
default:
|
||||
panic("ffs_isfreeblock");
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* take a block out of the map
|
||||
*/
|
||||
void
|
||||
ffs_clrblock(fs, cp, h)
|
||||
struct fs *fs;
|
||||
u_char *cp;
|
||||
ufs_daddr_t h;
|
||||
{
|
||||
|
||||
switch ((int)fs->fs_frag) {
|
||||
case 8:
|
||||
cp[h] = 0;
|
||||
return;
|
||||
case 4:
|
||||
cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
|
||||
return;
|
||||
case 2:
|
||||
cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
|
||||
return;
|
||||
case 1:
|
||||
cp[h >> 3] &= ~(0x01 << (h & 0x7));
|
||||
return;
|
||||
default:
|
||||
panic("ffs_clrblock");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* put a block into the map
|
||||
*/
|
||||
void
|
||||
ffs_setblock(fs, cp, h)
|
||||
struct fs *fs;
|
||||
unsigned char *cp;
|
||||
ufs_daddr_t h;
|
||||
{
|
||||
|
||||
switch ((int)fs->fs_frag) {
|
||||
|
||||
case 8:
|
||||
cp[h] = 0xff;
|
||||
return;
|
||||
case 4:
|
||||
cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
|
||||
return;
|
||||
case 2:
|
||||
cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
|
||||
return;
|
||||
case 1:
|
||||
cp[h >> 3] |= (0x01 << (h & 0x7));
|
||||
return;
|
||||
default:
|
||||
panic("ffs_setblock");
|
||||
}
|
||||
}
|
136
sbin/fsck/ffs_tables.c
Normal file
136
sbin/fsck/ffs_tables.c
Normal file
@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ffs_tables.c 8.1 (Berkeley) 6/11/93
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
/*
|
||||
* Bit patterns for identifying fragments in the block map
|
||||
* used as ((map & around) == inside)
|
||||
*/
|
||||
int around[9] = {
|
||||
0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff
|
||||
};
|
||||
int inside[9] = {
|
||||
0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe
|
||||
};
|
||||
|
||||
/*
|
||||
* Given a block map bit pattern, the frag tables tell whether a
|
||||
* particular size fragment is available.
|
||||
*
|
||||
* used as:
|
||||
* if ((1 << (size - 1)) & fragtbl[fs->fs_frag][map] {
|
||||
* at least one fragment of the indicated size is available
|
||||
* }
|
||||
*
|
||||
* These tables are used by the scanc instruction on the VAX to
|
||||
* quickly find an appropriate fragment.
|
||||
*/
|
||||
u_char fragtbl124[256] = {
|
||||
0x00, 0x16, 0x16, 0x2a, 0x16, 0x16, 0x26, 0x4e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x2a, 0x3e, 0x4e, 0x8a,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x26, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x26, 0x6e,
|
||||
0x36, 0x36, 0x36, 0x3e, 0x2e, 0x3e, 0x6e, 0xae,
|
||||
0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
|
||||
0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
|
||||
0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
|
||||
0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
|
||||
0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
|
||||
0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
|
||||
0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
|
||||
0x8a, 0x9e, 0x9e, 0xaa, 0x9e, 0x9e, 0xae, 0xce,
|
||||
0x9e, 0x9e, 0x9e, 0xbe, 0xaa, 0xbe, 0xce, 0x8a,
|
||||
};
|
||||
|
||||
u_char fragtbl8[256] = {
|
||||
0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04,
|
||||
0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
|
||||
0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
|
||||
0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
|
||||
0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
|
||||
0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
|
||||
0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
|
||||
0x08, 0x09, 0x09, 0x0a, 0x10, 0x11, 0x20, 0x40,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
|
||||
0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
|
||||
0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
|
||||
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
|
||||
0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21,
|
||||
0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
|
||||
0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
|
||||
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
|
||||
0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0a, 0x12,
|
||||
0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
|
||||
0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0c,
|
||||
0x08, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x0a, 0x0c,
|
||||
0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80,
|
||||
};
|
||||
|
||||
/*
|
||||
* The actual fragtbl array.
|
||||
*/
|
||||
u_char *fragtbl[MAXFRAG + 1] = {
|
||||
0, fragtbl124, fragtbl124, 0, fragtbl124, 0, 0, 0, fragtbl8,
|
||||
};
|
Loading…
Reference in New Issue
Block a user