]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/net/slip/slip.c
Merge tag 'timers-urgent-2020-01-27' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / net / slip / slip.c
index 4d479e3c817d8aa078eb347f6d61baa5c7b8a6c0..61d7e0d1d77db8deaa8c7260ab0dde4945dae950 100644 (file)
@@ -452,9 +452,16 @@ static void slip_transmit(struct work_struct *work)
  */
 static void slip_write_wakeup(struct tty_struct *tty)
 {
-       struct slip *sl = tty->disc_data;
+       struct slip *sl;
+
+       rcu_read_lock();
+       sl = rcu_dereference(tty->disc_data);
+       if (!sl)
+               goto out;
 
        schedule_work(&sl->tx_work);
+out:
+       rcu_read_unlock();
 }
 
 static void sl_tx_timeout(struct net_device *dev)
@@ -855,6 +862,7 @@ static int slip_open(struct tty_struct *tty)
        sl->tty = NULL;
        tty->disc_data = NULL;
        clear_bit(SLF_INUSE, &sl->flags);
+       sl_free_netdev(sl->dev);
        free_netdev(sl->dev);
 
 err_exit:
@@ -881,10 +889,11 @@ static void slip_close(struct tty_struct *tty)
                return;
 
        spin_lock_bh(&sl->lock);
-       tty->disc_data = NULL;
+       rcu_assign_pointer(tty->disc_data, NULL);
        sl->tty = NULL;
        spin_unlock_bh(&sl->lock);
 
+       synchronize_rcu();
        flush_work(&sl->tx_work);
 
        /* VSV = very important to remove timers */