]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ipack/devices/ipoctal: fix kernel bug when using pppd
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Mon, 10 Dec 2012 10:49:59 +0000 (11:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Jan 2013 02:24:38 +0000 (18:24 -0800)
Trying to setup the pppd server to use ipoctal's serial ports, it says the ports
are busy the first time. If the operation is repeated, a kernel bug due to a
dereference of a NULL pointer appears.

Removing the one-access-only setup from the driver, removes this kernel bug.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/ipack/devices/ipoctal.c

index a33a849765c6399b283865d120b0135eab638d5f..8d0a86631908ce706ad542b545630f11e63de14b 100644 (file)
@@ -38,7 +38,6 @@ struct ipoctal_channel {
        spinlock_t                      lock;
        unsigned int                    pointer_read;
        unsigned int                    pointer_write;
-       atomic_t                        open;
        struct tty_port                 tty_port;
        union scc2698_channel __iomem   *regs;
        union scc2698_block __iomem     *block_regs;
@@ -70,22 +69,12 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)
 
 static int ipoctal_open(struct tty_struct *tty, struct file *file)
 {
-       int res;
        struct ipoctal_channel *channel;
 
        channel = dev_get_drvdata(tty->dev);
-
-       if (atomic_read(&channel->open))
-               return -EBUSY;
-
        tty->driver_data = channel;
 
-       res = tty_port_open(&channel->tty_port, tty, file);
-       if (res)
-               return res;
-
-       atomic_inc(&channel->open);
-       return 0;
+       return tty_port_open(&channel->tty_port, tty, file);
 }
 
 static void ipoctal_reset_stats(struct ipoctal_stats *stats)
@@ -111,9 +100,7 @@ static void ipoctal_close(struct tty_struct *tty, struct file *filp)
        struct ipoctal_channel *channel = tty->driver_data;
 
        tty_port_close(&channel->tty_port, tty, filp);
-
-       if (atomic_dec_and_test(&channel->open))
-               ipoctal_free_channel(channel);
+       ipoctal_free_channel(channel);
 }
 
 static int ipoctal_get_icount(struct tty_struct *tty,
@@ -205,10 +192,6 @@ static void ipoctal_irq_channel(struct ipoctal_channel *channel)
        u8 isr, sr;
        struct tty_struct *tty;
 
-       /* If there is no client, skip the check */
-       if (!atomic_read(&channel->open))
-               return;
-
        tty = tty_port_tty_get(&channel->tty_port);
        if (!tty)
                return;