Hello Linus,

Below is patch (for 2.4.6, 2.4.5)
to add support /proc/null - a counter for /dev/null's write traffic

Why not ? Some time it shows very ineteresting things.
For example - Mozilla write 22Mb to /dev/null just at start.

Was tested for two weeks on Intel-platfom with help of my friends.

--- drivers/char/mem.c.orig     Thu Jul  5 14:22:28 2001
+++ drivers/char/mem.c  Thu Jul  5 14:22:39 2001
@@ -3,6 +3,21 @@
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
  *
+ *  Added /proc/null support.
+ *    Jun-25-2001, Pavel Yakovlev <[EMAIL PROTECTED]>
+ *
+ *   About:
+ *
+ *    /proc/null - counter for /dev/null's write traffic
+ *    A counter is 4 * unsigned long width (4 is default, configured by 
+WRITE_NULL_LEN)
+ *
+ *   Usage:
+ *
+ *    echo 0 >/proc/null - reset to 0
+ *
+ *    bc </proc/null - bytes writed to /dev/null
+ *
+ *
  *  Added devfs support. 
  *    Jan-11-1998, C. Scott Ananian <[EMAIL PROTECTED]>
  *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <[EMAIL PROTECTED]>
@@ -21,6 +36,7 @@
 #include <linux/raw.h>
 #include <linux/tty.h>
 #include <linux/capability.h>
+#include <linux/proc_fs.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -336,9 +352,65 @@
        return 0;
 }
 
+
+
+typedef unsigned long wnc_t;
+
+#define WRITE_NULL_LEN 4
+static wnc_t write_null_count[WRITE_NULL_LEN];
+
 static ssize_t write_null(struct file * file, const char * buf,
                          size_t count, loff_t *ppos)
 {
+       wnc_t old_val;
+       int i;
+       
+       old_val = write_null_count[0];
+       if ((write_null_count[0] += count) < old_val) {
+           for ( i = 1; i < WRITE_NULL_LEN; i++) {
+               old_val = write_null_count[i];
+               if (++write_null_count[i] > old_val)
+                   break;
+
+           }
+           if (i == WRITE_NULL_LEN)
+               printk("/dev/null overflow ;)\n");
+       }
+        
+       return count;
+}
+
+static int null_proc_read(char *buf, char **start, off_t offset,
+                         int count, int *eof, void *data)
+{
+       int len = 0;
+       int i;
+
+       for ( i = 0; i < WRITE_NULL_LEN; i++) {
+           len += sprintf(buf+len,"%lu  
+*2^%i+\\\n",write_null_count[i],i*sizeof(wnc_t)*8);
+       }
+       len += sprintf(buf+len,"0\n");
+  
+ /* from fs/proc/proc_misc.c::proc_calc_metric() */
+ 
+       if (len <= offset+count) *eof = 1;
+       *start = buf + offset;
+       len -= offset;
+       if (len>count) len = count;
+       if (len<0) len = 0;
+       return len;
+ 
+ /* end from ... */
+}
+
+static int null_proc_write(struct file *file, const char *buf,
+                           unsigned long count, void *data)
+{
+       int i;
+       for ( i = 0; i < WRITE_NULL_LEN; i++) {
+           write_null_count[i] = 0;
+       }
+
        return count;
 }
 
@@ -434,6 +506,12 @@
        return written ? written : -EFAULT;
 }
 
+static ssize_t write_zero(struct file * file, const char * buf,
+                         size_t count, loff_t *ppos)
+{
+       return count;
+}
+
 static int mmap_zero(struct file * file, struct vm_area_struct * vma)
 {
        if (vma->vm_flags & VM_SHARED)
@@ -490,7 +568,6 @@
 #define mmap_kmem      mmap_mem
 #define zero_lseek     null_lseek
 #define full_lseek      null_lseek
-#define write_zero     write_null
 #define read_full       read_zero
 #define open_mem       open_port
 #define open_kmem      open_mem
@@ -609,6 +686,13 @@
 
 int __init chr_dev_init(void)
 {
+       struct proc_dir_entry *ent =  create_proc_entry("null", S_IRUGO | S_IWUSR | 
+S_IWGRP, NULL);
+       if (ent) {
+           ent->read_proc = &null_proc_read;
+           ent->write_proc = &null_proc_write;
+       } else 
+           printk("unable to create /proc/null read entry\n");
+
        if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))
                printk("unable to get major %d for memory devs\n", MEM_MAJOR);
        memory_devfs_register();  

--------------------------------------
Павел Яковлев
mailto: [EMAIL PROTECTED] ICQ 8085803 PPY-RIPN
технический директор
ЗАО "Интернет-Проекты"
--------------------------------------
"God is real, unless declared integer"


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to