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