Commit 34dffb15 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] uml: Improve error reporting

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: default avatarJeff Dike <jdike@addtoit.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f635699f
......@@ -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 irq, void *data, struct pt_regs *regs)
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 *port)
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)
......
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment