Return to BSD News archive
Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.mel.connect.com.au!munnari.OZ.AU!news.ecn.uoknor.edu!news.cis.okstate.edu!col.hp.com!usenet.eel.ufl.edu!newsfeed.internetmci.com!in2.uu.net!news.new-york.net!wlbr!sms
From: sms@wlv.iipo.gtegsc.com (Steven M. Schultz)
Subject: df can hang system, standalone TMSCP driver fails to compile (#288)
Sender: news@wlbr.iipo.gtegsc.com (Steven M. Schultz)
Organization: GTE Government Systems, Thousand Oaks CA USA
Message-ID: <DKH8BE.DFt@wlbr.iipo.gtegsc.com>
X-Nntp-Posting-Host: wlv.iipo.gtegsc.com
Date: Mon, 1 Jan 1996 00:35:38 GMT
Lines: 374
Subject: df can hang system, standalone TMSCP driver fails to compile (#288)
Index: sys/ufs_syscalls2.c,pdpstand/tmscp.c,pdpuba/tmscpreg.h 2.11BSD
Description:
Running 'df' using the directory form "df /" (or "df /usr/src")
will put the system to sleep.
The TMSCP driver in pdpstand/ generates errors during compilation.
Repeat-By:
df /
cd /sys/pdpstand
make
Fix:
The patch below fixes both problems. To install the patch, cut
where indicated and save to a file (/tmp/288). Then:
patch -p0 < /tmp/288
cd /sys/GENERIC
make
mv unix /genunix
cd /sys/YOUR_KERNEL
make
make install
fastboot
The system would hang when "df" would do 'statfs' call. Statfs
calls 'namei()' to resolve the pathname to an inode. 2.11's
namei() (which is derived from 4.3BSD's) returns a pointer to a
*locked* inode which means that "iput()" is normally used instead of
"irele()" when freeing the inode. 4.4BSD-Lite's namei() by default
returns a pointer to an *unlocked* vnode and thus can use 'vrele'
instead of 'vput' to free the vnode.
When the 'statfs' functionality was ported from 4.4-Lite the
'vrele' call should have been replaced with a 'iput' call instead
of 'irele'. This will unlock the inode and prevent the system
from going to sleep waiting for an inode to come free.
The standalone TMSCP driver was overlooked during the recent
restructuring of the kernel's TMSCP driver. Several defines and
structure definitions are not in a 'common' include file and
should have been removed from pdpstand/tmscp.c
And this _really_ is the last 2.11BSD update for 1995! ;-)
As always, this update along with all previous updates are available
via anonymous FTP to FTP.IIPO.GTEGSC.COM in the /pub/2.11BSD.
Happy New Year!
===========================cut here=======================
*** /usr/src/sys/pdpuba/tmscpreg.h.old Thu Dec 14 21:35:05 1995
--- /usr/src/sys/pdpuba/tmscpreg.h Sun Dec 31 10:58:11 1995
***************
*** 1,6 ****
/* @(#)tmscpreg.h 7.1 (Berkeley) 6/5/86 */
! /* @(#)tmscpreg.h 1.2 (2.11BSD) 1995/12/14 */
/****************************************************************
* *
--- 1,6 ----
/* @(#)tmscpreg.h 7.1 (Berkeley) 6/5/86 */
! /* @(#)tmscpreg.h 1.3 (2.11BSD) 1995/12/31 */
/****************************************************************
* *
***************
*** 63,70 ****
--- 63,75 ----
* These defines were moved here so they could be shared between the
* driver and the crash dump module.
*/
+ #ifndef NRSPL2
#define NRSPL2 3 /* log2 number of response packets */
+ #endif
+ #ifndef NCMDL2
#define NCMDL2 3 /* log2 number of command packets */
+ #endif
+
#define NRSP (1<<NRSPL2)
#define NCMD (1<<NCMDL2)
#define RINGBASE (4 * sizeof (short))
*** /usr/src/sys/sys/ufs_syscalls2.c.old Fri Dec 29 19:36:27 1995
--- /usr/src/sys/sys/ufs_syscalls2.c Sun Dec 31 12:12:18 1995
***************
*** 1,5 ****
/*
! * @(#) ufs_syscalls2.c 1.1 (2.11BSD) 1995/12/29
*
* ufs_syscalls was getting too large. New UFS related system calls are
* placed in this file.
--- 1,5 ----
/*
! * @(#) ufs_syscalls2.c 1.2 (2.11BSD) 1995/12/31
*
* ufs_syscalls was getting too large. New UFS related system calls are
* placed in this file.
***************
*** 31,37 ****
if (!ip)
return(u.u_error);
mp = (struct mount *)((int)ip->i_fs - offsetof(struct mount, m_filsys));
! irele(ip);
u.u_error = statfs1(mp, uap->buf);
return(u.u_error);
}
--- 31,37 ----
if (!ip)
return(u.u_error);
mp = (struct mount *)((int)ip->i_fs - offsetof(struct mount, m_filsys));
! iput(ip);
u.u_error = statfs1(mp, uap->buf);
return(u.u_error);
}
*** /usr/src/sys/pdpstand/tmscp.c.old Thu Jun 8 19:37:52 1995
--- /usr/src/sys/pdpstand/tmscp.c Sun Dec 31 11:00:10 1995
***************
*** 1,4 ****
! /* @(#)tmscp.c 7.1.2 (2.11BSD GTE) 1995/06/08 */
/****************************************************************
* Licensed from Digital Equipment Corporation *
--- 1,4 ----
! /* @(#)tmscp.c 7.1.3 (2.11BSD GTE) 1995/12/31 */
/****************************************************************
* Licensed from Digital Equipment Corporation *
***************
*** 50,65 ****
* Parameters for the communications area
* (Only 1 cmd & 1 rsp packet)
*/
! #define NRSPL2 0
! #define NCMDL2 0
! #define NRSP (1<<NRSPL2)
! #define NCMD (1<<NCMDL2)
#include "../pdpuba/tmscpreg.h"
#include "../pdp/tmscp.h"
#define NTMS 2
- #define TMSDENS(dev) ((minor(dev) >> 3) & 3) /* unused for now */
struct tmscpdevice *TMScsr[NTMS + 1] =
{
--- 50,63 ----
* Parameters for the communications area
* (Only 1 cmd & 1 rsp packet)
*/
! #define NRSPL2 0 /* Define these before including */
! #define NCMDL2 0 /* tmscpreg.h and tmscp.h below */
+ #include "sys/buf.h"
#include "../pdpuba/tmscpreg.h"
#include "../pdp/tmscp.h"
#define NTMS 2
struct tmscpdevice *TMScsr[NTMS + 1] =
{
***************
*** 68,78 ****
(struct tmscpdevice *)-1
};
! struct tmscp {
! struct tmscpca tmscp_ca;
! struct mscp tmscp_rsp;
! struct mscp tmscp_cmd;
! } tmscp[NTMS];
u_char tmsoffline[NTMS] = {1, 1}; /* Flag to prevent multiple STCON */
u_char tms_offline[NTMS][4] = {{1,1,1,1},
--- 66,72 ----
(struct tmscpdevice *)-1
};
! struct tmscp tmscp[NTMS];
u_char tmsoffline[NTMS] = {1, 1}; /* Flag to prevent multiple STCON */
u_char tms_offline[NTMS][4] = {{1,1,1,1},
***************
*** 144,150 ****
}
tmsoffline[ctlr] = 0;
}
! tms->tmscp_cmd.mscp_unit = unit;
/*
* Has this unit been issued an ONLIN?
*/
--- 138,144 ----
}
tmsoffline[ctlr] = 0;
}
! tms->tmscp_cmd[0].mscp_unit = unit;
/*
* Has this unit been issued an ONLIN?
*/
***************
*** 163,173 ****
* Skip forward the appropriate number of files on the tape.
*/
{
! tms->tmscp_cmd.mscp_tmkcnt = io->i_part;
! tms->tmscp_cmd.mscp_buffer_h = 0;
! tms->tmscp_cmd.mscp_bytecnt = 0;
tmscpcmd(ctlr, M_OP_REPOS, 0);
! tms->tmscp_cmd.mscp_tmkcnt = 0;
}
return(0);
}
--- 157,167 ----
* Skip forward the appropriate number of files on the tape.
*/
{
! tms->tmscp_cmd[0].mscp_tmkcnt = io->i_part;
! tms->tmscp_cmd[0].mscp_buffer_h = 0;
! tms->tmscp_cmd[0].mscp_bytecnt = 0;
tmscpcmd(ctlr, M_OP_REPOS, 0);
! tms->tmscp_cmd[0].mscp_tmkcnt = 0;
}
return(0);
}
***************
*** 180,189 ****
{
register struct tmscp *tms = &tmscp[io->i_ctlr];
! tms->tmscp_cmd.mscp_buffer_l = 0; /* tmkcnt */
! tms->tmscp_cmd.mscp_buffer_h = 0;
! tms->tmscp_cmd.mscp_bytecnt = 0;
! tms->tmscp_cmd.mscp_unit = io->i_unit;
tmscpcmd(io->i_ctlr, M_OP_REPOS, M_MD_REWND | M_MD_CLSEX);
}
--- 174,183 ----
{
register struct tmscp *tms = &tmscp[io->i_ctlr];
! tms->tmscp_cmd[0].mscp_buffer_l = 0; /* tmkcnt */
! tms->tmscp_cmd[0].mscp_buffer_h = 0;
! tms->tmscp_cmd[0].mscp_bytecnt = 0;
! tms->tmscp_cmd[0].mscp_unit = io->i_unit;
tmscpcmd(io->i_ctlr, M_OP_REPOS, M_MD_REWND | M_MD_CLSEX);
}
***************
*** 203,227 ****
/*
* Init cmd & rsp area
*/
! iomapadr(&tms->tmscp_cmd.mscp_cmdref, &bae, &lo16);
tms->tmscp_ca.ca_cmddsc[0].lsh = lo16;
tms->tmscp_ca.ca_cmddsc[0].hsh = bae;
! tms->tmscp_cmd.mscp_dscptr = (long *)tms->tmscp_ca.ca_cmddsc;
! tms->tmscp_cmd.mscp_header.tmscp_vcid = 1; /* for tape */
! iomapadr(&tms->tmscp_rsp.mscp_cmdref, &bae, &lo16);
tms->tmscp_ca.ca_rspdsc[0].lsh = lo16;
tms->tmscp_ca.ca_rspdsc[0].hsh = bae;
! tms->tmscp_rsp.mscp_dscptr = (long *)tms->tmscp_ca.ca_rspdsc;
! tms->tmscp_cmd.mscp_cntflgs = 0;
! tms->tmscp_cmd.mscp_opcode = op;
! tms->tmscp_cmd.mscp_modifier = mod;
! tms->tmscp_cmd.mscp_header.tmscp_msglen = mscp_msglen;
tms->tmscp_ca.ca_cmddsc[0].hsh |= TMSCP_OWN; /* | TMSCP_INT */
! tms->tmscp_rsp.mscp_header.tmscp_msglen = mscp_msglen;
tms->tmscp_ca.ca_rspdsc[0].hsh |= TMSCP_OWN; /* | TMSCP_INT */
! tms->tmscp_cmd.mscp_zzz2 = 0;
i = TMScsr[ctlr]->tmscpip;
for (;;)
--- 197,221 ----
/*
* Init cmd & rsp area
*/
! iomapadr(&tms->tmscp_cmd[0].mscp_cmdref, &bae, &lo16);
tms->tmscp_ca.ca_cmddsc[0].lsh = lo16;
tms->tmscp_ca.ca_cmddsc[0].hsh = bae;
! tms->tmscp_cmd[0].mscp_dscptr = (long *)tms->tmscp_ca.ca_cmddsc;
! tms->tmscp_cmd[0].mscp_header.tmscp_vcid = 1; /* for tape */
! iomapadr(&tms->tmscp_rsp[0].mscp_cmdref, &bae, &lo16);
tms->tmscp_ca.ca_rspdsc[0].lsh = lo16;
tms->tmscp_ca.ca_rspdsc[0].hsh = bae;
! tms->tmscp_rsp[0].mscp_dscptr = (long *)tms->tmscp_ca.ca_rspdsc;
! tms->tmscp_cmd[0].mscp_cntflgs = 0;
! tms->tmscp_cmd[0].mscp_opcode = op;
! tms->tmscp_cmd[0].mscp_modifier = mod;
! tms->tmscp_cmd[0].mscp_header.tmscp_msglen = mscp_msglen;
tms->tmscp_ca.ca_cmddsc[0].hsh |= TMSCP_OWN; /* | TMSCP_INT */
! tms->tmscp_rsp[0].mscp_header.tmscp_msglen = mscp_msglen;
tms->tmscp_ca.ca_rspdsc[0].hsh |= TMSCP_OWN; /* | TMSCP_INT */
! tms->tmscp_cmd[0].mscp_zzz2 = 0;
i = TMScsr[ctlr]->tmscpip;
for (;;)
***************
*** 248,254 ****
break;
}
tms->tmscp_ca.ca_rspint = 0;
! mp = &tms->tmscp_rsp;
if (mp->mscp_opcode != (op|M_OP_END) ||
(mp->mscp_status&M_ST_MASK) != M_ST_SUCC) {
/* Detect hitting tape mark. This signifies the end of the
--- 242,248 ----
break;
}
tms->tmscp_ca.ca_rspint = 0;
! mp = &tms->tmscp_rsp[0];
if (mp->mscp_opcode != (op|M_OP_END) ||
(mp->mscp_status&M_ST_MASK) != M_ST_SUCC) {
/* Detect hitting tape mark. This signifies the end of the
***************
*** 279,285 ****
register struct tmscp *tms = &tmscp[ctlr];
register struct mscp *mp;
! mp = &tms->tmscp_cmd;
mp->mscp_lbn_l = loint(io->i_bn);
mp->mscp_lbn_h = hiint(io->i_bn);
mp->mscp_unit = unit;
--- 273,279 ----
register struct tmscp *tms = &tmscp[ctlr];
register struct mscp *mp;
! mp = &tms->tmscp_cmd[0];
mp->mscp_lbn_l = loint(io->i_bn);
mp->mscp_lbn_h = hiint(io->i_bn);
mp->mscp_unit = unit;
***************
*** 314,323 ****
}
else
mod = 0;
! tms->tmscp_cmd.mscp_buffer_l = 0;
! tms->tmscp_cmd.mscp_buffer_h = 0;
! tms->tmscp_cmd.mscp_unit = io->i_unit;
! tms->tmscp_cmd.mscp_reccnt = space;
tmscpcmd(io->i_ctlr, M_OP_REPOS, mod | M_MD_OBJCT);
return(0);
}
--- 308,317 ----
}
else
mod = 0;
! tms->tmscp_cmd[0].mscp_buffer_l = 0;
! tms->tmscp_cmd[0].mscp_buffer_h = 0;
! tms->tmscp_cmd[0].mscp_unit = io->i_unit;
! tms->tmscp_cmd[0].mscp_reccnt = space;
tmscpcmd(io->i_ctlr, M_OP_REPOS, mod | M_MD_OBJCT);
return(0);
}
*** /VERSION.old Fri Dec 29 21:19:38 1995
--- /VERSION Sun Dec 31 12:11:36 1995
***************
*** 1,4 ****
! Current Patch Level: 287
2.11 BSD
============
--- 1,4 ----
! Current Patch Level: 288
2.11 BSD
============