[4752] in Athena Bugs
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);