Return to BSD News archive
Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!newshost.telstra.net!act.news.telstra.net!psgrain!news.uoregon.edu!cyberspace.com!news.sprintlink.net!news.onramp.net!news.tcst.com!news.spectrum.titan.com!op.net!agis!news.tacom.army.mil!ulowell.uml.edu!europa.chnt.gtegsc.com!wlbr!sms
From: sms@wlv.iipo.gtegsc.com (Steven M. Schultz)
Subject: 'mount /dev/ram /tmp' panics the system (#305)
Sender: news@wlbr.iipo.gtegsc.com (System Administrator)
Organization: GTE Government Systems, Thousand Oaks CA USA
Message-ID: <DnMpvn.C8B@wlbr.iipo.gtegsc.com>
X-Nntp-Posting-Host: wlv.iipo.gtegsc.com
Date: Sat, 2 Mar 1996 07:23:46 GMT
Lines: 111
Subject: 'mount /dev/ram /tmp' panics the system (#305)
Index: sys/ufs_mount.c 2.11BSD
Description:
Doing a "mount /dev/ram /tmp" causes a "panic: dup biodone" crash.
Repeat-By:
Build a kernel with the ram(4) driver. Make a filesystem on
/dev/ram (this will work fine). Then attempt to mount /dev/ram.
*thud*.
Fix:
The problem is that the ram(4) driver is a 'BLOCK' (IFBLK) device
only, there is no corresponding 'CHARACTER' (IFCHR) device. Thus
referring to 'cdevsw[]' with ram(4)'s major device number is a serious
bug that causes a wild jump when calling cdevsw[].d_ioctl (to
the tmscpstrategy() routine in my case).
The fix is to check for the NODEV return from the call to 'blktochr()'
in ufs_mount.c. Arguably the 'cdevsw' table should have been
expanded to include a 'ram' entry point. But since ram(4) is
the only "disk" device which does not have a 'raw' (character) device
it was felt that fixing ufs_mount.c was a better (data space saving)
solution.
Cut where indicated saving to a file (/tmp/305). Then:
patch -p0 < /tmp/305
It is not strictly necessary to rebuild the kernel at this time
(but probably a good idea) if you do not have the ram(4) driver
included.
=============================cut here====================
*** /sys/sys/ufs_mount.c.old Tue Dec 26 20:09:53 1995
--- /sys/sys/ufs_mount.c Fri Mar 1 21:03:35 1996
***************
*** 3,9 ****
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
! * @(#)ufs_mount.c 1.6 (2.11BSD GTE) 1995/12/24
*/
#include "param.h"
--- 3,9 ----
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
! * @(#)ufs_mount.c 1.7 (2.11BSD GTE) 1996/3/1
*/
#include "param.h"
***************
*** 118,124 ****
register int error;
int ronly = flags & MNT_RDONLY;
int needclose = 0;
! int (*ioctl)();
struct partinfo dpart;
error =
--- 118,124 ----
register int error;
int ronly = flags & MNT_RDONLY;
int needclose = 0;
! int chrdev, (*ioctl)();
struct partinfo dpart;
error =
***************
*** 129,136 ****
* Now make a check that the partition is really a filesystem if the
* underlying driver supports disklabels (there is an ioctl entry point
* and calling it does not return an error).
*/
! ioctl = cdevsw[blktochr(dev)].d_ioctl;
if (ioctl && !(*ioctl)(dev, DIOCGPART, &dpart, FREAD))
{
if (dpart.part->p_fstype != FS_V71K)
--- 129,144 ----
* Now make a check that the partition is really a filesystem if the
* underlying driver supports disklabels (there is an ioctl entry point
* and calling it does not return an error).
+ *
+ * XXX - Check for NODEV because BLK only devices (i.e. the 'ram' driver) do not
+ * XXX - have a CHR counterpart. Such drivers can not support labels due to
+ * XXX - the lack of an ioctl entry point.
*/
! chrdev = blktochr(dev);
! if (chrdev == NODEV)
! ioctl = NULL;
! else
! ioctl = cdevsw[chrdev].d_ioctl;
if (ioctl && !(*ioctl)(dev, DIOCGPART, &dpart, FREAD))
{
if (dpart.part->p_fstype != FS_V71K)
*** /VERSION.old Fri Feb 23 20:34:10 1996
--- /VERSION Fri Mar 1 23:19:40 1996
***************
*** 1,4 ****
! Current Patch Level: 304
2.11 BSD
============
--- 1,4 ----
! Current Patch Level: 305
2.11 BSD
============