1 1.55 riastrad /* $NetBSD: lfs_debug.c,v 1.55 2020/02/23 08:39:09 riastradh Exp $ */ 2 1.2 cgd 3 1.9 perseant /*- 4 1.20 perseant * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. 5 1.9 perseant * All rights reserved. 6 1.9 perseant * 7 1.9 perseant * This code is derived from software contributed to The NetBSD Foundation 8 1.9 perseant * by Konrad E. Schroder <perseant (at) hhhh.org>. 9 1.9 perseant * 10 1.9 perseant * Redistribution and use in source and binary forms, with or without 11 1.9 perseant * modification, are permitted provided that the following conditions 12 1.9 perseant * are met: 13 1.9 perseant * 1. Redistributions of source code must retain the above copyright 14 1.9 perseant * notice, this list of conditions and the following disclaimer. 15 1.9 perseant * 2. Redistributions in binary form must reproduce the above copyright 16 1.9 perseant * notice, this list of conditions and the following disclaimer in the 17 1.9 perseant * documentation and/or other materials provided with the distribution. 18 1.9 perseant * 19 1.9 perseant * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.9 perseant * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.9 perseant * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.9 perseant * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.9 perseant * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.9 perseant * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.9 perseant * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.9 perseant * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.9 perseant * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.9 perseant * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.9 perseant * POSSIBILITY OF SUCH DAMAGE. 30 1.9 perseant */ 31 1.1 mycroft /* 32 1.1 mycroft * Copyright (c) 1991, 1993 33 1.1 mycroft * The Regents of the University of California. All rights reserved. 34 1.1 mycroft * 35 1.1 mycroft * Redistribution and use in source and binary forms, with or without 36 1.1 mycroft * modification, are permitted provided that the following conditions 37 1.1 mycroft * are met: 38 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 39 1.1 mycroft * notice, this list of conditions and the following disclaimer. 40 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 41 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 42 1.1 mycroft * documentation and/or other materials provided with the distribution. 43 1.23 agc * 3. Neither the name of the University nor the names of its contributors 44 1.1 mycroft * may be used to endorse or promote products derived from this software 45 1.1 mycroft * without specific prior written permission. 46 1.1 mycroft * 47 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 48 1.1 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 1.1 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 1.1 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 51 1.1 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52 1.1 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53 1.1 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 1.1 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55 1.1 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56 1.1 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57 1.1 mycroft * SUCH DAMAGE. 58 1.1 mycroft * 59 1.2 cgd * @(#)lfs_debug.c 8.1 (Berkeley) 6/11/93 60 1.1 mycroft */ 61 1.1 mycroft 62 1.35 lukem #include <sys/cdefs.h> 63 1.55 riastrad __KERNEL_RCSID(0, "$NetBSD: lfs_debug.c,v 1.55 2020/02/23 08:39:09 riastradh Exp $"); 64 1.35 lukem 65 1.1 mycroft #ifdef DEBUG 66 1.14 lukem 67 1.1 mycroft #include <sys/param.h> 68 1.3 christos #include <sys/systm.h> 69 1.1 mycroft #include <sys/namei.h> 70 1.1 mycroft #include <sys/vnode.h> 71 1.1 mycroft #include <sys/mount.h> 72 1.16 perseant #include <sys/buf.h> 73 1.26 perseant #include <sys/syslog.h> 74 1.34 christos #include <sys/proc.h> 75 1.1 mycroft 76 1.41 dholland #include <ufs/lfs/ulfs_inode.h> 77 1.1 mycroft #include <ufs/lfs/lfs.h> 78 1.46 dholland #include <ufs/lfs/lfs_accessors.h> 79 1.1 mycroft #include <ufs/lfs/lfs_extern.h> 80 1.16 perseant 81 1.16 perseant int lfs_lognum; 82 1.16 perseant struct lfs_log_entry lfs_log[LFS_LOGLENGTH]; 83 1.16 perseant 84 1.38 dholland int 85 1.38 dholland lfs_bwrite_log(struct buf *bp, const char *file, int line) 86 1.16 perseant { 87 1.16 perseant 88 1.36 ad if (!(bp->b_flags & B_GATHERED) && !(bp->b_oflags & BO_DELWRI)) { 89 1.30 perseant LFS_ENTER_LOG("write", file, line, bp->b_lblkno, bp->b_flags, 90 1.30 perseant curproc->p_pid); 91 1.30 perseant } 92 1.55 riastrad return VOP_BWRITE(bp->b_vp, bp); 93 1.16 perseant } 94 1.16 perseant 95 1.38 dholland void 96 1.38 dholland lfs_dumplog(void) 97 1.16 perseant { 98 1.16 perseant int i; 99 1.31 christos const char *cp; 100 1.16 perseant 101 1.30 perseant for (i = lfs_lognum; i != (lfs_lognum - 1) % LFS_LOGLENGTH; 102 1.30 perseant i = (i + 1) % LFS_LOGLENGTH) 103 1.16 perseant if (lfs_log[i].file) { 104 1.30 perseant /* Only print out basename, for readability */ 105 1.30 perseant cp = lfs_log[i].file; 106 1.30 perseant while(*cp) 107 1.30 perseant ++cp; 108 1.30 perseant while(*cp != '/' && cp > lfs_log[i].file) 109 1.30 perseant --cp; 110 1.30 perseant 111 1.30 perseant printf("lbn %" PRId64 " %s %lx %d, %d %s\n", 112 1.16 perseant lfs_log[i].block, 113 1.16 perseant lfs_log[i].op, 114 1.16 perseant lfs_log[i].flags, 115 1.30 perseant lfs_log[i].pid, 116 1.16 perseant lfs_log[i].line, 117 1.30 perseant cp); 118 1.16 perseant } 119 1.16 perseant } 120 1.1 mycroft 121 1.25 perry void 122 1.12 perseant lfs_dump_super(struct lfs *lfsp) 123 1.1 mycroft { 124 1.1 mycroft int i; 125 1.25 perry 126 1.47 dholland printf("%s%x\t%s%x\t%s%ju\t%s%d\n", 127 1.50 dholland "magic ", lfsp->lfs_is64 ? 128 1.50 dholland lfsp->lfs_dlfs_u.u_64.dlfs_magic : 129 1.50 dholland lfsp->lfs_dlfs_u.u_32.dlfs_magic, 130 1.49 dholland "version ", lfs_sb_getversion(lfsp), 131 1.47 dholland "size ", (uintmax_t)lfs_sb_getsize(lfsp), 132 1.44 martin "ssize ", lfs_sb_getssize(lfsp)); 133 1.47 dholland printf("%s%ju\t%s%d\t%s%d\t%s%d\n", 134 1.47 dholland "dsize ", (uintmax_t)lfs_sb_getdsize(lfsp), 135 1.44 martin "bsize ", lfs_sb_getbsize(lfsp), 136 1.44 martin "fsize ", lfs_sb_getfsize(lfsp), 137 1.44 martin "frag ", lfs_sb_getfrag(lfsp)); 138 1.25 perry 139 1.6 christos printf("%s%d\t%s%d\t%s%d\t%s%d\n", 140 1.44 martin "minfree ", lfs_sb_getminfree(lfsp), 141 1.44 martin "inopb ", lfs_sb_getinopb(lfsp), 142 1.44 martin "ifpb ", lfs_sb_getifpb(lfsp), 143 1.44 martin "nindir ", lfs_sb_getnindir(lfsp)); 144 1.25 perry 145 1.6 christos printf("%s%d\t%s%d\t%s%d\t%s%d\n", 146 1.44 martin "nseg ", lfs_sb_getnseg(lfsp), 147 1.44 martin "nspf ", lfs_sb_getnspf(lfsp), 148 1.44 martin "cleansz ", lfs_sb_getcleansz(lfsp), 149 1.44 martin "segtabsz ", lfs_sb_getsegtabsz(lfsp)); 150 1.25 perry 151 1.8 fvdl printf("%s%x\t%s%d\t%s%lx\t%s%d\n", 152 1.44 martin "segmask ", lfs_sb_getsegmask(lfsp), 153 1.44 martin "segshift ", lfs_sb_getsegshift(lfsp), 154 1.44 martin "bmask ", (unsigned long)lfs_sb_getbmask(lfsp), 155 1.44 martin "bshift ", lfs_sb_getbshift(lfsp)); 156 1.25 perry 157 1.8 fvdl printf("%s%lu\t%s%d\t%s%lx\t%s%u\n", 158 1.44 martin "ffmask ", (unsigned long)lfs_sb_getffmask(lfsp), 159 1.44 martin "ffshift ", lfs_sb_getffshift(lfsp), 160 1.44 martin "fbmask ", (unsigned long)lfs_sb_getfbmask(lfsp), 161 1.44 martin "fbshift ", lfs_sb_getfbshift(lfsp)); 162 1.25 perry 163 1.48 dholland printf("%s%d\t%s%d\t%s%x\t%s%jx\n", 164 1.44 martin "sushift ", lfs_sb_getsushift(lfsp), 165 1.44 martin "fsbtodb ", lfs_sb_getfsbtodb(lfsp), 166 1.44 martin "cksum ", lfs_sb_getcksum(lfsp), 167 1.48 dholland "maxfilesize ", (uintmax_t)lfs_sb_getmaxfilesize(lfsp)); 168 1.25 perry 169 1.6 christos printf("Superblock disk addresses:"); 170 1.1 mycroft for (i = 0; i < LFS_MAXNUMSB; i++) 171 1.48 dholland printf(" %jx", (intmax_t)lfs_sb_getsboff(lfsp, i)); 172 1.6 christos printf("\n"); 173 1.25 perry 174 1.6 christos printf("Checkpoint Info\n"); 175 1.54 dholland printf("%s%ju\t%s%jx\n", 176 1.53 dholland "freehd ", (uintmax_t)lfs_sb_getfreehd(lfsp), 177 1.54 dholland "idaddr ", (intmax_t)lfs_sb_getidaddr(lfsp)); 178 1.53 dholland printf("%s%jx\t%s%ju\t%s%jx\t%s%jx\t%s%jx\t%s%jx\n", 179 1.47 dholland "bfree ", (intmax_t)lfs_sb_getbfree(lfsp), 180 1.53 dholland "nfiles ", (uintmax_t)lfs_sb_getnfiles(lfsp), 181 1.48 dholland "lastseg ", (intmax_t)lfs_sb_getlastseg(lfsp), 182 1.48 dholland "nextseg ", (intmax_t)lfs_sb_getnextseg(lfsp), 183 1.48 dholland "curseg ", (intmax_t)lfs_sb_getcurseg(lfsp), 184 1.48 dholland "offset ", (intmax_t)lfs_sb_getoffset(lfsp)); 185 1.44 martin printf("tstamp %llx\n", (long long)lfs_sb_gettstamp(lfsp)); 186 1.54 dholland 187 1.54 dholland if (!lfsp->lfs_is64) { 188 1.54 dholland printf("32-bit only derived or constant fields\n"); 189 1.54 dholland printf("%s%u\n", 190 1.54 dholland "ifile ", lfs_sb_getifile(lfsp)); 191 1.54 dholland } 192 1.1 mycroft } 193 1.1 mycroft 194 1.1 mycroft void 195 1.52 dholland lfs_dump_dinode(struct lfs *fs, union lfs_dinode *dip) 196 1.1 mycroft { 197 1.1 mycroft int i; 198 1.25 perry 199 1.52 dholland printf("%s%u\t%s%d\t%s%u\t%s%u\t%s%ju\t%s%ju\n", 200 1.52 dholland "mode ", lfs_dino_getmode(fs, dip), 201 1.52 dholland "nlink ", lfs_dino_getnlink(fs, dip), 202 1.52 dholland "uid ", lfs_dino_getuid(fs, dip), 203 1.52 dholland "gid ", lfs_dino_getgid(fs, dip), 204 1.52 dholland "size ", (uintmax_t)lfs_dino_getsize(fs, dip), 205 1.52 dholland "blocks ", (uintmax_t)lfs_dino_getblocks(fs, dip)); 206 1.52 dholland printf("inum %ju\n", (uintmax_t)lfs_dino_getinumber(fs, dip)); 207 1.6 christos printf("Direct Addresses\n"); 208 1.42 dholland for (i = 0; i < ULFS_NDADDR; i++) { 209 1.52 dholland printf("\t%jx", (intmax_t)lfs_dino_getdb(fs, dip, i)); 210 1.1 mycroft if ((i % 6) == 5) 211 1.6 christos printf("\n"); 212 1.1 mycroft } 213 1.42 dholland for (i = 0; i < ULFS_NIADDR; i++) 214 1.52 dholland printf("\t%jx", (intmax_t)lfs_dino_getib(fs, dip, i)); 215 1.6 christos printf("\n"); 216 1.9 perseant } 217 1.9 perseant 218 1.9 perseant void 219 1.9 perseant lfs_check_segsum(struct lfs *fs, struct segment *sp, char *file, int line) 220 1.9 perseant { 221 1.24 simonb int actual; 222 1.9 perseant #if 0 223 1.25 perry static int offset; 224 1.9 perseant #endif 225 1.25 perry 226 1.24 simonb if ((actual = 1) == 1) 227 1.9 perseant return; /* XXXX not checking this anymore, really */ 228 1.25 perry 229 1.51 dholland if (sp->sum_bytes_left >= FINFOSIZE(fs) 230 1.51 dholland && lfs_fi_getnblocks(fs, sp->fip) > 512) { 231 1.51 dholland printf("%s:%d: fi_nblocks = %d\n", file, line, 232 1.51 dholland lfs_fi_getnblocks(fs, sp->fip)); 233 1.9 perseant #ifdef DDB 234 1.9 perseant Debugger(); 235 1.9 perseant #endif 236 1.9 perseant } 237 1.25 perry 238 1.15 chs if (sp->sum_bytes_left > 484) { 239 1.9 perseant printf("%s:%d: bad value (%d = -%d) for sum_bytes_left\n", 240 1.44 martin file, line, sp->sum_bytes_left, lfs_sb_getsumsize(fs)-sp->sum_bytes_left); 241 1.9 perseant panic("too many bytes"); 242 1.9 perseant } 243 1.25 perry 244 1.44 martin actual = lfs_sb_getsumsize(fs) 245 1.9 perseant /* amount taken up by FINFOs */ 246 1.51 dholland - ((char *)NEXT_FINFO(fs, sp->fip) - (char *)(sp->segsum)) 247 1.9 perseant /* amount taken up by inode blocks */ 248 1.51 dholland /* XXX should this be INUMSIZE or BLKPTRSIZE? */ 249 1.51 dholland - LFS_INUMSIZE(fs)*((sp->ninodes+LFS_INOPB(fs)-1) / LFS_INOPB(fs)); 250 1.9 perseant #if 0 251 1.25 perry if (actual - sp->sum_bytes_left < offset) 252 1.25 perry { 253 1.9 perseant printf("%s:%d: offset changed %d -> %d\n", file, line, 254 1.9 perseant offset, actual-sp->sum_bytes_left); 255 1.9 perseant offset = actual - sp->sum_bytes_left; 256 1.9 perseant /* panic("byte mismatch"); */ 257 1.9 perseant } 258 1.9 perseant #endif 259 1.9 perseant #if 0 260 1.15 chs if (actual != sp->sum_bytes_left) 261 1.9 perseant printf("%s:%d: warning: segsum miscalc at %d (-%d => %d)\n", 262 1.9 perseant file, line, sp->sum_bytes_left, 263 1.45 hannken lfs_sb_getsumsize(fs)-sp->sum_bytes_left, 264 1.9 perseant actual); 265 1.9 perseant #endif 266 1.15 chs if (sp->sum_bytes_left > 0 267 1.44 martin && ((char *)(sp->segsum))[lfs_sb_getsumsize(fs) 268 1.43 christos - sizeof(int32_t) * ((sp->ninodes+LFS_INOPB(fs)-1) / LFS_INOPB(fs)) 269 1.9 perseant - sp->sum_bytes_left] != '\0') { 270 1.9 perseant printf("%s:%d: warning: segsum overwrite at %d (-%d => %d)\n", 271 1.9 perseant file, line, sp->sum_bytes_left, 272 1.44 martin lfs_sb_getsumsize(fs)-sp->sum_bytes_left, 273 1.9 perseant actual); 274 1.9 perseant #ifdef DDB 275 1.9 perseant Debugger(); 276 1.9 perseant #endif 277 1.9 perseant } 278 1.9 perseant } 279 1.9 perseant 280 1.9 perseant void 281 1.12 perseant lfs_check_bpp(struct lfs *fs, struct segment *sp, char *file, int line) 282 1.9 perseant { 283 1.9 perseant daddr_t blkno; 284 1.9 perseant struct buf **bpp; 285 1.9 perseant struct vnode *devvp; 286 1.25 perry 287 1.9 perseant devvp = VTOI(fs->lfs_ivnode)->i_devvp; 288 1.9 perseant blkno = (*(sp->bpp))->b_blkno; 289 1.15 chs for (bpp = sp->bpp; bpp < sp->cbpp; bpp++) { 290 1.15 chs if ((*bpp)->b_blkno != blkno) { 291 1.15 chs if ((*bpp)->b_vp == devvp) { 292 1.18 kleink printf("Oops, would misplace raw block " 293 1.18 kleink "0x%" PRIx64 " at 0x%" PRIx64 "\n", 294 1.9 perseant (*bpp)->b_blkno, 295 1.9 perseant blkno); 296 1.9 perseant } else { 297 1.32 christos printf("%s:%d: misplace ino %llu lbn %" PRId64 298 1.18 kleink " at 0x%" PRIx64 " instead of " 299 1.18 kleink "0x%" PRIx64 "\n", 300 1.9 perseant file, line, 301 1.32 christos (unsigned long long) 302 1.32 christos VTOI((*bpp)->b_vp)->i_number, 303 1.32 christos (*bpp)->b_lblkno, 304 1.9 perseant blkno, 305 1.9 perseant (*bpp)->b_blkno); 306 1.9 perseant } 307 1.9 perseant } 308 1.43 christos blkno += LFS_FSBTODB(fs, lfs_btofsb(fs, (*bpp)->b_bcount)); 309 1.9 perseant } 310 1.1 mycroft } 311 1.26 perseant 312 1.26 perseant int lfs_debug_log_subsys[DLOG_MAX]; 313 1.26 perseant 314 1.26 perseant /* 315 1.26 perseant * Log events from various debugging areas of LFS, depending on what 316 1.26 perseant * the user has enabled. 317 1.26 perseant */ 318 1.26 perseant void 319 1.26 perseant lfs_debug_log(int subsys, const char *fmt, ...) 320 1.26 perseant { 321 1.27 simonb va_list ap; 322 1.26 perseant 323 1.26 perseant /* If not debugging this subsys, exit */ 324 1.26 perseant if (lfs_debug_log_subsys[subsys] == 0) 325 1.26 perseant return; 326 1.26 perseant 327 1.29 christos va_start(ap, fmt); 328 1.28 christos vlog(LOG_DEBUG, fmt, ap); 329 1.27 simonb va_end(ap); 330 1.26 perseant } 331 1.1 mycroft #endif /* DEBUG */ 332