[PATCH] uml: better error reporting for read_output
authorPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Fri, 24 Feb 2006 21:03:57 +0000 (13:03 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 24 Feb 2006 22:31:37 +0000 (14:31 -0800)
Do precise error handling: print precise error messages, distinguishing short
reads and read errors.  This functions fails frequently enough for me so I
bothered doing this fix.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Acked-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/um/drivers/net_user.c

index 098fa65981aba6404eb9422137466d39d5ffc38b..0e2f06187ea7a1b306370edd7ff9baf03c04958b 100644 (file)
@@ -47,10 +47,12 @@ void tap_check_ips(char *gate_addr, unsigned char *eth_addr)
        }
 }
 
+/* Do reliable error handling as this fails frequently enough. */
 void read_output(int fd, char *output, int len)
 {
-       int remain, n, actual;
+       int remain, ret, expected;
        char c;
+       char *str;
 
        if(output == NULL){
                output = &c;
@@ -58,23 +60,31 @@ void read_output(int fd, char *output, int len)
        }
                
        *output = '\0';
-       n = os_read_file(fd, &remain, sizeof(remain));
-       if(n != sizeof(remain)){
-               printk("read_output - read of length failed, err = %d\n", -n);
-               return;
+       ret = os_read_file(fd, &remain, sizeof(remain));
+
+       if (ret != sizeof(remain)) {
+               expected = sizeof(remain);
+               str = "length";
+               goto err;
        }
 
        while(remain != 0){
-               n = (remain < len) ? remain : len;
-               actual = os_read_file(fd, output, n);
-               if(actual != n){
-                       printk("read_output - read of data failed, "
-                              "err = %d\n", -actual);
-                       return;
+               expected = (remain < len) ? remain : len;
+               ret = os_read_file(fd, output, expected);
+               if (ret != expected) {
+                       str = "data";
+                       goto err;
                }
-               remain -= actual;
+               remain -= ret;
        }
+
        return;
+
+err:
+       if (ret < 0)
+               printk("read_output - read of %s failed, errno = %d\n", str, -ret);
+       else
+               printk("read_output - read of %s failed, read only %d of %d bytes\n", str, ret, expected);
 }
 
 int net_read(int fd, void *buf, int len)