Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Oct 1998 16:16:06 +1100
From:      Bruce Evans <bde@zeta.org.au>
To:        freebsd-current@FreeBSD.ORG, gallatin@cs.duke.edu
Subject:   Re: panic mounting MFS filesystems
Message-ID:  <199810270516.QAA08046@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>Line 312 of mfs_vfsops.c,v 1.51 is assigning a major number of 255 to the mfs 
>devvp.  This vp is then falling through the cracks in the check around
>line 2553 of vfs_subr.c,v 1.169 because nblkdev == 128.

It would fail completely if nblkdev == 256, and used to overflow the
minor number after only 256 mfs mounts.  Now it doesn't overflow the
minor number until after 2^24 mfs mounts.

>vnode_pager_alloc() never gets called & object remains null.  The
>access done by object->ref_count causes--  the panic.
>
>The appended kludge allows me to again use MFS, but I'd appreciate it 
>if somebody who knows the code better could look into this..

>Index: vfs_subr.c
>===================================================================
>RCS file: /scratch/freebsd-cvs/src/sys/kern/vfs_subr.c,v
>retrieving revision 1.169
>diff -c -r1.169 vfs_subr.c
>*** vfs_subr.c	1998/10/26 08:07:00	1.169
>--- vfs_subr.c	1998/10/26 20:06:04
>***************
>*** 2524,2531 ****
>  			if ((error = VOP_GETATTR(vp, &vat, cred, p)) != 0)
>  				goto retn;
>  			object = vnode_pager_alloc(vp, vat.va_size, 0, 0);
>! 		} else if (major(vp->v_rdev) < nblkdev &&
>! 		    bdevsw[major(vp->v_rdev)] != NULL) {
>  			/*
>  			 * This simply allocates the biggest object possible
>  			 * for a VBLK vnode.  This should be fixed, but doesn't
>--- 2524,2532 ----
>  			if ((error = VOP_GETATTR(vp, &vat, cred, p)) != 0)
>  				goto retn;
>  			object = vnode_pager_alloc(vp, vat.va_size, 0, 0);
>! 		} else if ((vp->v_tag == VT_MFS) 
>! 			   || ( major(vp->v_rdev) < nblkdev 
>! 				&& bdevsw[major(vp->v_rdev)] != NULL)) {
>  			/*
>  			 * This simply allocates the biggest object possible
>  			 * for a VBLK vnode.  This should be fixed, but doesn't

The VT_MFS check should probably be in the callers.  There are only 2
callers for the VBLK case, both in ffs_vfsops.c, and these used to check
that major(vp->v_rdev) < nblkdev, so the buggy check here never succeeded.

Bruce

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810270516.QAA08046>