summaryrefslogtreecommitdiff
path: root/libexec/lfs_cleanerd/library.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/lfs_cleanerd/library.c')
-rw-r--r--libexec/lfs_cleanerd/library.c220
1 files changed, 102 insertions, 118 deletions
diff --git a/libexec/lfs_cleanerd/library.c b/libexec/lfs_cleanerd/library.c
index 6bc97054596..178021d1773 100644
--- a/libexec/lfs_cleanerd/library.c
+++ b/libexec/lfs_cleanerd/library.c
@@ -1,4 +1,4 @@
-/* $NetBSD: library.c,v 1.21 2001/02/04 22:12:47 christos Exp $ */
+/* $NetBSD: library.c,v 1.22 2001/07/13 20:30:22 perseant Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)library.c 8.3 (Berkeley) 5/24/95";
#else
-__RCSID("$NetBSD: library.c,v 1.21 2001/02/04 22:12:47 christos Exp $");
+__RCSID("$NetBSD: library.c,v 1.22 2001/07/13 20:30:22 perseant Exp $");
#endif
#endif /* not lint */
@@ -62,19 +62,19 @@ __RCSID("$NetBSD: library.c,v 1.21 2001/02/04 22:12:47 christos Exp $");
#include "clean.h"
-void add_blocks __P((FS_INFO *, BLOCK_INFO *, int *, SEGSUM *, caddr_t,
- daddr_t, daddr_t));
-void add_inodes __P((FS_INFO *, BLOCK_INFO *, int *, SEGSUM *, caddr_t,
- daddr_t));
-int bi_compare __P((const void *, const void *));
-int bi_toss __P((const void *, const void *, const void *));
-void get_ifile __P((FS_INFO *, int));
-int get_superblock __P((FS_INFO *, struct lfs *));
-int pseg_valid __P((FS_INFO *, SEGSUM *, daddr_t));
-int pseg_size __P((daddr_t, FS_INFO *, SEGSUM *));
+void add_blocks(FS_INFO *, BLOCK_INFO *, int *, SEGSUM *, caddr_t,
+ daddr_t, daddr_t);
+void add_inodes(FS_INFO *, BLOCK_INFO *, int *, SEGSUM *, caddr_t,
+ daddr_t);
+int bi_compare(const void *, const void *);
+int bi_toss(const void *, const void *, const void *);
+void get_ifile(FS_INFO *, int);
+int get_superblock(FS_INFO *, struct lfs *);
+int pseg_valid(FS_INFO *, SEGSUM *, daddr_t);
+int pseg_size(daddr_t, FS_INFO *, SEGSUM *);
extern int debug;
-extern u_long cksum __P((void *, size_t)); /* XXX */
+extern u_long cksum(void *, size_t); /* XXX */
static int ifile_fd;
static int dev_fd;
@@ -86,10 +86,7 @@ static int dev_fd;
* a non-zero value is returned.
*/
int
-fs_getmntinfo(buf, name, type)
- struct statfs **buf;
- char *name;
- const char *type;
+fs_getmntinfo(struct statfs **buf, char *name, const char *type)
{
/* allocate space for the filesystem info */
*buf = (struct statfs *)malloc(sizeof(struct statfs));
@@ -123,9 +120,7 @@ fs_getmntinfo(buf, name, type)
* Returns an pointer to an FS_INFO structure, NULL on error.
*/
FS_INFO *
-get_fs_info (lstatfsp, use_mmap)
- struct statfs *lstatfsp; /* IN: pointer to statfs struct */
- int use_mmap; /* IN: mmap or read */
+get_fs_info (struct statfs *lstatfsp, int use_mmap)
{
FS_INFO *fsp;
@@ -139,8 +134,6 @@ get_fs_info (lstatfsp, use_mmap)
syslog(LOG_ERR, "Exiting: get_fs_info: get_superblock failed: %m");
exit(1);
}
- fsp->fi_daddr_shift =
- fsp->fi_lfs.lfs_bshift - fsp->fi_lfs.lfs_fsbtodb;
get_ifile (fsp, use_mmap);
return (fsp);
}
@@ -151,9 +144,7 @@ get_fs_info (lstatfsp, use_mmap)
* refresh the file system information (statfs) info.
*/
void
-reread_fs_info(fsp, use_mmap)
- FS_INFO *fsp; /* IN: prointer fs_infos to reread */
- int use_mmap;
+reread_fs_info(FS_INFO *fsp, int use_mmap)
{
if (ifile_fd <= 0) {
if (fstatfs(ifile_fd, fsp->fi_statfsp)) {
@@ -171,12 +162,11 @@ reread_fs_info(fsp, use_mmap)
* Gets the superblock from disk (possibly in face of errors)
*/
int
-get_superblock (fsp, sbp)
- FS_INFO *fsp; /* local file system info structure */
- struct lfs *sbp;
+get_superblock (FS_INFO *fsp, struct lfs *sbp)
{
char mntfromname[MNAMELEN+1];
char buf[LFS_SBPAD];
+ static off_t sboff = LFS_LABELPAD;
strcpy(mntfromname, "/dev/r");
strcat(mntfromname, fsp->fi_statfsp->f_mntfromname+5);
@@ -189,10 +179,26 @@ get_superblock (fsp, sbp)
} else
lseek(dev_fd, 0, SEEK_SET);
- get(dev_fd, LFS_LABELPAD, buf, LFS_SBPAD);
- memcpy(&(sbp->lfs_dlfs), buf, sizeof(struct dlfs));
+ do {
+ get(dev_fd, sboff, buf, LFS_SBPAD);
+ memcpy(&(sbp->lfs_dlfs), buf, sizeof(struct dlfs));
+ if (sboff == LFS_LABELPAD && fsbtob(sbp, 1) > LFS_LABELPAD)
+ sboff = fsbtob(sbp, (off_t)sbp->lfs_sboffs[0]);
+ else
+ break;
+ } while (1);
+
/* close (fid); */
+ /* Compatibility */
+ if (sbp->lfs_version < 2) {
+ sbp->lfs_sumsize = LFS_V1_SUMMARY_SIZE;
+ sbp->lfs_ibsize = sbp->lfs_bsize;
+ sbp->lfs_start = sbp->lfs_sboffs[0];
+ sbp->lfs_tstamp = sbp->lfs_otstamp;
+ sbp->lfs_fsbtodb = 0;
+ }
+
return (0);
}
@@ -201,10 +207,7 @@ get_superblock (fsp, sbp)
* fatal error on failure.
*/
void
-get_ifile (fsp, use_mmap)
- FS_INFO *fsp;
- int use_mmap;
-
+get_ifile (FS_INFO *fsp, int use_mmap)
{
struct stat file_stat;
struct statfs statfsbuf;
@@ -306,19 +309,21 @@ redo_read:
* Return the size of the partial segment, in bytes.
*/
int
-pseg_size(pseg_addr, fsp, sp)
- daddr_t pseg_addr; /* base address of the segsum */
- FS_INFO *fsp; /* Filesystem info */
- SEGSUM *sp; /* the segsum */
+pseg_size(daddr_t pseg_addr, FS_INFO *fsp, SEGSUM *sp)
{
int i, ssize = 0;
struct lfs *lfsp;
FINFO *fp;
lfsp = &fsp->fi_lfs;
- ssize = LFS_SUMMARY_SIZE
- + howmany(sp->ss_ninos, INOPB(lfsp)) * lfsp->lfs_bsize;
- for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; ++i) {
+ ssize = lfsp->lfs_sumsize
+ + howmany(sp->ss_ninos, INOPB(lfsp)) * lfsp->lfs_ibsize;
+
+ if (lfsp->lfs_version == 1)
+ fp = (FINFO *)(((char *)sp) + sizeof(SEGSUM_V1));
+ else
+ fp = (FINFO *)(sp + 1);
+ for (i = 0; i < sp->ss_nfinfo; ++i) {
ssize += (fp->fi_nblocks-1) * lfsp->lfs_bsize
+ fp->fi_lastlength;
fp = (FINFO *)(&fp->fi_blocks[fp->fi_nblocks]);
@@ -335,12 +340,7 @@ pseg_size(pseg_addr, fsp, sp)
* pair will be listed at most once.
*/
int
-lfs_segmapv(fsp, seg, seg_buf, blocks, bcount)
- FS_INFO *fsp; /* pointer to local file system information */
- int seg; /* the segment number */
- caddr_t seg_buf; /* the buffer containing the segment's data */
- BLOCK_INFO **blocks; /* OUT: array of block_info for live blocks */
- int *bcount; /* OUT: number of active blocks in segment */
+lfs_segmapv(FS_INFO *fsp, int seg, caddr_t seg_buf, BLOCK_INFO **blocks, int *bcount)
{
BLOCK_INFO *bip, *_bip;
SEGSUM *sp;
@@ -360,8 +360,9 @@ lfs_segmapv(fsp, seg, seg_buf, blocks, bcount)
sup = SEGUSE_ENTRY(lfsp, fsp->fi_segusep, seg);
s = seg_buf + (sup->su_flags & SEGUSE_SUPERBLOCK ? LFS_SBPAD : 0);
- seg_addr = sntoda(lfsp, seg);
- pseg_addr = seg_addr + (sup->su_flags & SEGUSE_SUPERBLOCK ? btodb(LFS_SBPAD) : 0);
+ seg_addr = sntod(lfsp, seg);
+ pseg_addr = seg_addr + (sup->su_flags & SEGUSE_SUPERBLOCK ?
+ btofsb(lfsp, LFS_SBPAD) : 0);
if(debug > 1)
syslog(LOG_DEBUG, "\tsegment buffer at: %p\tseg_addr 0x%x", s, seg_addr);
@@ -380,14 +381,19 @@ lfs_segmapv(fsp, seg, seg_buf, blocks, bcount)
#ifdef DIAGNOSTIC
/* Verify size of summary block */
- sumsize = sizeof(SEGSUM) +
+ sumsize = (lfsp->lfs_version == 1 ? sizeof(SEGSUM_V1) :
+ sizeof(SEGSUM)) +
(sp->ss_ninos + INOPB(lfsp) - 1) / INOPB(lfsp);
- for (i = 0, fip = (FINFO *)(sp + 1); i < sp->ss_nfinfo; ++i) {
+ if (lfsp->lfs_version == 1)
+ fip = (FINFO *)(((char *)sp) + sizeof(SEGSUM_V1));
+ else
+ fip = (FINFO *)(sp + 1);
+ for (i = 0; i < sp->ss_nfinfo; ++i) {
sumsize += sizeof(FINFO) +
(fip->fi_nblocks - 1) * sizeof(daddr_t);
fip = (FINFO *)(&fip->fi_blocks[fip->fi_nblocks]);
}
- if (sumsize > LFS_SUMMARY_SIZE) {
+ if (sumsize > lfsp->lfs_sumsize) {
syslog(LOG_ERR,
"Exiting: Segment %d summary block too big: %d\n",
seg, sumsize);
@@ -406,7 +412,7 @@ lfs_segmapv(fsp, seg, seg_buf, blocks, bcount)
ssize = pseg_size(pseg_addr, fsp, sp);
s += ssize;
- pseg_addr += btodb(ssize); /* XXX was bytetoda(fsp,ssize) */
+ pseg_addr += btofsb(lfsp, ssize);
}
if(nsegs < sup->su_nsums) {
syslog(LOG_WARNING,"only %d segment summaries in seg %d (expected %d)",
@@ -439,34 +445,34 @@ lfs_segmapv(fsp, seg, seg_buf, blocks, bcount)
* blocks or inodes from files with new version numbers.
*/
void
-add_blocks (fsp, bip, countp, sp, seg_buf, segaddr, psegaddr)
- FS_INFO *fsp; /* pointer to super block */
- BLOCK_INFO *bip; /* Block info array */
- int *countp; /* IN/OUT: number of blocks in array */
- SEGSUM *sp; /* segment summmary pointer */
- caddr_t seg_buf; /* buffer containing segment */
- daddr_t segaddr; /* address of this segment */
- daddr_t psegaddr; /* address of this partial segment */
+add_blocks (FS_INFO *fsp, BLOCK_INFO *bip, int *countp, SEGSUM *sp,
+ caddr_t seg_buf, daddr_t segaddr, daddr_t psegaddr)
{
IFILE *ifp;
FINFO *fip;
caddr_t bp;
daddr_t *dp, *iaddrp;
- int db_per_block, i, j;
- int db_frag;
+ int fsb_per_block, i, j;
+ int fsb_frag;
u_long page_size;
+ struct lfs *lfsp;
if(debug > 1)
syslog(LOG_DEBUG, "FILE INFOS");
- db_per_block = fsbtodb(&fsp->fi_lfs, 1);
+ lfsp = &fsp->fi_lfs;
+ fsb_per_block = fragstofsb(lfsp, lfsp->lfs_frag);
page_size = fsp->fi_lfs.lfs_bsize;
- bp = seg_buf + datobyte(fsp, psegaddr - segaddr) + LFS_SUMMARY_SIZE;
+ bp = seg_buf + fsbtob(lfsp, psegaddr - segaddr) + lfsp->lfs_sumsize;
bip += *countp;
- psegaddr += bytetoda(fsp, LFS_SUMMARY_SIZE);
- iaddrp = (daddr_t *)((caddr_t)sp + LFS_SUMMARY_SIZE);
+ psegaddr += btofsb(lfsp, lfsp->lfs_sumsize);
+ iaddrp = (daddr_t *)((caddr_t)sp + lfsp->lfs_sumsize);
--iaddrp;
- for (fip = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo;
+ if (lfsp->lfs_version == 1)
+ fip = (FINFO *)(((char *)sp) + sizeof(SEGSUM_V1));
+ else
+ fip = (FINFO *)(sp + 1);
+ for (i = 0; i < sp->ss_nfinfo;
++i, fip = (FINFO *)(&fip->fi_blocks[fip->fi_nblocks])) {
ifp = IFILE_ENTRY(&fsp->fi_lfs, fsp->fi_ifilep, fip->fi_ino);
@@ -477,14 +483,17 @@ add_blocks (fsp, bip, countp, sp, seg_buf, segaddr, psegaddr)
for (j = 0; j < fip->fi_nblocks; j++, dp++) {
/* Skip over intervening inode blocks */
while (psegaddr == *iaddrp) {
- psegaddr += db_per_block;
+ psegaddr += fsb_per_block;
bp += page_size;
--iaddrp;
}
bip->bi_inode = fip->fi_ino;
bip->bi_lbn = *dp;
bip->bi_daddr = psegaddr;
- bip->bi_segcreate = (time_t)(sp->ss_create);
+ if (lfsp->lfs_version == 1)
+ bip->bi_segcreate = (time_t)(sp->ss_ident);
+ else
+ bip->bi_segcreate = (time_t)(sp->ss_create);
bip->bi_bp = bp;
bip->bi_version = ifp->if_version;
@@ -492,21 +501,21 @@ add_blocks (fsp, bip, countp, sp, seg_buf, segaddr, psegaddr)
|| fip->fi_lastlength == page_size)
{
bip->bi_size = page_size;
- psegaddr += db_per_block;
+ psegaddr += fsb_per_block;
bp += page_size;
} else {
- db_frag = fragstodb(&(fsp->fi_lfs),
+ fsb_frag = fragstofsb(&(fsp->fi_lfs),
numfrags(&(fsp->fi_lfs),
fip->fi_lastlength));
if(debug > 1) {
syslog(LOG_DEBUG, "lastlength, frags: %d, %d",
- fip->fi_lastlength, db_frag);
+ fip->fi_lastlength, fsb_frag);
}
bip->bi_size = fip->fi_lastlength;
bp += fip->fi_lastlength;
- psegaddr += db_frag;
+ psegaddr += fsb_frag;
}
++bip;
++(*countp);
@@ -520,13 +529,8 @@ add_blocks (fsp, bip, countp, sp, seg_buf, segaddr, psegaddr)
* actually added.
*/
void
-add_inodes (fsp, bip, countp, sp, seg_buf, seg_addr)
- FS_INFO *fsp; /* pointer to super block */
- BLOCK_INFO *bip; /* block info array */
- int *countp; /* pointer to current number of inodes */
- SEGSUM *sp; /* segsum pointer */
- caddr_t seg_buf; /* the buffer containing the segment's data */
- daddr_t seg_addr; /* disk address of seg_buf */
+add_inodes (FS_INFO *fsp, BLOCK_INFO *bip, int *countp, SEGSUM *sp,
+ caddr_t seg_buf, daddr_t seg_addr)
{
struct dinode *di = NULL; /* XXX gcc */
struct lfs *lfsp;
@@ -545,12 +549,12 @@ add_inodes (fsp, bip, countp, sp, seg_buf, seg_addr)
if(debug > 1)
syslog(LOG_DEBUG, "INODES:");
- daddrp = (daddr_t *)((caddr_t)sp + LFS_SUMMARY_SIZE);
+ daddrp = (daddr_t *)((caddr_t)sp + lfsp->lfs_sumsize);
for (i = 0; i < sp->ss_ninos; ++i) {
if (i % INOPB(lfsp) == 0) {
--daddrp;
- di = (struct dinode *)(seg_buf +
- ((*daddrp - seg_addr) << fsp->fi_daddr_shift));
+ di = (struct dinode *)(seg_buf + fsbtob(lfsp,
+ *daddrp - seg_addr));
} else
++di;
@@ -559,7 +563,10 @@ add_inodes (fsp, bip, countp, sp, seg_buf, seg_addr)
bp->bi_inode = inum;
bp->bi_daddr = *daddrp;
bp->bi_bp = di;
- bp->bi_segcreate = sp->ss_create;
+ if (lfsp->lfs_version == 1)
+ bp->bi_segcreate = sp->ss_ident;
+ else
+ bp->bi_segcreate = sp->ss_create;
bp->bi_size = i; /* XXX KS - kludge */
if (inum == LFS_IFILE_INUM) {
@@ -586,10 +593,7 @@ add_inodes (fsp, bip, countp, sp, seg_buf, seg_addr)
* the partial as well as whether or not the checksum is valid.
*/
int
-pseg_valid (fsp, ssp, addr)
- FS_INFO *fsp; /* pointer to file system info */
- SEGSUM *ssp; /* pointer to segment summary block */
- daddr_t addr; /* address of the summary block on disk */
+pseg_valid (FS_INFO *fsp, SEGSUM *ssp, daddr_t addr)
{
int nblocks;
#if 0
@@ -610,7 +614,7 @@ pseg_valid (fsp, ssp, addr)
#if 0
/* check data/inode block(s) checksum too */
datap = (u_long *)malloc(nblocks * sizeof(u_long));
- p = (caddr_t)ssp + LFS_SUMMARY_SIZE;
+ p = (caddr_t)ssp + lfsp->lfs_sumsize;
for (i = 0; i < nblocks; ++i) {
datap[i] = *((u_long *)p);
p += fsp->fi_lfs.lfs_bsize;
@@ -630,11 +634,7 @@ pseg_valid (fsp, ssp, addr)
* read a segment into a memory buffer
*/
int
-mmap_segment (fsp, segment, segbuf, use_mmap)
- FS_INFO *fsp; /* file system information */
- int segment; /* segment number */
- caddr_t *segbuf; /* pointer to buffer area */
- int use_mmap; /* mmap instead of read */
+mmap_segment (FS_INFO *fsp, int segment, caddr_t *segbuf, int use_mmap)
{
struct lfs *lfsp;
daddr_t seg_daddr; /* base disk address of segment */
@@ -645,8 +645,8 @@ mmap_segment (fsp, segment, segbuf, use_mmap)
lfsp = &fsp->fi_lfs;
/* get the disk address of the beginning of the segment */
- seg_daddr = sntoda(lfsp, segment);
- seg_byte = datobyte(fsp, seg_daddr);
+ seg_daddr = sntod(lfsp, segment);
+ seg_byte = fsbtob(lfsp, (off_t)seg_daddr);
ssize = seg_size(lfsp);
strcpy(mntfromname, "/dev/r");
@@ -697,10 +697,7 @@ mmap_segment (fsp, segment, segbuf, use_mmap)
}
void
-munmap_segment (fsp, seg_buf, use_mmap)
- FS_INFO *fsp; /* file system information */
- caddr_t seg_buf; /* pointer to buffer area */
- int use_mmap; /* mmap instead of read/write */
+munmap_segment (FS_INFO *fsp, caddr_t seg_buf, int use_mmap)
{
if (use_mmap)
munmap (seg_buf, seg_size(&fsp->fi_lfs));
@@ -712,10 +709,7 @@ munmap_segment (fsp, seg_buf, use_mmap)
* USEFUL DEBUGGING TOOLS:
*/
void
-print_SEGSUM (lfsp, p, addr)
- struct lfs *lfsp;
- SEGSUM *p;
- daddr_t addr;
+print_SEGSUM (struct lfs *lfsp, SEGSUM *p, daddr_t addr)
{
if (p)
(void) dump_summary(lfsp, p, DUMP_ALL, NULL, addr);
@@ -724,9 +718,7 @@ print_SEGSUM (lfsp, p, addr)
}
int
-bi_compare(a, b)
- const void *a;
- const void *b;
+bi_compare(const void *a, const void *b)
{
const BLOCK_INFO *ba, *bb;
int diff;
@@ -757,10 +749,7 @@ bi_compare(a, b)
}
int
-bi_toss(dummy, a, b)
- const void *dummy;
- const void *a;
- const void *b;
+bi_toss(const void *dummy, const void *a, const void *b)
{
const BLOCK_INFO *ba, *bb;
@@ -771,12 +760,7 @@ bi_toss(dummy, a, b)
}
void
-toss(p, nump, size, dotoss, client)
- void *p;
- int *nump;
- size_t size;
- int (*dotoss) __P((const void *, const void *, const void *));
- void *client;
+toss(void *p, int *nump, size_t size, int (*dotoss)(const void *, const void *, const void *), void *client)
{
int i;
char *p0, *p1;