summaryrefslogtreecommitdiff
path: root/libexec/lfs_cleanerd/cleanerd.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/lfs_cleanerd/cleanerd.c')
-rw-r--r--libexec/lfs_cleanerd/cleanerd.c131
1 files changed, 52 insertions, 79 deletions
diff --git a/libexec/lfs_cleanerd/cleanerd.c b/libexec/lfs_cleanerd/cleanerd.c
index 988589e4a78..c55506cb88c 100644
--- a/libexec/lfs_cleanerd/cleanerd.c
+++ b/libexec/lfs_cleanerd/cleanerd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cleanerd.c,v 1.30 2001/02/04 22:12:47 christos Exp $ */
+/* $NetBSD: cleanerd.c,v 1.31 2001/07/13 20:30:21 perseant Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
#if 0
static char sccsid[] = "@(#)cleanerd.c 8.5 (Berkeley) 6/10/95";
#else
-__RCSID("$NetBSD: cleanerd.c,v 1.30 2001/02/04 22:12:47 christos Exp $");
+__RCSID("$NetBSD: cleanerd.c,v 1.31 2001/07/13 20:30:21 perseant Exp $");
#endif
#endif /* not lint */
@@ -109,24 +109,24 @@ typedef struct {
#define CLEAN_BYTES 0x1
/* function prototypes for system calls; not sure where they should go */
-int lfs_segwait __P((fsid_t *, struct timeval *));
-int lfs_segclean __P((fsid_t *, u_long));
-int lfs_bmapv __P((fsid_t *, BLOCK_INFO *, int));
-int lfs_markv __P((fsid_t *, BLOCK_INFO *, int));
+int lfs_segwait(fsid_t *, struct timeval *);
+int lfs_segclean(fsid_t *, u_long);
+int lfs_bmapv(fsid_t *, BLOCK_INFO *, int);
+int lfs_markv(fsid_t *, BLOCK_INFO *, int);
/* function prototypes */
-int bi_tossold __P((const void *, const void *, const void *));
-int choose_segments __P((FS_INFO *, struct seglist *,
- unsigned long (*)(FS_INFO *, SEGUSE *)));
-void clean_fs __P((FS_INFO *, unsigned long (*)(FS_INFO *, SEGUSE *), int, long));
-int clean_loop __P((FS_INFO *, int, long));
-int add_segment __P((FS_INFO *, struct seglist *, SEGS_AND_BLOCKS *));
-int clean_segments __P((FS_INFO *, SEGS_AND_BLOCKS *));
-unsigned long cost_benefit __P((FS_INFO *, SEGUSE *));
-int cost_compare __P((const void *, const void *));
-void sig_report __P((int));
-void just_exit __P((int));
-int main __P((int, char *[]));
+int bi_tossold(const void *, const void *, const void *);
+int choose_segments(FS_INFO *, struct seglist *,
+ unsigned long (*)(FS_INFO *, SEGUSE *));
+void clean_fs(FS_INFO *, unsigned long (*)(FS_INFO *, SEGUSE *), int, long);
+int clean_loop(FS_INFO *, int, long);
+int add_segment(FS_INFO *, struct seglist *, SEGS_AND_BLOCKS *);
+int clean_segments(FS_INFO *, SEGS_AND_BLOCKS *);
+unsigned long cost_benefit(FS_INFO *, SEGUSE *);
+int cost_compare(const void *, const void *);
+void sig_report(int);
+void just_exit(int);
+int main(int, char *[]);
/*
* Cleaning Cost Functions:
@@ -141,9 +141,7 @@ int main __P((int, char *[]));
*/
unsigned long
-cost_benefit(fsp, su)
- FS_INFO *fsp; /* file system information */
- SEGUSE *su;
+cost_benefit(FS_INFO *fsp, SEGUSE *su)
{
struct lfs *lfsp;
struct timeval t;
@@ -180,9 +178,7 @@ cost_benefit(fsp, su)
}
int
-main(argc, argv)
- int argc;
- char *argv[];
+main(int argc, char **argv)
{
FS_INFO *fsp;
struct statfs *lstatfsp; /* file system stats */
@@ -340,24 +336,21 @@ main(argc, argv)
/* return the number of segments cleaned */
int
-clean_loop(fsp, nsegs, options)
- FS_INFO *fsp; /* file system information */
- int nsegs;
- long options;
+clean_loop(FS_INFO *fsp, int nsegs, long options)
{
struct lfs *lfsp;
double loadavg[MAXLOADS];
time_t now;
u_long max_free_segs;
- u_long db_per_seg;
+ u_long fsb_per_seg;
lfsp = &fsp->fi_lfs;
/*
* Compute the maximum possible number of free segments, given the
* number of free blocks.
*/
- db_per_seg = fsbtodb(lfsp, lfsp->lfs_ssize);
- max_free_segs = fsp->fi_cip->bfree / db_per_seg + lfsp->lfs_minfreeseg;
+ fsb_per_seg = segtod(lfsp, 1);
+ max_free_segs = fsp->fi_cip->bfree / fsb_per_seg + lfsp->lfs_minfreeseg;
/*
* We will clean if there are not enough free blocks or total clean
@@ -366,16 +359,16 @@ clean_loop(fsp, nsegs, options)
now = time((time_t *)NULL);
if(debug > 1) {
- syslog(LOG_DEBUG, "db_per_seg = %lu bfree = %u avail = %d,"
- " bfree = %u, ", db_per_seg, fsp->fi_cip->bfree,
+ syslog(LOG_DEBUG, "fsb_per_seg = %lu bfree = %u avail = %d,"
+ " bfree = %u, ", fsb_per_seg, fsp->fi_cip->bfree,
fsp->fi_cip->avail, fsp->fi_cip->bfree);
syslog(LOG_DEBUG, "clean segs = %d, max_free_segs = %ld",
fsp->fi_cip->clean, max_free_segs);
}
- if ((fsp->fi_cip->bfree - fsp->fi_cip->avail > db_per_seg &&
- fsp->fi_cip->avail < (long)db_per_seg &&
- fsp->fi_cip->bfree > (long)db_per_seg) ||
+ if ((fsp->fi_cip->bfree - fsp->fi_cip->avail > fsb_per_seg &&
+ fsp->fi_cip->avail < (long)fsb_per_seg &&
+ fsp->fi_cip->bfree > (long)fsb_per_seg) ||
(fsp->fi_cip->clean < max_free_segs &&
(fsp->fi_cip->clean <= lfsp->lfs_minfreeseg ||
fsp->fi_cip->clean < max_free_segs * BUSY_LIM)))
@@ -444,9 +437,9 @@ clean_loop(fsp, nsegs, options)
}
}
if (debug > 1) {
- if (fsp->fi_cip->bfree - fsp->fi_cip->avail <= db_per_seg)
+ if (fsp->fi_cip->bfree - fsp->fi_cip->avail <= fsb_per_seg)
syslog(LOG_DEBUG, "condition 1 false");
- if (fsp->fi_cip->avail >= (long)db_per_seg)
+ if (fsp->fi_cip->avail >= (long)fsb_per_seg)
syslog(LOG_DEBUG, "condition 2 false");
if (fsp->fi_cip->clean >= max_free_segs)
syslog(LOG_DEBUG, "condition 3 false");
@@ -462,14 +455,11 @@ clean_loop(fsp, nsegs, options)
void
-clean_fs(fsp, cost_func, nsegs, options)
- FS_INFO *fsp; /* file system information */
- unsigned long (*cost_func) __P((FS_INFO *, SEGUSE *));
- int nsegs;
- long options;
+clean_fs(FS_INFO *fsp, unsigned long (*cost_func)(FS_INFO *, SEGUSE *),
+ int nsegs, long options)
{
struct seglist *segs, *sp;
- long int to_clean, cleaned_bytes, seg_size;
+ long int to_clean, cleaned_bytes;
unsigned long i, j, total;
struct rusage ru;
fsid_t *fsidp;
@@ -477,7 +467,6 @@ clean_fs(fsp, cost_func, nsegs, options)
SEGS_AND_BLOCKS *sbp;
fsidp = &fsp->fi_statfsp->f_fsid;
- seg_size = (1 << fsp->fi_lfs.lfs_segshift);
if ((segs =
malloc(fsp->fi_lfs.lfs_nseg * sizeof(struct seglist))) == NULL) {
@@ -589,9 +578,7 @@ clean_fs(fsp, cost_func, nsegs, options)
* cost/benefit than any utilized segment.
*/
int
-cost_compare(a, b)
- const void *a;
- const void *b;
+cost_compare(const void *a, const void *b)
{
return ((struct seglist *)b)->sl_cost < ((struct seglist *)a)->sl_cost ? -1 : 1;
}
@@ -602,10 +589,7 @@ cost_compare(a, b)
* filled in.
*/
int
-choose_segments(fsp, seglist, cost_func)
- FS_INFO *fsp;
- struct seglist *seglist;
- unsigned long (*cost_func) __P((FS_INFO *, SEGUSE *));
+choose_segments(FS_INFO *fsp, struct seglist *seglist, unsigned long (*cost_func)(FS_INFO *, SEGUSE *))
{
struct lfs *lfsp;
struct seglist *sp;
@@ -663,10 +647,7 @@ choose_segments(fsp, seglist, cost_func)
* in preparation for sending through lfs_markv.
*/
int
-add_segment(fsp, slp, sbp)
- FS_INFO *fsp;
- struct seglist *slp;
- SEGS_AND_BLOCKS *sbp;
+add_segment(FS_INFO *fsp, struct seglist *slp, SEGS_AND_BLOCKS *sbp)
{
int id = slp->sl_id;
BLOCK_INFO *tba, *_bip;
@@ -684,7 +665,7 @@ add_segment(fsp, slp, sbp)
lfsp = &fsp->fi_lfs;
sp = SEGUSE_ENTRY(lfsp, fsp->fi_segusep, id);
- seg_addr = sntoda(lfsp,id);
+ seg_addr = sntod(lfsp,id);
error = 0;
tba = NULL;
@@ -718,7 +699,7 @@ add_segment(fsp, slp, sbp)
"add_segment: lfs_segmapv failed for segment %d", id);
goto out;
}
- cleaner_stats.blocks_read += fsp->fi_lfs.lfs_ssize;
+ cleaner_stats.blocks_read += segtod(lfsp, 1);
if (debug > 1)
syslog(LOG_DEBUG, "lfs_segmapv returned %d blocks", num_blocks);
@@ -747,8 +728,8 @@ add_segment(fsp, slp, sbp)
/* XXX KS - check for misplaced blocks */
for(i=0; i<num_blocks; i++) {
if(tba[i].bi_daddr
- && ((char *)(tba[i].bi_bp) - seg_buf) != (tba[i].bi_daddr - seg_addr) * DEV_BSIZE
- && datosn(&(fsp->fi_lfs), tba[i].bi_daddr) == id)
+ && ((char *)(tba[i].bi_bp) - seg_buf) != fsbtob(lfsp, tba[i].bi_daddr - seg_addr)
+ && dtosn(&(fsp->fi_lfs), tba[i].bi_daddr) == id)
{
if(debug > 1) {
syslog(LOG_DEBUG, "seg %d, ino %d lbn %d, 0x%x != 0x%lx (fixed)",
@@ -756,7 +737,7 @@ add_segment(fsp, slp, sbp)
tba[i].bi_inode,
tba[i].bi_lbn,
tba[i].bi_daddr,
- (long)seg_addr + ((char *)(tba[i].bi_bp) - seg_buf)/DEV_BSIZE);
+ (long)seg_addr + btofsb(lfsp, (char *)(tba[i].bi_bp) - seg_buf));
}
/*
* XXX KS - have to be careful here about Inodes;
@@ -765,7 +746,7 @@ add_segment(fsp, slp, sbp)
* the *right* inode, not the first one in the block.
*/
if(tba[i].bi_lbn == LFS_UNUSED_LBN) {
- dip = (struct dinode *)(seg_buf + (tba[i].bi_daddr - seg_addr) * DEV_BSIZE);
+ dip = (struct dinode *)(seg_buf + fsbtob(lfsp, tba[i].bi_daddr - seg_addr));
for(j=INOPB(lfsp)-1;j>=0;j--) {
if(dip[j].di_u.inumber == tba[i].bi_inode) {
tba[i].bi_bp = (char *)(dip+j);
@@ -785,13 +766,12 @@ add_segment(fsp, slp, sbp)
}
err(1,"lost inode");
} else if (debug > 1) {
- syslog(LOG_DEBUG,"Ino %d corrected to 0x%x+%d",
+ syslog(LOG_DEBUG,"Ino %d corrected to 0x%x",
tba[i].bi_inode,
- tba[i].bi_daddr,
- (int)((caddr_t)(tba[i].bi_bp) - (caddr_t)(long)seg_addr) % DEV_BSIZE);
+ tba[i].bi_daddr);
}
} else {
- tba[i].bi_bp = seg_buf + (tba[i].bi_daddr - seg_addr) * DEV_BSIZE;
+ tba[i].bi_bp = seg_buf + fsbtob(lfsp, tba[i].bi_daddr - seg_addr);
}
}
}
@@ -865,9 +845,7 @@ add_segment(fsp, slp, sbp)
/* Call markv and clean up */
int
-clean_segments(fsp, sbp)
- FS_INFO *fsp;
- SEGS_AND_BLOCKS *sbp;
+clean_segments(FS_INFO *fsp, SEGS_AND_BLOCKS *sbp)
{
int maxblocks, clean_blocks;
BLOCK_INFO *bp;
@@ -878,7 +856,7 @@ clean_segments(fsp, sbp)
cleaner_stats.segs_cleaned += sbp->nsegs;
cleaner_stats.blocks_written += sbp->nb;
- util = ((double)sbp->nb / fsp->fi_lfs.lfs_ssize);
+ util = ((double)sbp->nb / segtod(&fsp->fi_lfs, 1));
cleaner_stats.util_tot += util;
cleaner_stats.util_sos += util * util;
if (do_small)
@@ -911,22 +889,18 @@ clean_segments(fsp, sbp)
int
-bi_tossold(client, a, b)
- const void *client;
- const void *a;
- const void *b;
+bi_tossold(const void *client, const void *a, const void *b)
{
const struct tossstruct *t;
t = (struct tossstruct *)client;
return (((BLOCK_INFO *)a)->bi_daddr == LFS_UNUSED_DADDR ||
- datosn(t->lfs, ((BLOCK_INFO *)a)->bi_daddr) != t->seg);
+ dtosn(t->lfs, ((BLOCK_INFO *)a)->bi_daddr) != t->seg);
}
void
-sig_report(sig)
- int sig;
+sig_report(int sig)
{
double avg = 0.0;
@@ -958,8 +932,7 @@ sig_report(sig)
}
void
-just_exit(sig)
- int sig;
+just_exit(int sig)
{
exit(0);
}