[4752] in Athena Bugs

home help back first fref pref prev next nref lref last post

iostat should do unsigned math

daemon@ATHENA.MIT.EDU (John Carr)
Fri Apr 13 03:57:40 1990

To: bugs@ATHENA.MIT.EDU
Cc: dkk@ATHENA.MIT.EDU
Date: Fri, 13 Apr 90 03:57:21 EDT
From: John Carr <jfc@ATHENA.MIT.EDU>

Some of our servers have been up long enough such that the variables in
which disk statistics are kept have exceeded 2^31 - 1.  iostat treats these
variables as signed integers, so it can print negative average transfer
rates.  Here is a fix (I have tested this):

*** /source/bsd-4.3/vax/usr.bin/iostat/iostat.c	Fri Apr 26 00:27:25 1985
--- iostat.c	Fri Apr 13 03:51:24 1990
***************
*** 62,74 ****
  
  struct {
  	int	dk_busy;
! 	long	cp_time[CPUSTATES];
! 	long	*dk_time;
! 	long	*dk_wds;
! 	long	*dk_seek;
! 	long	*dk_xfer;
! 	long	tk_nin;
! 	long	tk_nout;
  } s, s1;
  
  int	mf;
--- 62,74 ----
  
  struct {
  	int	dk_busy;
! 	unsigned long	cp_time[CPUSTATES];
! 	unsigned long	*dk_time;
! 	unsigned long	*dk_wds;
! 	unsigned long	*dk_seek;
! 	unsigned long	*dk_xfer;
! 	unsigned long	tk_nin;
! 	unsigned long	tk_nout;
  } s, s1;
  
  int	mf;
***************
*** 117,126 ****
  #define	allocate(e, t) \
      s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
      s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
! 	allocate(dk_time, long);
! 	allocate(dk_wds, long);
! 	allocate(dk_seek, long);
! 	allocate(dk_xfer, long);
  	for (arg = buf, i = 0; i < dk_ndrive; i++) {
  		dr_name[i] = arg;
  		sprintf(dr_name[i], "dk%d", i);
--- 117,126 ----
  #define	allocate(e, t) \
      s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
      s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
! 	allocate(dk_time, unsigned long);
! 	allocate(dk_wds, unsigned long);
! 	allocate(dk_seek, unsigned long);
! 	allocate(dk_xfer, unsigned long);
  	for (arg = buf, i = 0; i < dk_ndrive; i++) {
  		dr_name[i] = arg;
  		sprintf(dr_name[i], "dk%d", i);


home help back first fref pref prev next nref lref last post