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

Reply via email to