From: Jeff Dike This patch adds some errors and warnings where there were none before: If someone typos "ubd" as "udb", that is caught and a warning is printed If a ubd file can't be opened, that now results in an error message If there are more telnet connections to port consoles than there are consoles, then a message will appear in the telnet session explaining why there is no login prompt. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/drivers/port_kern.c | 23 ++++++++++++++++++++--- 25-akpm/arch/um/drivers/ubd_kern.c | 22 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff -puN arch/um/drivers/port_kern.c~uml-improve-error-reporting arch/um/drivers/port_kern.c --- 25/arch/um/drivers/port_kern.c~uml-improve-error-reporting 2005-03-07 22:16:24.000000000 -0800 +++ 25-akpm/arch/um/drivers/port_kern.c 2005-03-07 22:16:24.000000000 -0800 @@ -10,6 +10,7 @@ #include "linux/irq.h" #include "linux/spinlock.h" #include "linux/errno.h" +#include "asm/atomic.h" #include "asm/semaphore.h" #include "asm/errno.h" #include "kern_util.h" @@ -22,6 +23,7 @@ struct port_list { struct list_head list; + atomic_t wait_count; int has_connection; struct semaphore sem; int port; @@ -70,6 +72,13 @@ static irqreturn_t pipe_interrupt(int ir return(IRQ_HANDLED); } +#define NO_WAITER_MSG \ + "****\n" \ + "There are currently no UML consoles waiting for port connections.\n" \ + "Either disconnect from one to make it available or activate some more\n" \ + "by enabling more consoles in the UML /etc/inittab.\n" \ + "****\n" + static int port_accept(struct port_list *port) { struct connection *conn; @@ -104,6 +113,10 @@ static int port_accept(struct port_list goto out_free; } + if(atomic_read(&port->wait_count) == 0){ + os_write_file(fd, NO_WAITER_MSG, sizeof(NO_WAITER_MSG)); + printk("No one waiting for port\n"); + } list_add(&conn->list, &port->pending); return(1); @@ -182,6 +195,7 @@ void *port_data(int port_num) *port = ((struct port_list) { .list = LIST_HEAD_INIT(port->list), + .wait_count = ATOMIC_INIT(0), .has_connection = 0, .sem = __SEMAPHORE_INITIALIZER(port->sem, 0), @@ -220,9 +234,11 @@ int port_wait(void *data) struct port_list *port = dev->port; int fd; + atomic_inc(&port->wait_count); while(1){ + fd = -ERESTARTSYS; if(down_interruptible(&port->sem)) - return(-ERESTARTSYS); + goto out; spin_lock(&port->lock); @@ -254,8 +270,9 @@ int port_wait(void *data) dev->helper_pid = conn->helper_pid; dev->telnetd_pid = conn->telnetd_pid; kfree(conn); - - return(fd); + out: + atomic_dec(&port->wait_count); + return fd; } void port_remove_dev(void *d) diff -puN arch/um/drivers/ubd_kern.c~uml-improve-error-reporting arch/um/drivers/ubd_kern.c --- 25/arch/um/drivers/ubd_kern.c~uml-improve-error-reporting 2005-03-07 22:16:24.000000000 -0800 +++ 25-akpm/arch/um/drivers/ubd_kern.c 2005-03-07 22:16:24.000000000 -0800 @@ -453,6 +453,22 @@ __uml_help(ubd_setup, " an 's' will cause data to be written to disk on the host immediately.\n\n" ); +static int udb_setup(char *str) +{ + printk("udb%s specified on command line is almost certainly a ubd -> " + "udb TYPO\n", str); + return(1); +} + +__setup("udb", udb_setup); +__uml_help(udb_setup, +"udb\n" +" This option is here solely to catch ubd -> udb typos, which can be\n\n" +" to impossible to catch visually unless you specifically look for\n\n" +" them. The only result of any option starting with 'udb' is an error\n\n" +" in the boot output.\n\n" +); + static int fakehd_set = 0; static int fakehd(char *str) { @@ -605,7 +621,11 @@ static int ubd_open_dev(struct ubd *dev) } } - if(dev->fd < 0) return(dev->fd); + if(dev->fd < 0){ + printk("Failed to open '%s', errno = %d\n", dev->file, + -dev->fd); + return(dev->fd); + } if(dev->cow.file != NULL){ err = -ENOMEM; _