diff -uprN -X dontdiff linux-2.6.7-vanilla/drivers/block/ll_rw_blk.c linux-2.6.7/drivers/block/ll_rw_blk.c --- linux-2.6.7-vanilla/drivers/block/ll_rw_blk.c 2004-06-16 07:18:58.000000000 +0200 +++ linux-2.6.7/drivers/block/ll_rw_blk.c 2004-07-02 10:40:46.499028784 +0200 @@ -1895,10 +1895,12 @@ void drive_stat_acct(struct request *rq, if (rw == READ) { disk_stat_add(rq->rq_disk, read_sectors, nr_sectors); + current->rblk += nr_sectors; if (!new_io) disk_stat_inc(rq->rq_disk, read_merges); } else if (rw == WRITE) { disk_stat_add(rq->rq_disk, write_sectors, nr_sectors); + current->wblk += nr_sectors; if (!new_io) disk_stat_inc(rq->rq_disk, write_merges); } diff -uprN -X dontdiff linux-2.6.7-vanilla/fs/read_write.c linux-2.6.7/fs/read_write.c --- linux-2.6.7-vanilla/fs/read_write.c 2004-06-16 07:19:37.000000000 +0200 +++ linux-2.6.7/fs/read_write.c 2004-07-02 10:34:34.475584944 +0200 @@ -281,6 +281,9 @@ asmlinkage ssize_t sys_read(unsigned int fput_light(file, fput_needed); } + if (ret > 0) + current->rchar++; + return ret; } EXPORT_SYMBOL_GPL(sys_read); @@ -297,6 +300,9 @@ asmlinkage ssize_t sys_write(unsigned in fput_light(file, fput_needed); } + if (ret > 0) + current->wchar++; + return ret; } @@ -519,6 +525,9 @@ sys_readv(unsigned long fd, const struct fput_light(file, fput_needed); } + if (ret > 0) + current->rchar++; + return ret; } @@ -535,6 +544,9 @@ sys_writev(unsigned long fd, const struc fput_light(file, fput_needed); } + if (ret > 0) + current->wchar++; + return ret; } diff -uprN -X dontdiff linux-2.6.7-vanilla/include/linux/sched.h linux-2.6.7/include/linux/sched.h --- linux-2.6.7-vanilla/include/linux/sched.h 2004-06-16 07:18:57.000000000 +0200 +++ linux-2.6.7/include/linux/sched.h 2004-07-02 10:22:02.329928464 +0200 @@ -459,6 +459,8 @@ struct task_struct { char comm[16]; /* file system info */ int link_count, total_link_count; +/* I/O info: chars read/written, blocks read/written */ + unsigned long rchar, wchar, rblk, wblk; /* ipc stuff */ struct sysv_sem sysvsem; /* CPU-specific state of this task */ diff -uprN -X dontdiff linux-2.6.7-vanilla/kernel/acct.c linux-2.6.7/kernel/acct.c --- linux-2.6.7-vanilla/kernel/acct.c 2004-06-16 07:19:35.000000000 +0200 +++ linux-2.6.7/kernel/acct.c 2004-07-02 10:42:45.136993072 +0200 @@ -376,8 +376,8 @@ static void do_acct_process(long exitcod } vsize = vsize / 1024; ac.ac_mem = encode_comp_t(vsize); - ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ - ac.ac_rw = encode_comp_t(ac.ac_io / 1024); + ac.ac_io = encode_comp_t(current->rchar + current->wchar); + ac.ac_rw = encode_comp_t(current->rblk + current->wblk); ac.ac_minflt = encode_comp_t(current->min_flt); ac.ac_majflt = encode_comp_t(current->maj_flt); ac.ac_swaps = encode_comp_t(0); diff -uprN -X dontdiff linux-2.6.7-vanilla/kernel/fork.c linux-2.6.7/kernel/fork.c --- linux-2.6.7-vanilla/kernel/fork.c 2004-06-16 07:18:57.000000000 +0200 +++ linux-2.6.7/kernel/fork.c 2004-07-02 10:28:03.661997640 +0200 @@ -960,6 +960,7 @@ struct task_struct *copy_process(unsigne p->utime = p->stime = 0; p->cutime = p->cstime = 0; + p->rchar = p->wchar = p->rblk = p->wblk = 0; p->lock_depth = -1; /* -1 = no lock */ p->start_time = get_jiffies_64(); p->security = NULL;