aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2012-04-02 07:54:23 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-04-09 14:28:18 -0400
commit0146b6939074ebe14ece3604fd00e7be128a3812 (patch)
tree4dba1ecf72b9a2af168e9e6a71b156344307ca2f /drivers/tty
parent85bbc003b24335e253a392f6a9874103b77abb36 (diff)
TTY: HVC, use count from tty_port
Now, count is used from tty_port and protected by tty_port->lock. n_outbuf is left unprotected in hvc_hangup now, because there is no point to hold any lock, since other uses are unprotected too. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: linuxppc-dev@lists.ozlabs.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/hvc/hvc_console.c40
-rw-r--r--drivers/tty/hvc/hvc_console.h1
2 files changed, 21 insertions, 20 deletions
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 92b7f5d5441f..6c45cbf3fc91 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -313,18 +313,18 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
313 if (!(hp = hvc_get_by_index(tty->index))) 313 if (!(hp = hvc_get_by_index(tty->index)))
314 return -ENODEV; 314 return -ENODEV;
315 315
316 spin_lock_irqsave(&hp->lock, flags); 316 spin_lock_irqsave(&hp->port.lock, flags);
317 /* Check and then increment for fast path open. */ 317 /* Check and then increment for fast path open. */
318 if (hp->count++ > 0) { 318 if (hp->port.count++ > 0) {
319 spin_unlock_irqrestore(&hp->port.lock, flags);
320 /* FIXME why taking a reference here? */
319 tty_kref_get(tty); 321 tty_kref_get(tty);
320 spin_unlock_irqrestore(&hp->lock, flags);
321 hvc_kick(); 322 hvc_kick();
322 return 0; 323 return 0;
323 } /* else count == 0 */ 324 } /* else count == 0 */
325 spin_unlock_irqrestore(&hp->port.lock, flags);
324 326
325 tty->driver_data = hp; 327 tty->driver_data = hp;
326 spin_unlock_irqrestore(&hp->lock, flags);
327
328 tty_port_tty_set(&hp->port, tty); 328 tty_port_tty_set(&hp->port, tty);
329 329
330 if (hp->ops->notifier_add) 330 if (hp->ops->notifier_add)
@@ -367,10 +367,10 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
367 367
368 hp = tty->driver_data; 368 hp = tty->driver_data;
369 369
370 spin_lock_irqsave(&hp->lock, flags); 370 spin_lock_irqsave(&hp->port.lock, flags);
371 371
372 if (--hp->count == 0) { 372 if (--hp->port.count == 0) {
373 spin_unlock_irqrestore(&hp->lock, flags); 373 spin_unlock_irqrestore(&hp->port.lock, flags);
374 /* We are done with the tty pointer now. */ 374 /* We are done with the tty pointer now. */
375 tty_port_tty_set(&hp->port, NULL); 375 tty_port_tty_set(&hp->port, NULL);
376 376
@@ -387,10 +387,10 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
387 */ 387 */
388 tty_wait_until_sent_from_close(tty, HVC_CLOSE_WAIT); 388 tty_wait_until_sent_from_close(tty, HVC_CLOSE_WAIT);
389 } else { 389 } else {
390 if (hp->count < 0) 390 if (hp->port.count < 0)
391 printk(KERN_ERR "hvc_close %X: oops, count is %d\n", 391 printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
392 hp->vtermno, hp->count); 392 hp->vtermno, hp->port.count);
393 spin_unlock_irqrestore(&hp->lock, flags); 393 spin_unlock_irqrestore(&hp->port.lock, flags);
394 } 394 }
395 395
396 tty_kref_put(tty); 396 tty_kref_put(tty);
@@ -409,24 +409,25 @@ static void hvc_hangup(struct tty_struct *tty)
409 /* cancel pending tty resize work */ 409 /* cancel pending tty resize work */
410 cancel_work_sync(&hp->tty_resize); 410 cancel_work_sync(&hp->tty_resize);
411 411
412 spin_lock_irqsave(&hp->lock, flags); 412 spin_lock_irqsave(&hp->port.lock, flags);
413 413
414 /* 414 /*
415 * The N_TTY line discipline has problems such that in a close vs 415 * The N_TTY line discipline has problems such that in a close vs
416 * open->hangup case this can be called after the final close so prevent 416 * open->hangup case this can be called after the final close so prevent
417 * that from happening for now. 417 * that from happening for now.
418 */ 418 */
419 if (hp->count <= 0) { 419 if (hp->port.count <= 0) {
420 spin_unlock_irqrestore(&hp->lock, flags); 420 spin_unlock_irqrestore(&hp->port.lock, flags);
421 return; 421 return;
422 } 422 }
423 423
424 temp_open_count = hp->count; 424 temp_open_count = hp->port.count;
425 hp->count = 0; 425 hp->port.count = 0;
426 hp->n_outbuf = 0; 426 spin_unlock_irqrestore(&hp->port.lock, flags);
427 spin_unlock_irqrestore(&hp->lock, flags);
428 tty_port_tty_set(&hp->port, NULL); 427 tty_port_tty_set(&hp->port, NULL);
429 428
429 hp->n_outbuf = 0;
430
430 if (hp->ops->notifier_hangup) 431 if (hp->ops->notifier_hangup)
431 hp->ops->notifier_hangup(hp, hp->data); 432 hp->ops->notifier_hangup(hp, hp->data);
432 433
@@ -474,7 +475,8 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
474 if (!hp) 475 if (!hp)
475 return -EPIPE; 476 return -EPIPE;
476 477
477 if (hp->count <= 0) 478 /* FIXME what's this (unprotected) check for? */
479 if (hp->port.count <= 0)
478 return -EIO; 480 return -EIO;
479 481
480 spin_lock_irqsave(&hp->lock, flags); 482 spin_lock_irqsave(&hp->lock, flags);
diff --git a/drivers/tty/hvc/hvc_console.h b/drivers/tty/hvc/hvc_console.h
index 594a28fe0da0..674d23cb919a 100644
--- a/drivers/tty/hvc/hvc_console.h
+++ b/drivers/tty/hvc/hvc_console.h
@@ -49,7 +49,6 @@ struct hvc_struct {
49 struct tty_port port; 49 struct tty_port port;
50 spinlock_t lock; 50 spinlock_t lock;
51 int index; 51 int index;
52 int count;
53 int do_wakeup; 52 int do_wakeup;
54 char *outbuf; 53 char *outbuf;
55 int outbuf_size; 54 int outbuf_size;