|
@@ -1254,7 +1254,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
|
|
|
|
|
|
/**
|
|
|
* do_tty_hangup - actual handler for hangup events
|
|
|
- * @data: tty device
|
|
|
+ * @work: tty device
|
|
|
*
|
|
|
* This can be called by the "eventd" kernel thread. That is process
|
|
|
* synchronous but doesn't hold any locks, so we need to make sure we
|
|
@@ -1274,9 +1274,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
|
|
|
* tasklist_lock to walk task list for hangup event
|
|
|
*
|
|
|
*/
|
|
|
-static void do_tty_hangup(void *data)
|
|
|
+static void do_tty_hangup(struct work_struct *work)
|
|
|
{
|
|
|
- struct tty_struct *tty = (struct tty_struct *) data;
|
|
|
+ struct tty_struct *tty =
|
|
|
+ container_of(work, struct tty_struct, hangup_work);
|
|
|
struct file * cons_filp = NULL;
|
|
|
struct file *filp, *f = NULL;
|
|
|
struct task_struct *p;
|
|
@@ -1433,7 +1434,7 @@ void tty_vhangup(struct tty_struct * tty)
|
|
|
|
|
|
printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
|
|
|
#endif
|
|
|
- do_tty_hangup((void *) tty);
|
|
|
+ do_tty_hangup(&tty->hangup_work);
|
|
|
}
|
|
|
EXPORT_SYMBOL(tty_vhangup);
|
|
|
|
|
@@ -3304,12 +3305,13 @@ int tty_ioctl(struct inode * inode, struct file * file,
|
|
|
* Nasty bug: do_SAK is being called in interrupt context. This can
|
|
|
* deadlock. We punt it up to process context. AKPM - 16Mar2001
|
|
|
*/
|
|
|
-static void __do_SAK(void *arg)
|
|
|
+static void __do_SAK(struct work_struct *work)
|
|
|
{
|
|
|
+ struct tty_struct *tty =
|
|
|
+ container_of(work, struct tty_struct, SAK_work);
|
|
|
#ifdef TTY_SOFT_SAK
|
|
|
tty_hangup(tty);
|
|
|
#else
|
|
|
- struct tty_struct *tty = arg;
|
|
|
struct task_struct *g, *p;
|
|
|
int session;
|
|
|
int i;
|
|
@@ -3388,7 +3390,7 @@ void do_SAK(struct tty_struct *tty)
|
|
|
{
|
|
|
if (!tty)
|
|
|
return;
|
|
|
- PREPARE_WORK(&tty->SAK_work, __do_SAK, tty);
|
|
|
+ PREPARE_WORK(&tty->SAK_work, __do_SAK);
|
|
|
schedule_work(&tty->SAK_work);
|
|
|
}
|
|
|
|
|
@@ -3396,7 +3398,7 @@ EXPORT_SYMBOL(do_SAK);
|
|
|
|
|
|
/**
|
|
|
* flush_to_ldisc
|
|
|
- * @private_: tty structure passed from work queue.
|
|
|
+ * @work: tty structure passed from work queue.
|
|
|
*
|
|
|
* This routine is called out of the software interrupt to flush data
|
|
|
* from the buffer chain to the line discipline.
|
|
@@ -3406,9 +3408,10 @@ EXPORT_SYMBOL(do_SAK);
|
|
|
* receive_buf method is single threaded for each tty instance.
|
|
|
*/
|
|
|
|
|
|
-static void flush_to_ldisc(void *private_)
|
|
|
+static void flush_to_ldisc(struct work_struct *work)
|
|
|
{
|
|
|
- struct tty_struct *tty = (struct tty_struct *) private_;
|
|
|
+ struct tty_struct *tty =
|
|
|
+ container_of(work, struct tty_struct, buf.work.work);
|
|
|
unsigned long flags;
|
|
|
struct tty_ldisc *disc;
|
|
|
struct tty_buffer *tbuf, *head;
|
|
@@ -3553,7 +3556,7 @@ void tty_flip_buffer_push(struct tty_struct *tty)
|
|
|
spin_unlock_irqrestore(&tty->buf.lock, flags);
|
|
|
|
|
|
if (tty->low_latency)
|
|
|
- flush_to_ldisc((void *) tty);
|
|
|
+ flush_to_ldisc(&tty->buf.work.work);
|
|
|
else
|
|
|
schedule_delayed_work(&tty->buf.work, 1);
|
|
|
}
|
|
@@ -3580,17 +3583,17 @@ static void initialize_tty_struct(struct tty_struct *tty)
|
|
|
tty->overrun_time = jiffies;
|
|
|
tty->buf.head = tty->buf.tail = NULL;
|
|
|
tty_buffer_init(tty);
|
|
|
- INIT_WORK(&tty->buf.work, flush_to_ldisc, tty);
|
|
|
+ INIT_DELAYED_WORK(&tty->buf.work, flush_to_ldisc);
|
|
|
init_MUTEX(&tty->buf.pty_sem);
|
|
|
mutex_init(&tty->termios_mutex);
|
|
|
init_waitqueue_head(&tty->write_wait);
|
|
|
init_waitqueue_head(&tty->read_wait);
|
|
|
- INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
|
|
|
+ INIT_WORK(&tty->hangup_work, do_tty_hangup);
|
|
|
mutex_init(&tty->atomic_read_lock);
|
|
|
mutex_init(&tty->atomic_write_lock);
|
|
|
spin_lock_init(&tty->read_lock);
|
|
|
INIT_LIST_HEAD(&tty->tty_files);
|
|
|
- INIT_WORK(&tty->SAK_work, NULL, NULL);
|
|
|
+ INIT_WORK(&tty->SAK_work, NULL);
|
|
|
}
|
|
|
|
|
|
/*
|