Module Name: src Committed By: dholland Date: Wed Aug 12 18:25:04 UTC 2015
Modified Files: src/libexec/lfs_cleanerd: cleaner.h coalesce.c lfs_cleanerd.c src/sbin/fsck_lfs: pass0.c segwrite.c src/sbin/newfs_lfs: make_lfs.c src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_segment.c lfs_subr.c lfs_syscalls.c lfs_vfsops.c lfs_vnops.c src/usr.sbin/dumplfs: dumplfs.c Log Message: Make 32-bit and 64-bit versions of CLEANERINFO. XXX: while this is written to disk, it seems like much of it would XXX: be better set up as a commpage shared with the cleaner. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/libexec/lfs_cleanerd/cleaner.h cvs rdiff -u -r1.29 -r1.30 src/libexec/lfs_cleanerd/coalesce.c cvs rdiff -u -r1.45 -r1.46 src/libexec/lfs_cleanerd/lfs_cleanerd.c cvs rdiff -u -r1.37 -r1.38 src/sbin/fsck_lfs/pass0.c cvs rdiff -u -r1.36 -r1.37 src/sbin/fsck_lfs/segwrite.c cvs rdiff -u -r1.40 -r1.41 src/sbin/newfs_lfs/make_lfs.c cvs rdiff -u -r1.174 -r1.175 src/sys/ufs/lfs/lfs.h cvs rdiff -u -r1.8 -r1.9 src/sys/ufs/lfs/lfs_accessors.h cvs rdiff -u -r1.251 -r1.252 src/sys/ufs/lfs/lfs_segment.c cvs rdiff -u -r1.84 -r1.85 src/sys/ufs/lfs/lfs_subr.c cvs rdiff -u -r1.166 -r1.167 src/sys/ufs/lfs/lfs_syscalls.c cvs rdiff -u -r1.335 -r1.336 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.283 -r1.284 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.49 -r1.50 src/usr.sbin/dumplfs/dumplfs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/lfs_cleanerd/cleaner.h diff -u src/libexec/lfs_cleanerd/cleaner.h:1.12 src/libexec/lfs_cleanerd/cleaner.h:1.13 --- src/libexec/lfs_cleanerd/cleaner.h:1.12 Wed Aug 12 18:23:16 2015 +++ src/libexec/lfs_cleanerd/cleaner.h Wed Aug 12 18:25:03 2015 @@ -59,14 +59,12 @@ __BEGIN_DECLS /* lfs_cleanerd.c */ void pwarn(const char *, ...); void calc_cb(struct clfs *, int, struct clfs_seguse *); -int clean_fs(struct clfs *, CLEANERINFO *); void dlog(const char *, ...); void handle_error(struct clfs **, int); int init_fs(struct clfs *, char *); int invalidate_segment(struct clfs *, int); void lfs_ientry(IFILE **, struct clfs *, ino_t, struct ubuf **); int load_segment(struct clfs *, int, BLOCK_INFO **, int *); -int needs_cleaning(struct clfs *, CLEANERINFO *); int reinit_fs(struct clfs *); void reload_ifile(struct clfs *); void toss_old_blocks(struct clfs *, BLOCK_INFO **, blkcnt_t *, int *); Index: src/libexec/lfs_cleanerd/coalesce.c diff -u src/libexec/lfs_cleanerd/coalesce.c:1.29 src/libexec/lfs_cleanerd/coalesce.c:1.30 --- src/libexec/lfs_cleanerd/coalesce.c:1.29 Wed Aug 12 18:23:16 2015 +++ src/libexec/lfs_cleanerd/coalesce.c Wed Aug 12 18:25:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: coalesce.c,v 1.29 2015/08/12 18:23:16 dholland Exp $ */ +/* $NetBSD: coalesce.c,v 1.30 2015/08/12 18:25:03 dholland Exp $ */ /*- * Copyright (c) 2002, 2005 The NetBSD Foundation, Inc. @@ -344,10 +344,10 @@ clean_inode(struct clfs *fs, ino_t ino) cip = *(CLEANERINFO *)bp->b_data; brelse(bp, B_INVAL); - if (cip.clean < 4) /* XXX magic number 4 */ + if (lfs_ci_getclean(fs, &cip) < 4) /* XXX magic number 4 */ kops.ko_fcntl(fs->clfs_ifilefd, LFCNSEGWAIT, NULL); - } while(cip.clean < 4); + } while (lfs_ci_getclean(fs, &cip) < 4); /* * Note that although lim.blkcnt is 32 bits wide, bps Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.45 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.46 --- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.45 Wed Aug 12 18:23:16 2015 +++ src/libexec/lfs_cleanerd/lfs_cleanerd.c Wed Aug 12 18:25:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_cleanerd.c,v 1.45 2015/08/12 18:23:16 dholland Exp $ */ +/* $NetBSD: lfs_cleanerd.c,v 1.46 2015/08/12 18:25:03 dholland Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -1024,8 +1024,8 @@ check_hidden_cost(struct clfs *fs, BLOCK * list, and send this list through lfs_markv() to move them to new * locations on disk. */ -int -clean_fs(struct clfs *fs, CLEANERINFO *cip) +static int +clean_fs(struct clfs *fs, const CLEANERINFO64 *cip) { int i, j, ngood, sn, bic, r, npos; blkcnt_t widebic; @@ -1236,9 +1236,10 @@ clean_fs(struct clfs *fs, CLEANERINFO *c * the given filesystem needs to be cleaned. Returns 1 if it does, 0 if it * does not, or -1 on error. */ -int -needs_cleaning(struct clfs *fs, CLEANERINFO *cip) +static int +needs_cleaning(struct clfs *fs, CLEANERINFO64 *cip) { + CLEANERINFO *cipu; struct ubuf *bp; struct stat st; daddr_t fsb_per_seg, max_free_segs; @@ -1258,7 +1259,20 @@ needs_cleaning(struct clfs *fs, CLEANERI syslog(LOG_ERR, "%s: can't read inode", lfs_sb_getfsmnt(fs)); return -1; } - *cip = *(CLEANERINFO *)bp->b_data; /* Structure copy */ + cipu = (CLEANERINFO *)bp->b_data; + if (fs->lfs_is64) { + /* Structure copy */ + *cip = cipu->u_64; + } else { + /* Copy the fields and promote to 64 bit */ + cip->clean = cipu->u_32.clean; + cip->dirty = cipu->u_32.dirty; + cip->bfree = cipu->u_32.bfree; + cip->avail = cipu->u_32.avail; + cip->free_head = cipu->u_32.free_head; + cip->free_tail = cipu->u_32.free_tail; + cip->flags = cipu->u_32.flags; + } brelse(bp, B_INVAL); cleaner_stats.bytes_read += lfs_sb_getbsize(fs); @@ -1397,11 +1411,27 @@ lfs_cleaner_main(int argc, char **argv) #ifdef LFS_CLEANER_AS_LIB sem_t *semaddr = NULL; #endif - CLEANERINFO ci; + CLEANERINFO64 ci; #ifndef USE_CLIENT_SERVER char *cp, *pidname; #endif +#ifdef RESCUEDIR + /* + * XXX: Work around apparent bug with gcc 4.8 and -Os: it + * claims that ci.clean is uninitialized in clean_fs (at one + * of the several uses of it, which is neither the first nor + * last use) -- this is conditionalized on RESCUEDIR because + * it comes up for building the cleaner for /rescue. It + * doesn't happen with plain -O2, and the value is clearly + * always initialized. + * + * Hopefully in the future further rearrangements will allow + * removing this hack. + */ + ci.clean = 0; +#endif + /* * Set up defaults */ Index: src/sbin/fsck_lfs/pass0.c diff -u src/sbin/fsck_lfs/pass0.c:1.37 src/sbin/fsck_lfs/pass0.c:1.38 --- src/sbin/fsck_lfs/pass0.c:1.37 Tue Jul 28 05:09:34 2015 +++ src/sbin/fsck_lfs/pass0.c Wed Aug 12 18:25:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass0.c,v 1.37 2015/07/28 05:09:34 dholland Exp $ */ +/* $NetBSD: pass0.c,v 1.38 2015/08/12 18:25:03 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -116,7 +116,7 @@ pass0(void) plastino = 0; lowfreeino = maxino; LFS_CLEANERINFO(cip, fs, cbp); - freehd = ino = cip->free_head; + freehd = ino = lfs_ci_getfree_head(fs, cip); brelse(cbp, 0); while (ino) { @@ -194,9 +194,9 @@ pass0(void) } LFS_CLEANERINFO(cip, fs, cbp); - if (cip->free_head != freehd) { + if (lfs_ci_getfree_head(fs, cip) != freehd) { /* They've already given us permission for this change */ - cip->free_head = freehd; + lfs_ci_setfree_head(fs, cip, freehd); writeit = 1; } if (freehd != lfs_sb_getfreehd(fs)) { @@ -207,12 +207,12 @@ pass0(void) sbdirty(); } } - if (cip->free_tail != plastino) { + if (lfs_ci_getfree_tail(fs, cip) != plastino) { pwarn("FREE LIST TAIL SHOULD BE %llu (WAS %llu)\n", (unsigned long long)plastino, - (unsigned long long)cip->free_tail); + (unsigned long long)lfs_ci_getfree_tail(fs, cip)); if (preen || reply("FIX")) { - cip->free_tail = plastino; + lfs_ci_setfree_tail(fs, cip, plastino); writeit = 1; } } Index: src/sbin/fsck_lfs/segwrite.c diff -u src/sbin/fsck_lfs/segwrite.c:1.36 src/sbin/fsck_lfs/segwrite.c:1.37 --- src/sbin/fsck_lfs/segwrite.c:1.36 Sun Aug 2 18:18:09 2015 +++ src/sbin/fsck_lfs/segwrite.c Wed Aug 12 18:25:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: segwrite.c,v 1.36 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: segwrite.c,v 1.37 2015/08/12 18:25:03 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -701,9 +701,8 @@ lfs_newseg(struct lfs * fs) LFS_WRITESEGENTRY(sup, fs, lfs_dtosn(fs, lfs_sb_getnextseg(fs)), bp); LFS_CLEANERINFO(cip, fs, bp); - --cip->clean; - ++cip->dirty; - lfs_sb_setnclean(fs, cip->clean); + lfs_ci_shiftcleantodirty(fs, cip, 1); + lfs_sb_setnclean(fs, lfs_ci_getclean(fs, cip)); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); lfs_sb_setlastseg(fs, lfs_sb_getcurseg(fs)); Index: src/sbin/newfs_lfs/make_lfs.c diff -u src/sbin/newfs_lfs/make_lfs.c:1.40 src/sbin/newfs_lfs/make_lfs.c:1.41 --- src/sbin/newfs_lfs/make_lfs.c:1.40 Sun Aug 2 18:18:09 2015 +++ src/sbin/newfs_lfs/make_lfs.c Wed Aug 12 18:25:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: make_lfs.c,v 1.40 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: make_lfs.c,v 1.41 2015/08/12 18:25:03 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #if 0 static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95"; #else -__RCSID("$NetBSD: make_lfs.c,v 1.40 2015/08/02 18:18:09 dholland Exp $"); +__RCSID("$NetBSD: make_lfs.c,v 1.41 2015/08/12 18:25:03 dholland Exp $"); #endif #endif /* not lint */ @@ -722,11 +722,11 @@ make_lfs(int devfd, uint secsize, struct * Initialize the cleanerinfo block */ LFS_CLEANERINFO(cip, fs, bp); - cip->clean = lfs_sb_getnseg(fs); - cip->dirty = 0; + lfs_ci_setclean(fs, cip, lfs_sb_getnseg(fs)); + lfs_ci_setdirty(fs, cip, 0); if (version > 1) { - cip->free_head = HIGHEST_USED_INO + 1; - cip->free_tail = lfs_sb_getifpb(fs) - 1; + lfs_ci_setfree_head(fs, cip, HIGHEST_USED_INO + 1); + lfs_ci_setfree_tail(fs, cip, lfs_sb_getifpb(fs) - 1); } LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); @@ -888,8 +888,8 @@ make_lfs(int devfd, uint secsize, struct /* Put that in the Ifile version too, and write it */ LFS_CLEANERINFO(cip, fs, bp); - cip->bfree = lfs_sb_getbfree(fs); - cip->avail = lfs_sb_getavail(fs); + lfs_ci_setbfree(fs, cip, lfs_sb_getbfree(fs)); + lfs_ci_setavail(fs, cip, lfs_sb_getavail(fs)); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); if (!Nflag) lfs_segwrite(fs, SEGM_CKP); Index: src/sys/ufs/lfs/lfs.h diff -u src/sys/ufs/lfs/lfs.h:1.174 src/sys/ufs/lfs/lfs.h:1.175 --- src/sys/ufs/lfs/lfs.h:1.174 Wed Aug 12 18:24:14 2015 +++ src/sys/ufs/lfs/lfs.h Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.h,v 1.174 2015/08/12 18:24:14 dholland Exp $ */ +/* $NetBSD: lfs.h,v 1.175 2015/08/12 18:25:04 dholland Exp $ */ /* from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp */ /* from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp */ @@ -511,16 +511,35 @@ struct ifile_v1 { * Cleaner information structure. This resides in the ifile and is used * to pass information from the kernel to the cleaner. */ -typedef struct _cleanerinfo { - u_int32_t clean; /* number of clean segments */ - u_int32_t dirty; /* number of dirty segments */ - /* XXX64 bfree and avail must -> 64 */ - int32_t bfree; /* disk blocks free */ - int32_t avail; /* disk blocks available */ - u_int32_t free_head; /* head of the inode free list */ - u_int32_t free_tail; /* tail of the inode free list */ + +/* flags for ->flags */ #define LFS_CLEANER_MUST_CLEAN 0x01 - u_int32_t flags; /* status word from the kernel */ + +typedef struct _cleanerinfo32 { + u_int32_t clean; /* 0: number of clean segments */ + u_int32_t dirty; /* 4: number of dirty segments */ + int32_t bfree; /* 8: disk blocks free */ + int32_t avail; /* 12: disk blocks available */ + u_int32_t free_head; /* 16: head of the inode free list */ + u_int32_t free_tail; /* 20: tail of the inode free list */ + u_int32_t flags; /* 24: status word from the kernel */ +} CLEANERINFO32; + +typedef struct _cleanerinfo64 { + u_int32_t clean; /* 0: number of clean segments */ + u_int32_t dirty; /* 4: number of dirty segments */ + int64_t bfree; /* 8: disk blocks free */ + int64_t avail; /* 16: disk blocks available */ + u_int64_t free_head; /* 24: head of the inode free list */ + u_int64_t free_tail; /* 32: tail of the inode free list */ + u_int32_t flags; /* 40: status word from the kernel */ + u_int32_t pad; /* 44: must be 64-bit aligned */ +} CLEANERINFO64; + +/* this must not go to disk directly of course */ +typedef union _cleanerinfo { + CLEANERINFO32 u_32; + CLEANERINFO64 u_64; } CLEANERINFO; /* Index: src/sys/ufs/lfs/lfs_accessors.h diff -u src/sys/ufs/lfs/lfs_accessors.h:1.8 src/sys/ufs/lfs/lfs_accessors.h:1.9 --- src/sys/ufs/lfs/lfs_accessors.h:1.8 Sun Aug 2 18:18:46 2015 +++ src/sys/ufs/lfs/lfs_accessors.h Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_accessors.h,v 1.8 2015/08/02 18:18:46 dholland Exp $ */ +/* $NetBSD: lfs_accessors.h,v 1.9 2015/08/12 18:25:04 dholland Exp $ */ /* from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp */ /* from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp */ @@ -146,6 +146,17 @@ #define _UFS_LFS_LFS_ACCESSORS_H_ /* + * STRUCT_LFS is used by the libsa code to get accessors that work + * with struct salfs instead of struct lfs, and by the cleaner to + * get accessors that work with struct clfs. + */ + +#ifndef STRUCT_LFS +#define STRUCT_LFS struct lfs +#endif + + +/* * Maximum length of a symlink that can be stored within the inode. */ #define ULFS1_MAXSYMLINKLEN ((ULFS_NDADDR + ULFS_NIADDR) * sizeof(int32_t)) @@ -292,7 +303,54 @@ */ #define CLEANSIZE_SU(fs) \ - ((sizeof(CLEANERINFO) + lfs_sb_getbsize(fs) - 1) >> lfs_sb_getbshift(fs)) + ((((fs)->lfs_is64 ? sizeof(CLEANERINFO64) : sizeof(CLEANERINFO32)) + \ + lfs_sb_getbsize(fs) - 1) >> lfs_sb_getbshift(fs)) + +#define LFS_DEF_CI_ACCESSOR(type, type32, field) \ + static __unused inline type \ + lfs_ci_get##field(STRUCT_LFS *fs, CLEANERINFO *cip) \ + { \ + if (fs->lfs_is64) { \ + return cip->u_64.field; \ + } else { \ + return cip->u_32.field; \ + } \ + } \ + static __unused inline void \ + lfs_ci_set##field(STRUCT_LFS *fs, CLEANERINFO *cip, type val) \ + { \ + if (fs->lfs_is64) { \ + type *p = &cip->u_64.field; \ + (void)p; \ + cip->u_64.field = val; \ + } else { \ + type32 *p = &cip->u_32.field; \ + (void)p; \ + cip->u_32.field = val; \ + } \ + } \ + +LFS_DEF_CI_ACCESSOR(u_int32_t, u_int32_t, clean); +LFS_DEF_CI_ACCESSOR(u_int32_t, u_int32_t, dirty); +LFS_DEF_CI_ACCESSOR(int64_t, int32_t, bfree); +LFS_DEF_CI_ACCESSOR(int64_t, int32_t, avail); +LFS_DEF_CI_ACCESSOR(u_int64_t, u_int32_t, free_head); +LFS_DEF_CI_ACCESSOR(u_int64_t, u_int32_t, free_tail); +LFS_DEF_CI_ACCESSOR(u_int32_t, u_int32_t, flags); + +static __unused inline void +lfs_ci_shiftcleantodirty(STRUCT_LFS *fs, CLEANERINFO *cip, unsigned num) +{ + lfs_ci_setclean(fs, cip, lfs_ci_getclean(fs, cip) - num); + lfs_ci_setdirty(fs, cip, lfs_ci_getdirty(fs, cip) + num); +} + +static __unused inline void +lfs_ci_shiftdirtytoclean(STRUCT_LFS *fs, CLEANERINFO *cip, unsigned num) +{ + lfs_ci_setdirty(fs, cip, lfs_ci_getdirty(fs, cip) - num); + lfs_ci_setclean(fs, cip, lfs_ci_getclean(fs, cip) + num); +} /* Read in the block with the cleaner info from the ifile. */ #define LFS_CLEANERINFO(CP, F, BP) do { \ @@ -310,12 +368,12 @@ */ #define LFS_SYNC_CLEANERINFO(cip, fs, bp, w) do { \ mutex_enter(&lfs_lock); \ - if ((w) || (cip)->bfree != lfs_sb_getbfree(fs) || \ - (cip)->avail != lfs_sb_getavail(fs) - fs->lfs_ravail - \ + if ((w) || lfs_ci_getbfree(fs, cip) != lfs_sb_getbfree(fs) || \ + lfs_ci_getavail(fs, cip) != lfs_sb_getavail(fs) - fs->lfs_ravail - \ fs->lfs_favail) { \ - (cip)->bfree = lfs_sb_getbfree(fs); \ - (cip)->avail = lfs_sb_getavail(fs) - fs->lfs_ravail - \ - fs->lfs_favail; \ + lfs_ci_setbfree(fs, cip, lfs_sb_getbfree(fs)); \ + lfs_ci_setavail(fs, cip, lfs_sb_getavail(fs) - fs->lfs_ravail - \ + fs->lfs_favail); \ if (((bp)->b_flags & B_GATHERED) == 0) { \ fs->lfs_flags |= LFS_IFDIRTY; \ } \ @@ -334,7 +392,7 @@ #define LFS_GET_HEADFREE(FS, CIP, BP, FREEP) do { \ if (lfs_sb_getversion(FS) > 1) { \ LFS_CLEANERINFO((CIP), (FS), (BP)); \ - lfs_sb_setfreehd(FS, (CIP)->free_head); \ + lfs_sb_setfreehd(FS, lfs_ci_getfree_head(FS, CIP)); \ brelse(BP, 0); \ } \ *(FREEP) = lfs_sb_getfreehd(FS); \ @@ -344,7 +402,7 @@ lfs_sb_setfreehd(FS, VAL); \ if (lfs_sb_getversion(FS) > 1) { \ LFS_CLEANERINFO((CIP), (FS), (BP)); \ - (CIP)->free_head = (VAL); \ + lfs_ci_setfree_head(FS, CIP, VAL); \ LFS_BWRITE_LOG(BP); \ mutex_enter(&lfs_lock); \ (FS)->lfs_flags |= LFS_IFDIRTY; \ @@ -354,13 +412,13 @@ #define LFS_GET_TAILFREE(FS, CIP, BP, FREEP) do { \ LFS_CLEANERINFO((CIP), (FS), (BP)); \ - *(FREEP) = (CIP)->free_tail; \ + *(FREEP) = lfs_ci_getfree_tail(FS, CIP); \ brelse(BP, 0); \ } while (0) #define LFS_PUT_TAILFREE(FS, CIP, BP, VAL) do { \ LFS_CLEANERINFO((CIP), (FS), (BP)); \ - (CIP)->free_tail = (VAL); \ + lfs_ci_setfree_tail(FS, CIP, VAL); \ LFS_BWRITE_LOG(BP); \ mutex_enter(&lfs_lock); \ (FS)->lfs_flags |= LFS_IFDIRTY; \ @@ -379,15 +437,8 @@ /* * Generate accessors for the on-disk superblock fields with cpp. - * - * STRUCT_LFS is used by the libsa code to get accessors that work - * with struct salfs instead of struct lfs. */ -#ifndef STRUCT_LFS -#define STRUCT_LFS struct lfs -#endif - #define LFS_DEF_SB_ACCESSOR_FULL(type, type32, field) \ static __unused inline type \ lfs_sb_get##field(STRUCT_LFS *fs) \ Index: src/sys/ufs/lfs/lfs_segment.c diff -u src/sys/ufs/lfs/lfs_segment.c:1.251 src/sys/ufs/lfs/lfs_segment.c:1.252 --- src/sys/ufs/lfs/lfs_segment.c:1.251 Sun Aug 2 18:18:46 2015 +++ src/sys/ufs/lfs/lfs_segment.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_segment.c,v 1.251 2015/08/02 18:18:46 dholland Exp $ */ +/* $NetBSD: lfs_segment.c,v 1.252 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.251 2015/08/02 18:18:46 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.252 2015/08/12 18:25:04 dholland Exp $"); #define _VFS_VNODE_PRIVATE /* XXX: check for VI_MARKER, this has to go */ @@ -1907,9 +1907,8 @@ lfs_newseg(struct lfs *fs) LFS_WRITESEGENTRY(sup, fs, lfs_dtosn(fs, lfs_sb_getnextseg(fs)), bp); LFS_CLEANERINFO(cip, fs, bp); - --cip->clean; - ++cip->dirty; - lfs_sb_setnclean(fs, cip->clean); + lfs_ci_shiftcleantodirty(fs, cip, 1); + lfs_sb_setnclean(fs, lfs_ci_getclean(fs, cip)); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); lfs_sb_setlastseg(fs, lfs_sb_getcurseg(fs)); Index: src/sys/ufs/lfs/lfs_subr.c diff -u src/sys/ufs/lfs/lfs_subr.c:1.84 src/sys/ufs/lfs/lfs_subr.c:1.85 --- src/sys/ufs/lfs/lfs_subr.c:1.84 Tue Jul 28 05:09:35 2015 +++ src/sys/ufs/lfs/lfs_subr.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_subr.c,v 1.84 2015/07/28 05:09:35 dholland Exp $ */ +/* $NetBSD: lfs_subr.c,v 1.85 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_subr.c,v 1.84 2015/07/28 05:09:35 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_subr.c,v 1.85 2015/08/12 18:25:04 dholland Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -620,7 +620,8 @@ lfs_segunlock_relock(struct lfs *fs) /* Tell cleaner */ LFS_CLEANERINFO(cip, fs, bp); - cip->flags |= LFS_CLEANER_MUST_CLEAN; + lfs_ci_setflags(fs, cip, + lfs_ci_getflags(fs, cip) | LFS_CLEANER_MUST_CLEAN); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); /* Save segment flags for later */ @@ -644,7 +645,8 @@ lfs_segunlock_relock(struct lfs *fs) /* Cleaner can relax now */ LFS_CLEANERINFO(cip, fs, bp); - cip->flags &= ~LFS_CLEANER_MUST_CLEAN; + lfs_ci_setflags(fs, cip, + lfs_ci_getflags(fs, cip) & ~LFS_CLEANER_MUST_CLEAN); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); return; Index: src/sys/ufs/lfs/lfs_syscalls.c diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.166 src/sys/ufs/lfs/lfs_syscalls.c:1.167 --- src/sys/ufs/lfs/lfs_syscalls.c:1.166 Wed Aug 12 18:23:47 2015 +++ src/sys/ufs/lfs/lfs_syscalls.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_syscalls.c,v 1.166 2015/08/12 18:23:47 dholland Exp $ */ +/* $NetBSD: lfs_syscalls.c,v 1.167 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.166 2015/08/12 18:23:47 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.167 2015/08/12 18:25:04 dholland Exp $"); #ifndef LFS # define LFS /* for prototypes in syscallargs.h */ @@ -877,12 +877,12 @@ lfs_do_segclean(struct lfs *fs, unsigned LFS_WRITESEGENTRY(sup, fs, segnum, bp); LFS_CLEANERINFO(cip, fs, bp); - ++cip->clean; - --cip->dirty; - lfs_sb_setnclean(fs, cip->clean); + lfs_ci_shiftdirtytoclean(fs, cip, 1); + lfs_sb_setnclean(fs, lfs_ci_getclean(fs, cip)); mutex_enter(&lfs_lock); - cip->bfree = lfs_sb_getbfree(fs); - cip->avail = lfs_sb_getavail(fs) - fs->lfs_ravail - fs->lfs_favail; + lfs_ci_setbfree(fs, cip, lfs_sb_getbfree(fs)); + lfs_ci_setavail(fs, cip, lfs_sb_getavail(fs) + - fs->lfs_ravail - fs->lfs_favail); wakeup(&fs->lfs_availsleep); mutex_exit(&lfs_lock); (void) LFS_BWRITE_LOG(bp); Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.335 src/sys/ufs/lfs/lfs_vfsops.c:1.336 --- src/sys/ufs/lfs/lfs_vfsops.c:1.335 Wed Aug 12 18:23:59 2015 +++ src/sys/ufs/lfs/lfs_vfsops.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.335 2015/08/12 18:23:59 dholland Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.336 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.335 2015/08/12 18:23:59 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.336 2015/08/12 18:25:04 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -1198,10 +1198,10 @@ lfs_mountfs(struct vnode *devvp, struct * the superblock. */ LFS_CLEANERINFO(cip, fs, bp); - cip->clean = lfs_sb_getnclean(fs); - cip->dirty = lfs_sb_getnseg(fs) - lfs_sb_getnclean(fs); - cip->avail = lfs_sb_getavail(fs); - cip->bfree = lfs_sb_getbfree(fs); + lfs_ci_setclean(fs, cip, lfs_sb_getnclean(fs)); + lfs_ci_setdirty(fs, cip, lfs_sb_getnseg(fs) - lfs_sb_getnclean(fs)); + lfs_ci_setavail(fs, cip, lfs_sb_getavail(fs)); + lfs_ci_setbfree(fs, cip, lfs_sb_getbfree(fs)); (void) LFS_BWRITE_LOG(bp); /* Ifile */ /* @@ -2268,6 +2268,7 @@ int lfs_resize_fs(struct lfs *fs, int newnsegs) { SEGUSE *sup; + CLEANERINFO *cip; struct buf *bp, *obp; daddr_t olast, nlast, ilast, noff, start, end; struct vnode *ivp; @@ -2445,8 +2446,9 @@ lfs_resize_fs(struct lfs *fs, int newnse /* Update cleaner info so the cleaner can die */ /* XXX what to do if bread fails? */ bread(ivp, 0, lfs_sb_getbsize(fs), B_MODIFY, &bp); - ((CLEANERINFO *)bp->b_data)->clean = lfs_sb_getnclean(fs); - ((CLEANERINFO *)bp->b_data)->dirty = lfs_sb_getnseg(fs) - lfs_sb_getnclean(fs); + cip = bp->b_data; + lfs_ci_setclean(fs, cip, lfs_sb_getnclean(fs)); + lfs_ci_setdirty(fs, cip, lfs_sb_getnseg(fs) - lfs_sb_getnclean(fs)); VOP_BWRITE(bp->b_vp, bp); /* Let Ifile accesses proceed */ Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.283 src/sys/ufs/lfs/lfs_vnops.c:1.284 --- src/sys/ufs/lfs/lfs_vnops.c:1.283 Wed Aug 12 18:24:14 2015 +++ src/sys/ufs/lfs/lfs_vnops.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.283 2015/08/12 18:24:14 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.284 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.283 2015/08/12 18:24:14 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.284 2015/08/12 18:25:04 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1917,7 +1917,7 @@ segwait_common: lfs_seglock(fs, SEGM_FORCE_CKP | SEGM_CKP); lfs_flush_dirops(fs); LFS_CLEANERINFO(cip, fs, bp); - oclean = cip->clean; + oclean = lfs_ci_getclean(fs, cip); LFS_SYNC_CLEANERINFO(cip, fs, bp, 1); lfs_segwrite(ap->a_vp->v_mount, SEGM_FORCE_CKP); fs->lfs_sp->seg_flags |= SEGM_PROT; @@ -1928,7 +1928,8 @@ segwait_common: LFS_CLEANERINFO(cip, fs, bp); DLOG((DLOG_CLEAN, "lfs_fcntl: reclaim wrote %" PRId64 " blocks, cleaned %" PRId32 " segments (activesb %d)\n", - lfs_sb_getoffset(fs) - off, cip->clean - oclean, + lfs_sb_getoffset(fs) - off, + lfs_ci_getclean(fs, cip) - oclean, fs->lfs_activesb)); LFS_SYNC_CLEANERINFO(cip, fs, bp, 0); #else Index: src/usr.sbin/dumplfs/dumplfs.c diff -u src/usr.sbin/dumplfs/dumplfs.c:1.49 src/usr.sbin/dumplfs/dumplfs.c:1.50 --- src/usr.sbin/dumplfs/dumplfs.c:1.49 Sun Aug 2 18:18:10 2015 +++ src/usr.sbin/dumplfs/dumplfs.c Wed Aug 12 18:25:04 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dumplfs.c,v 1.49 2015/08/02 18:18:10 dholland Exp $ */ +/* $NetBSD: dumplfs.c,v 1.50 2015/08/12 18:25:04 dholland Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -40,7 +40,7 @@ __COPYRIGHT("@(#) Copyright (c) 1991, 19 #if 0 static char sccsid[] = "@(#)dumplfs.c 8.5 (Berkeley) 5/24/95"; #else -__RCSID("$NetBSD: dumplfs.c,v 1.49 2015/08/02 18:18:10 dholland Exp $"); +__RCSID("$NetBSD: dumplfs.c,v 1.50 2015/08/12 18:25:04 dholland Exp $"); #endif #endif /* not lint */ @@ -827,13 +827,16 @@ dump_cleaner_info(struct lfs *lfsp, void cip = (CLEANERINFO *)ipage; if (lfs_sb_getversion(lfsp) > 1) { - (void)printf("free_head %d\n", cip->free_head); - (void)printf("free_tail %d\n", cip->free_tail); - } - (void)printf("clean\t%d\tdirty\t%d\n", - cip->clean, cip->dirty); - (void)printf("bfree\t%d\tavail\t%d\n\n", - cip->bfree, cip->avail); + (void)printf("free_head %ju\n", + (uintmax_t)lfs_ci_getfree_head(lfsp, cip)); + (void)printf("free_tail %ju\n", + (uintmax_t)lfs_ci_getfree_tail(lfsp, cip)); + } + (void)printf("clean\t%u\tdirty\t%u\n", + lfs_ci_getclean(lfsp, cip), lfs_ci_getdirty(lfsp, cip)); + (void)printf("bfree\t%jd\tavail\t%jd\n\n", + (intmax_t)lfs_ci_getbfree(lfsp, cip), + (intmax_t)lfs_ci_getavail(lfsp, cip)); } static void