Module Name: src Committed By: christos Date: Tue Apr 12 00:36:29 UTC 2016
Modified Files: src/sys/ufs/ufs: ufs_extern.h ufs_lookup.c Log Message: Provide reason to be printed in panic string. To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 src/sys/ufs/ufs/ufs_extern.h cvs rdiff -u -r1.136 -r1.137 src/sys/ufs/ufs/ufs_lookup.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ufs/ufs_extern.h diff -u src/sys/ufs/ufs/ufs_extern.h:1.80 src/sys/ufs/ufs/ufs_extern.h:1.81 --- src/sys/ufs/ufs/ufs_extern.h:1.80 Mon Apr 11 19:41:15 2016 +++ src/sys/ufs/ufs/ufs_extern.h Mon Apr 11 20:36:29 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_extern.h,v 1.80 2016/04/11 23:41:15 christos Exp $ */ +/* $NetBSD: ufs_extern.h,v 1.81 2016/04/12 00:36:29 christos Exp $ */ /*- * Copyright (c) 1991, 1993, 1994 @@ -115,7 +115,7 @@ int ufs_truncate(struct vnode *, uint64_ /* ufs_lookup.c */ void ufs_dirbad(struct inode *, doff_t, const char *); -int ufs_dirbadentry(struct vnode *, struct direct *, int); +const char *ufs_dirbadentry(struct vnode *, struct direct *, int); void ufs_makedirentry(struct inode *, struct componentname *, struct direct *); int ufs_direnter(struct vnode *, const struct ufs_lookup_results *, Index: src/sys/ufs/ufs/ufs_lookup.c diff -u src/sys/ufs/ufs/ufs_lookup.c:1.136 src/sys/ufs/ufs/ufs_lookup.c:1.137 --- src/sys/ufs/ufs/ufs_lookup.c:1.136 Mon Apr 11 19:41:15 2016 +++ src/sys/ufs/ufs/ufs_lookup.c Mon Apr 11 20:36:29 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_lookup.c,v 1.136 2016/04/11 23:41:15 christos Exp $ */ +/* $NetBSD: ufs_lookup.c,v 1.137 2016/04/12 00:36:29 christos Exp $ */ /* * Copyright (c) 1989, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.136 2016/04/11 23:41:15 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.137 2016/04/12 00:36:29 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ffs.h" @@ -344,12 +344,12 @@ searchloop: */ KASSERT(bp != NULL); ep = (void *)((char *)bp->b_data + entryoffsetinblock); - if (ep->d_reclen == 0 || - (dirchk && ufs_dirbadentry(vdp, ep, entryoffsetinblock))) { + const char *msg; + if ((ep->d_reclen == 0 && (msg = "null entry")) || (dirchk && + (msg = ufs_dirbadentry(vdp, ep, entryoffsetinblock)))) { int i; - ufs_dirbad(dp, results->ulr_offset, ep->d_reclen == 0 ? - "null entry" : "mangled entry"); + ufs_dirbad(dp, results->ulr_offset, msg); i = dirblksiz - (entryoffsetinblock & (dirblksiz - 1)); results->ulr_offset += i; entryoffsetinblock += i; @@ -659,14 +659,13 @@ out: void ufs_dirbad(struct inode *ip, doff_t offset, const char *how) { - struct mount *mp; + struct mount *mp = ITOV(ip)->v_mount; + void (*p)(const char *, ...) = + (mp->mnt_flag & MNT_RDONLY) == 0 ? panic : printf; - mp = ITOV(ip)->v_mount; - printf("%s: bad dir ino %llu at offset %d: %s\n", + (*p)("%s: bad dir ino %llu at offset %d: %s\n", mp->mnt_stat.f_mntonname, (unsigned long long)ip->i_number, offset, how); - if ((mp->mnt_flag & MNT_RDONLY) == 0) - panic("bad dir"); } /* @@ -677,7 +676,7 @@ ufs_dirbad(struct inode *ip, doff_t offs * name is not longer than FFS_MAXNAMLEN * name must be as long as advertised, and null terminated */ -int +const char * ufs_dirbadentry(struct vnode *dp, struct direct *ep, int entryoffsetinblock) { const struct ufsmount *ump = VFSTOUFS(dp->v_mount); @@ -707,26 +706,26 @@ ufs_dirbadentry(struct vnode *dp, struct "flags=%#x, entryoffsetinblock=%d, dirblksiz=%d\n", __func__, str, reclen, namlen, dirsiz, reclen, maxsize, dp->v_mount->mnt_flag, entryoffsetinblock, dirblksiz); - goto bad; + return str; } if (ep->d_ino == 0) - return 0; + return NULL; - int i; - for (i = 0; i < namlen; i++) + for (int i = 0; i < namlen; i++) if (ep->d_name[i] == '\0') { - printf("%s: NUL in name i=%d, namlen=%d\n", __func__, - i, namlen); - goto bad; - } - if (ep->d_name[i]) { - printf("%s: missing NUL in name namlen=%d\n", __func__, i); - goto bad; - } - return 0; -bad: - return 1; + str = "NUL in name"; + printf("%s: %s i=%d, namlen=%d\n", __func__, str, i, + namlen); + return str; + } + + if (ep->d_name[namlen]) { + str = "missing NUL in name"; + printf("%s: %s namlen=%d\n", __func__, str, namlen); + return str; + } + return NULL; } /*