--- linux-2.4.23/include/linux/kernel_stat.h 2003-06-13 22:15:13.000000000 +0100 +++ linux-2.4.23-diskio/include/linux/kernel_stat.h 2003-11-29 12:50:55.000000000 +0000 @@ -12,18 +12,20 @@ * used by rstatd/perfmeter */ -#define DK_MAX_MAJOR 16 -#define DK_MAX_DISK 16 +#define DK_DISK_MAX 16 +#define DK_ARRAY 6 +#define DK_MAJOR 0 +#define DK_MINOR 1 +#define DK_RIO 2 +#define DK_RBLK 3 +#define DK_WIO 4 +#define DK_WBLK 5 struct kernel_stat { unsigned int per_cpu_user[NR_CPUS], per_cpu_nice[NR_CPUS], per_cpu_system[NR_CPUS]; - unsigned int dk_drive[DK_MAX_MAJOR][DK_MAX_DISK]; - unsigned int dk_drive_rio[DK_MAX_MAJOR][DK_MAX_DISK]; - unsigned int dk_drive_wio[DK_MAX_MAJOR][DK_MAX_DISK]; - unsigned int dk_drive_rblk[DK_MAX_MAJOR][DK_MAX_DISK]; - unsigned int dk_drive_wblk[DK_MAX_MAJOR][DK_MAX_DISK]; + unsigned int dk_drive[DK_DISK_MAX][DK_ARRAY]; unsigned int pgpgin, pgpgout; unsigned int pswpin, pswpout; #if defined (__hppa__) --- linux-2.4.23/include/linux/genhd.h 2002-12-02 12:41:11.000000000 +0000 +++ linux-2.4.23-diskio/include/linux/genhd.h 2003-11-29 12:50:55.000000000 +0000 @@ -294,19 +294,56 @@ unsigned int index; switch (major) { - case DAC960_MAJOR+0: +#ifdef CONFIG_BLK_DEV_DAC960 + case DAC960_MAJOR: + case DAC960_MAJOR1: + case DAC960_MAJOR2: + case DAC960_MAJOR3: + case DAC960_MAJOR4: + case DAC960_MAJOR5: + case DAC960_MAJOR6: + case DAC960_MAJOR7: index = (minor & 0x00f8) >> 3; break; +#endif +#ifdef CONFIG_BLK_CPQ_DA + case COMPAQ_SMART2_MAJOR: + case COMPAQ_SMART2_MAJOR1: + case COMPAQ_SMART2_MAJOR2: + case COMPAQ_SMART2_MAJOR3: + case COMPAQ_SMART2_MAJOR4: + case COMPAQ_SMART2_MAJOR5: + case COMPAQ_SMART2_MAJOR6: + case COMPAQ_SMART2_MAJOR7: +#endif +#ifdef CONFIG_BLK_CPQ_CISS_DA + case COMPAQ_CISS_MAJOR: + case COMPAQ_CISS_MAJOR1: + case COMPAQ_CISS_MAJOR2: + case COMPAQ_CISS_MAJOR3: + case COMPAQ_CISS_MAJOR4: + case COMPAQ_CISS_MAJOR5: + case COMPAQ_CISS_MAJOR6: + case COMPAQ_CISS_MAJOR7: +#endif case SCSI_DISK0_MAJOR: index = (minor & 0x00f0) >> 4; break; + case SCSI_CDROM_MAJOR: + case SCSI_GENERIC_MAJOR: + case MD_MAJOR: + case FLOPPY_MAJOR: + index = (minor & 0x000f); + break; case IDE0_MAJOR: /* same as HD_MAJOR */ + case IDE1_MAJOR: + case IDE2_MAJOR: + case IDE3_MAJOR: + case IDE4_MAJOR: + case IDE5_MAJOR: case XT_DISK_MAJOR: index = (minor & 0x0040) >> 6; break; - case IDE1_MAJOR: - index = ((minor & 0x0040) >> 6) + 2; - break; default: return 0; } --- linux-2.4.23/include/linux/major.h 2003-06-13 22:15:13.000000000 +0100 +++ linux-2.4.23-diskio/include/linux/major.h 2003-11-29 12:50:55.000000000 +0000 @@ -78,7 +78,16 @@ #define DDV_MAJOR 39 /* AP1000 DDV block device */ #define NBD_MAJOR 43 /* Network block device */ #define RISCOM8_NORMAL_MAJOR 48 -#define DAC960_MAJOR 48 /* 48..55 */ + +#define DAC960_MAJOR 48 +#define DAC960_MAJOR1 49 +#define DAC960_MAJOR2 50 +#define DAC960_MAJOR3 51 +#define DAC960_MAJOR4 52 +#define DAC960_MAJOR5 53 +#define DAC960_MAJOR6 54 +#define DAC960_MAJOR7 55 + #define RISCOM8_CALLOUT_MAJOR 49 #define MKISS_MAJOR 55 #define DSP56K_MAJOR 55 /* DSP56001 processor device */ --- linux-2.4.23/fs/proc/proc_misc.c 2003-11-28 21:27:28.000000000 +0000 +++ linux-2.4.23-diskio/fs/proc/proc_misc.c 2003-11-29 12:50:55.000000000 +0000 @@ -310,7 +310,6 @@ extern unsigned long total_forks; unsigned long jif = jiffies; unsigned int sum = 0, user = 0, nice = 0, system = 0; - int major, disk; for (i = 0 ; i < smp_num_cpus; i++) { int cpu = cpu_logical_map(i), j; @@ -355,22 +354,20 @@ proc_sprintf(page, &off, &len, "\ndisk_io: "); - for (major = 0; major < DK_MAX_MAJOR; major++) { - for (disk = 0; disk < DK_MAX_DISK; disk++) { - int active = kstat.dk_drive[major][disk] + - kstat.dk_drive_rblk[major][disk] + - kstat.dk_drive_wblk[major][disk]; - if (active) - proc_sprintf(page, &off, &len, - "(%u,%u):(%u,%u,%u,%u,%u) ", - major, disk, - kstat.dk_drive[major][disk], - kstat.dk_drive_rio[major][disk], - kstat.dk_drive_rblk[major][disk], - kstat.dk_drive_wio[major][disk], - kstat.dk_drive_wblk[major][disk] + for (i = 0; i < DK_DISK_MAX; i++) { + if (kstat.dk_drive[i][DK_MAJOR]) { + proc_sprintf(page, &off, &len, + "(%u,%u):(%u,%u,%u,%u,%u) ", + kstat.dk_drive[i][DK_MAJOR], + kstat.dk_drive[i][DK_MINOR], + kstat.dk_drive[i][DK_RIO] + kstat.dk_drive[i][DK_WIO], + kstat.dk_drive[i][DK_RIO], + kstat.dk_drive[i][DK_RBLK], + kstat.dk_drive[i][DK_WIO], + kstat.dk_drive[i][DK_WBLK] ); - } + } else + break; } proc_sprintf(page, &off, &len, --- linux-2.4.23/drivers/block/ll_rw_blk.c 2003-11-28 21:27:25.000000000 +0000 +++ linux-2.4.23-diskio/drivers/block/ll_rw_blk.c 2003-11-29 12:50:55.000000000 +0000 @@ -696,20 +696,27 @@ { unsigned int major = MAJOR(dev); unsigned int index; + int i; index = disk_index(dev); - if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR)) - return; - kstat.dk_drive[major][index] += new_io; - if (rw == READ) { - kstat.dk_drive_rio[major][index] += new_io; - kstat.dk_drive_rblk[major][index] += nr_sectors; - } else if (rw == WRITE) { - kstat.dk_drive_wio[major][index] += new_io; - kstat.dk_drive_wblk[major][index] += nr_sectors; - } else - printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n"); + for (i = 0; i < DK_DISK_MAX; i++){ + if (kstat.dk_drive[i][DK_MAJOR] == major && kstat.dk_drive[i][DK_MINOR] == index) { + if (rw == READ) { + kstat.dk_drive[i][DK_RIO] += new_io; + kstat.dk_drive[i][DK_RBLK] += nr_sectors; + } else if (rw == WRITE) { + kstat.dk_drive[i][DK_WIO] += new_io; + kstat.dk_drive[i][DK_WBLK] += nr_sectors; + } else + printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n"); + break; + } else if (kstat.dk_drive[i][DK_MAJOR] == 0) { + kstat.dk_drive[i][DK_MAJOR] = major; + kstat.dk_drive[i][DK_MINOR] = index; + i--; + } + } } #ifdef CONFIG_BLK_STATS --- linux-2.4.23/drivers/md/md.c 2003-08-27 16:44:08.000000000 +0100 +++ linux-2.4.23-diskio/drivers/md/md.c 2003-11-29 12:50:55.000000000 +0000 @@ -3357,40 +3357,46 @@ return NULL; } -static unsigned int sync_io[DK_MAX_MAJOR][DK_MAX_DISK]; +static unsigned int sync_io[DK_DISK_MAX]; void md_sync_acct(kdev_t dev, unsigned long nr_sectors) { unsigned int major = MAJOR(dev); unsigned int index; + int i; index = disk_index(dev); - if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR)) - return; - sync_io[major][index] += nr_sectors; + for (i = 0; i < DK_DISK_MAX && kstat.dk_drive[i][DK_MAJOR] != 0; i++) { + if (kstat.dk_drive[i][DK_MAJOR] == major && kstat.dk_drive[i][DK_MINOR] == index) { + sync_io[i] += nr_sectors; + break; + } + } } static int is_mddev_idle(mddev_t *mddev) { mdk_rdev_t * rdev; struct md_list_head *tmp; - int idle; unsigned long curr_events; + unsigned int major; + unsigned int index; + int i, idle = 1; - idle = 1; ITERATE_RDEV(mddev,rdev,tmp) { - int major = MAJOR(rdev->dev); - int idx = disk_index(rdev->dev); + major = MAJOR(rdev->dev); + index = disk_index(rdev->dev); - if ((idx >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR)) - continue; - - curr_events = kstat.dk_drive_rblk[major][idx] + - kstat.dk_drive_wblk[major][idx] ; - curr_events -= sync_io[major][idx]; - if ((curr_events - rdev->last_events) > 32) { - rdev->last_events = curr_events; - idle = 0; + for (i = 0; i < DK_DISK_MAX && kstat.dk_drive[i][DK_MAJOR] != 0; i++) { + if (kstat.dk_drive[i][DK_MAJOR] == major && kstat.dk_drive[i][DK_MINOR] == index) { + curr_events = kstat.dk_drive[i][DK_RBLK] + kstat.dk_drive[i][DK_WBLK]; + curr_events -= sync_io[i]; + if ((curr_events - rdev->last_events) > 32) { + rdev->last_events = curr_events; + idle = 0; + } + break; + } } } return idle;