diff options
| -rw-r--r-- | drivers/char/hvc_console.c | 6 | ||||
| -rw-r--r-- | drivers/char/hvc_console.h | 12 | ||||
| -rw-r--r-- | drivers/char/hvc_iucv.c | 4 |
3 files changed, 17 insertions, 5 deletions
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index 25ce15bb1c08..a632f25f144a 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
| @@ -678,7 +678,7 @@ int hvc_poll(struct hvc_struct *hp) | |||
| 678 | EXPORT_SYMBOL_GPL(hvc_poll); | 678 | EXPORT_SYMBOL_GPL(hvc_poll); |
| 679 | 679 | ||
| 680 | /** | 680 | /** |
| 681 | * hvc_resize() - Update terminal window size information. | 681 | * __hvc_resize() - Update terminal window size information. |
| 682 | * @hp: HVC console pointer | 682 | * @hp: HVC console pointer |
| 683 | * @ws: Terminal window size structure | 683 | * @ws: Terminal window size structure |
| 684 | * | 684 | * |
| @@ -687,12 +687,12 @@ EXPORT_SYMBOL_GPL(hvc_poll); | |||
| 687 | * | 687 | * |
| 688 | * Locking: Locking free; the function MUST be called holding hp->lock | 688 | * Locking: Locking free; the function MUST be called holding hp->lock |
| 689 | */ | 689 | */ |
| 690 | void hvc_resize(struct hvc_struct *hp, struct winsize ws) | 690 | void __hvc_resize(struct hvc_struct *hp, struct winsize ws) |
| 691 | { | 691 | { |
| 692 | hp->ws = ws; | 692 | hp->ws = ws; |
| 693 | schedule_work(&hp->tty_resize); | 693 | schedule_work(&hp->tty_resize); |
| 694 | } | 694 | } |
| 695 | EXPORT_SYMBOL_GPL(hvc_resize); | 695 | EXPORT_SYMBOL_GPL(__hvc_resize); |
| 696 | 696 | ||
| 697 | /* | 697 | /* |
| 698 | * This kthread is either polling or interrupt driven. This is determined by | 698 | * This kthread is either polling or interrupt driven. This is determined by |
diff --git a/drivers/char/hvc_console.h b/drivers/char/hvc_console.h index 3c85d78c975c..10950ca706d8 100644 --- a/drivers/char/hvc_console.h +++ b/drivers/char/hvc_console.h | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #define HVC_CONSOLE_H | 28 | #define HVC_CONSOLE_H |
| 29 | #include <linux/kref.h> | 29 | #include <linux/kref.h> |
| 30 | #include <linux/tty.h> | 30 | #include <linux/tty.h> |
| 31 | #include <linux/spinlock.h> | ||
| 31 | 32 | ||
| 32 | /* | 33 | /* |
| 33 | * This is the max number of console adapters that can/will be found as | 34 | * This is the max number of console adapters that can/will be found as |
| @@ -88,7 +89,16 @@ int hvc_poll(struct hvc_struct *hp); | |||
| 88 | void hvc_kick(void); | 89 | void hvc_kick(void); |
| 89 | 90 | ||
| 90 | /* Resize hvc tty terminal window */ | 91 | /* Resize hvc tty terminal window */ |
| 91 | extern void hvc_resize(struct hvc_struct *hp, struct winsize ws); | 92 | extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws); |
| 93 | |||
| 94 | static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws) | ||
| 95 | { | ||
| 96 | unsigned long flags; | ||
| 97 | |||
| 98 | spin_lock_irqsave(&hp->lock, flags); | ||
| 99 | __hvc_resize(hp, ws); | ||
| 100 | spin_unlock_irqrestore(&hp->lock, flags); | ||
| 101 | } | ||
| 92 | 102 | ||
| 93 | /* default notifier for irq based notification */ | 103 | /* default notifier for irq based notification */ |
| 94 | extern int notifier_add_irq(struct hvc_struct *hp, int data); | 104 | extern int notifier_add_irq(struct hvc_struct *hp, int data); |
diff --git a/drivers/char/hvc_iucv.c b/drivers/char/hvc_iucv.c index 0ecac7e532f6..b8a5d654d3d0 100644 --- a/drivers/char/hvc_iucv.c +++ b/drivers/char/hvc_iucv.c | |||
| @@ -273,7 +273,9 @@ static int hvc_iucv_write(struct hvc_iucv_private *priv, | |||
| 273 | case MSG_TYPE_WINSIZE: | 273 | case MSG_TYPE_WINSIZE: |
| 274 | if (rb->mbuf->datalen != sizeof(struct winsize)) | 274 | if (rb->mbuf->datalen != sizeof(struct winsize)) |
| 275 | break; | 275 | break; |
| 276 | hvc_resize(priv->hvc, *((struct winsize *) rb->mbuf->data)); | 276 | /* The caller must ensure that the hvc is locked, which |
| 277 | * is the case when called from hvc_iucv_get_chars() */ | ||
| 278 | __hvc_resize(priv->hvc, *((struct winsize *) rb->mbuf->data)); | ||
| 277 | break; | 279 | break; |
| 278 | 280 | ||
| 279 | case MSG_TYPE_ERROR: /* ignored ... */ | 281 | case MSG_TYPE_ERROR: /* ignored ... */ |
