diff options
Diffstat (limited to 'arch/um/drivers')
-rw-r--r-- | arch/um/drivers/chan_kern.c | 12 | ||||
-rw-r--r-- | arch/um/drivers/daemon_user.c | 17 | ||||
-rw-r--r-- | arch/um/drivers/line.c | 6 | ||||
-rw-r--r-- | arch/um/drivers/mcast_user.c | 10 | ||||
-rw-r--r-- | arch/um/drivers/mconsole_kern.c | 3 | ||||
-rw-r--r-- | arch/um/drivers/ssl.c | 2 | ||||
-rw-r--r-- | arch/um/drivers/stdio_console.c | 2 | ||||
-rw-r--r-- | arch/um/drivers/ubd_kern.c | 13 |
8 files changed, 39 insertions, 26 deletions
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index 7b8baf146acc..9fdfad649536 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c | |||
@@ -236,11 +236,11 @@ void free_irqs(void) | |||
236 | struct chan *chan; | 236 | struct chan *chan; |
237 | LIST_HEAD(list); | 237 | LIST_HEAD(list); |
238 | struct list_head *ele; | 238 | struct list_head *ele; |
239 | unsigned long flags; | ||
239 | 240 | ||
240 | spin_lock_irq(&irqs_to_free_lock); | 241 | spin_lock_irqsave(&irqs_to_free_lock, flags); |
241 | list_splice_init(&irqs_to_free, &list); | 242 | list_splice_init(&irqs_to_free, &list); |
242 | INIT_LIST_HEAD(&irqs_to_free); | 243 | spin_unlock_irqrestore(&irqs_to_free_lock, flags); |
243 | spin_unlock_irq(&irqs_to_free_lock); | ||
244 | 244 | ||
245 | list_for_each(ele, &list){ | 245 | list_for_each(ele, &list){ |
246 | chan = list_entry(ele, struct chan, free_list); | 246 | chan = list_entry(ele, struct chan, free_list); |
@@ -255,13 +255,15 @@ void free_irqs(void) | |||
255 | 255 | ||
256 | static void close_one_chan(struct chan *chan, int delay_free_irq) | 256 | static void close_one_chan(struct chan *chan, int delay_free_irq) |
257 | { | 257 | { |
258 | unsigned long flags; | ||
259 | |||
258 | if(!chan->opened) | 260 | if(!chan->opened) |
259 | return; | 261 | return; |
260 | 262 | ||
261 | if(delay_free_irq){ | 263 | if(delay_free_irq){ |
262 | spin_lock_irq(&irqs_to_free_lock); | 264 | spin_lock_irqsave(&irqs_to_free_lock, flags); |
263 | list_add(&chan->free_list, &irqs_to_free); | 265 | list_add(&chan->free_list, &irqs_to_free); |
264 | spin_unlock_irq(&irqs_to_free_lock); | 266 | spin_unlock_irqrestore(&irqs_to_free_lock, flags); |
265 | } | 267 | } |
266 | else { | 268 | else { |
267 | if(chan->input) | 269 | if(chan->input) |
diff --git a/arch/um/drivers/daemon_user.c b/arch/um/drivers/daemon_user.c index 310af0f1e49e..021b82c7a759 100644 --- a/arch/um/drivers/daemon_user.c +++ b/arch/um/drivers/daemon_user.c | |||
@@ -56,30 +56,31 @@ static int connect_to_switch(struct daemon_data *pri) | |||
56 | 56 | ||
57 | pri->control = socket(AF_UNIX, SOCK_STREAM, 0); | 57 | pri->control = socket(AF_UNIX, SOCK_STREAM, 0); |
58 | if(pri->control < 0){ | 58 | if(pri->control < 0){ |
59 | err = -errno; | ||
59 | printk("daemon_open : control socket failed, errno = %d\n", | 60 | printk("daemon_open : control socket failed, errno = %d\n", |
60 | errno); | 61 | -err); |
61 | return(-errno); | 62 | return err; |
62 | } | 63 | } |
63 | 64 | ||
64 | if(connect(pri->control, (struct sockaddr *) ctl_addr, | 65 | if(connect(pri->control, (struct sockaddr *) ctl_addr, |
65 | sizeof(*ctl_addr)) < 0){ | 66 | sizeof(*ctl_addr)) < 0){ |
66 | printk("daemon_open : control connect failed, errno = %d\n", | ||
67 | errno); | ||
68 | err = -errno; | 67 | err = -errno; |
68 | printk("daemon_open : control connect failed, errno = %d\n", | ||
69 | -err); | ||
69 | goto out; | 70 | goto out; |
70 | } | 71 | } |
71 | 72 | ||
72 | fd = socket(AF_UNIX, SOCK_DGRAM, 0); | 73 | fd = socket(AF_UNIX, SOCK_DGRAM, 0); |
73 | if(fd < 0){ | 74 | if(fd < 0){ |
74 | printk("daemon_open : data socket failed, errno = %d\n", | ||
75 | errno); | ||
76 | err = -errno; | 75 | err = -errno; |
76 | printk("daemon_open : data socket failed, errno = %d\n", | ||
77 | -err); | ||
77 | goto out; | 78 | goto out; |
78 | } | 79 | } |
79 | if(bind(fd, (struct sockaddr *) local_addr, sizeof(*local_addr)) < 0){ | 80 | if(bind(fd, (struct sockaddr *) local_addr, sizeof(*local_addr)) < 0){ |
80 | printk("daemon_open : data bind failed, errno = %d\n", | ||
81 | errno); | ||
82 | err = -errno; | 81 | err = -errno; |
82 | printk("daemon_open : data bind failed, errno = %d\n", | ||
83 | -err); | ||
83 | goto out_close; | 84 | goto out_close; |
84 | } | 85 | } |
85 | 86 | ||
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index 01d4ab6b0ef1..f75d7b05c481 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c | |||
@@ -370,10 +370,10 @@ static irqreturn_t line_write_interrupt(int irq, void *data) | |||
370 | struct tty_struct *tty = line->tty; | 370 | struct tty_struct *tty = line->tty; |
371 | int err; | 371 | int err; |
372 | 372 | ||
373 | /* Interrupts are enabled here because we registered the interrupt with | 373 | /* Interrupts are disabled here because we registered the interrupt with |
374 | * IRQF_DISABLED (see line_setup_irq).*/ | 374 | * IRQF_DISABLED (see line_setup_irq).*/ |
375 | 375 | ||
376 | spin_lock_irq(&line->lock); | 376 | spin_lock(&line->lock); |
377 | err = flush_buffer(line); | 377 | err = flush_buffer(line); |
378 | if (err == 0) { | 378 | if (err == 0) { |
379 | return IRQ_NONE; | 379 | return IRQ_NONE; |
@@ -381,7 +381,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data) | |||
381 | line->head = line->buffer; | 381 | line->head = line->buffer; |
382 | line->tail = line->buffer; | 382 | line->tail = line->buffer; |
383 | } | 383 | } |
384 | spin_unlock_irq(&line->lock); | 384 | spin_unlock(&line->lock); |
385 | 385 | ||
386 | if(tty == NULL) | 386 | if(tty == NULL) |
387 | return IRQ_NONE; | 387 | return IRQ_NONE; |
diff --git a/arch/um/drivers/mcast_user.c b/arch/um/drivers/mcast_user.c index 8138f5ea1bf7..b827e82884c9 100644 --- a/arch/um/drivers/mcast_user.c +++ b/arch/um/drivers/mcast_user.c | |||
@@ -50,6 +50,14 @@ static void mcast_user_init(void *data, void *dev) | |||
50 | pri->dev = dev; | 50 | pri->dev = dev; |
51 | } | 51 | } |
52 | 52 | ||
53 | static void mcast_remove(void *data) | ||
54 | { | ||
55 | struct mcast_data *pri = data; | ||
56 | |||
57 | kfree(pri->mcast_addr); | ||
58 | pri->mcast_addr = NULL; | ||
59 | } | ||
60 | |||
53 | static int mcast_open(void *data) | 61 | static int mcast_open(void *data) |
54 | { | 62 | { |
55 | struct mcast_data *pri = data; | 63 | struct mcast_data *pri = data; |
@@ -157,7 +165,7 @@ const struct net_user_info mcast_user_info = { | |||
157 | .init = mcast_user_init, | 165 | .init = mcast_user_init, |
158 | .open = mcast_open, | 166 | .open = mcast_open, |
159 | .close = mcast_close, | 167 | .close = mcast_close, |
160 | .remove = NULL, | 168 | .remove = mcast_remove, |
161 | .set_mtu = mcast_set_mtu, | 169 | .set_mtu = mcast_set_mtu, |
162 | .add_address = NULL, | 170 | .add_address = NULL, |
163 | .delete_address = NULL, | 171 | .delete_address = NULL, |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 178b2eff4a8c..65ad2932672c 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -615,6 +615,9 @@ void mconsole_remove(struct mc_request *req) | |||
615 | err_msg = NULL; | 615 | err_msg = NULL; |
616 | err = (*dev->remove)(n, &err_msg); | 616 | err = (*dev->remove)(n, &err_msg); |
617 | switch(err){ | 617 | switch(err){ |
618 | case 0: | ||
619 | err_msg = ""; | ||
620 | break; | ||
618 | case -ENODEV: | 621 | case -ENODEV: |
619 | if(err_msg == NULL) | 622 | if(err_msg == NULL) |
620 | err_msg = "Device doesn't exist"; | 623 | err_msg = "Device doesn't exist"; |
diff --git a/arch/um/drivers/ssl.c b/arch/um/drivers/ssl.c index fc22b9bd9153..4b382a6e710f 100644 --- a/arch/um/drivers/ssl.c +++ b/arch/um/drivers/ssl.c | |||
@@ -179,7 +179,7 @@ static struct console ssl_cons = { | |||
179 | .write = ssl_console_write, | 179 | .write = ssl_console_write, |
180 | .device = ssl_console_device, | 180 | .device = ssl_console_device, |
181 | .setup = ssl_console_setup, | 181 | .setup = ssl_console_setup, |
182 | .flags = CON_PRINTBUFFER, | 182 | .flags = CON_PRINTBUFFER|CON_ANYTIME, |
183 | .index = -1, | 183 | .index = -1, |
184 | }; | 184 | }; |
185 | 185 | ||
diff --git a/arch/um/drivers/stdio_console.c b/arch/um/drivers/stdio_console.c index 7ff0b0fc37e7..76d1f1c980ef 100644 --- a/arch/um/drivers/stdio_console.c +++ b/arch/um/drivers/stdio_console.c | |||
@@ -153,7 +153,7 @@ static struct console stdiocons = { | |||
153 | .write = uml_console_write, | 153 | .write = uml_console_write, |
154 | .device = uml_console_device, | 154 | .device = uml_console_device, |
155 | .setup = uml_console_setup, | 155 | .setup = uml_console_setup, |
156 | .flags = CON_PRINTBUFFER, | 156 | .flags = CON_PRINTBUFFER|CON_ANYTIME, |
157 | .index = -1, | 157 | .index = -1, |
158 | }; | 158 | }; |
159 | 159 | ||
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index f98d26e51381..8bd9204ac1ab 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -109,10 +109,6 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data) | |||
109 | 109 | ||
110 | static DEFINE_MUTEX(ubd_lock); | 110 | static DEFINE_MUTEX(ubd_lock); |
111 | 111 | ||
112 | /* XXX - this made sense in 2.4 days, now it's only used as a boolean, and | ||
113 | * probably it doesn't make sense even for that. */ | ||
114 | static int do_ubd; | ||
115 | |||
116 | static int ubd_open(struct inode * inode, struct file * filp); | 112 | static int ubd_open(struct inode * inode, struct file * filp); |
117 | static int ubd_release(struct inode * inode, struct file * file); | 113 | static int ubd_release(struct inode * inode, struct file * file); |
118 | static int ubd_ioctl(struct inode * inode, struct file * file, | 114 | static int ubd_ioctl(struct inode * inode, struct file * file, |
@@ -169,6 +165,7 @@ struct ubd { | |||
169 | struct platform_device pdev; | 165 | struct platform_device pdev; |
170 | struct request_queue *queue; | 166 | struct request_queue *queue; |
171 | spinlock_t lock; | 167 | spinlock_t lock; |
168 | int active; | ||
172 | }; | 169 | }; |
173 | 170 | ||
174 | #define DEFAULT_COW { \ | 171 | #define DEFAULT_COW { \ |
@@ -190,6 +187,7 @@ struct ubd { | |||
190 | .shared = 0, \ | 187 | .shared = 0, \ |
191 | .cow = DEFAULT_COW, \ | 188 | .cow = DEFAULT_COW, \ |
192 | .lock = SPIN_LOCK_UNLOCKED, \ | 189 | .lock = SPIN_LOCK_UNLOCKED, \ |
190 | .active = 0, \ | ||
193 | } | 191 | } |
194 | 192 | ||
195 | /* Protected by ubd_lock */ | 193 | /* Protected by ubd_lock */ |
@@ -507,7 +505,6 @@ static void ubd_handler(void) | |||
507 | struct ubd *dev; | 505 | struct ubd *dev; |
508 | int n; | 506 | int n; |
509 | 507 | ||
510 | do_ubd = 0; | ||
511 | n = os_read_file(thread_fd, &req, sizeof(req)); | 508 | n = os_read_file(thread_fd, &req, sizeof(req)); |
512 | if(n != sizeof(req)){ | 509 | if(n != sizeof(req)){ |
513 | printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " | 510 | printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " |
@@ -517,6 +514,7 @@ static void ubd_handler(void) | |||
517 | 514 | ||
518 | rq = req.req; | 515 | rq = req.req; |
519 | dev = rq->rq_disk->private_data; | 516 | dev = rq->rq_disk->private_data; |
517 | dev->active = 0; | ||
520 | 518 | ||
521 | ubd_finish(rq, req.error); | 519 | ubd_finish(rq, req.error); |
522 | reactivate_fd(thread_fd, UBD_IRQ); | 520 | reactivate_fd(thread_fd, UBD_IRQ); |
@@ -1081,11 +1079,12 @@ static void do_ubd_request(request_queue_t *q) | |||
1081 | } | 1079 | } |
1082 | } | 1080 | } |
1083 | else { | 1081 | else { |
1084 | if(do_ubd || (req = elv_next_request(q)) == NULL) | 1082 | struct ubd *dev = q->queuedata; |
1083 | if(dev->active || (req = elv_next_request(q)) == NULL) | ||
1085 | return; | 1084 | return; |
1086 | err = prepare_request(req, &io_req); | 1085 | err = prepare_request(req, &io_req); |
1087 | if(!err){ | 1086 | if(!err){ |
1088 | do_ubd = 1; | 1087 | dev->active = 1; |
1089 | n = os_write_file(thread_fd, (char *) &io_req, | 1088 | n = os_write_file(thread_fd, (char *) &io_req, |
1090 | sizeof(io_req)); | 1089 | sizeof(io_req)); |
1091 | if(n != sizeof(io_req)) | 1090 | if(n != sizeof(io_req)) |