On Mon, Feb 08, 2016 at 01:16:29PM +1100, Stephen Rothwell wrote:
> Hi Greg,
> 
> Today's linux-next merge of the tty tree got a conflict in:
> 
>   drivers/tty/tty_io.c
> 
> between commit:
> 
>   e9036d066236 ("tty: Drop krefs for interrupted tty lock")
> 
> from the tty.current tree and commit:
> 
>   d6203d0c7b73 ("tty: Refactor tty_open()")
> 
> from the tty tree.
> 
> I fixed it up (I think - see below) and can carry the fix as necessary
> (no action is required).
> 
> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc drivers/tty/tty_io.c
> index a7eacef1bd22,8d26ed79bb4c..000000000000
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@@ -2004,6 -2009,69 +2009,68 @@@ static struct tty_driver *tty_lookup_dr
>   }
>   
>   /**
> +  *  tty_open_by_driver      -       open a tty device
> +  *  @device: dev_t of device to open
> +  *  @inode: inode of device file
> +  *  @filp: file pointer to tty
> +  *
> +  *  Performs the driver lookup, checks for a reopen, or otherwise
> +  *  performs the first-time tty initialization.
> +  *
> +  *  Returns the locked initialized or re-opened &tty_struct
> +  *
> +  *  Claims the global tty_mutex to serialize:
> +  *    - concurrent first-time tty initialization
> +  *    - concurrent tty driver removal w/ lookup
> +  *    - concurrent tty removal from driver table
> +  */
> + static struct tty_struct *tty_open_by_driver(dev_t device, struct inode 
> *inode,
> +                                          struct file *filp)
> + {
> +     struct tty_struct *tty;
> +     struct tty_driver *driver = NULL;
> +     int index = -1;
> +     int retval;
> + 
> +     mutex_lock(&tty_mutex);
> +     driver = tty_lookup_driver(device, filp, &index);
> +     if (IS_ERR(driver)) {
> +             mutex_unlock(&tty_mutex);
> +             return ERR_CAST(driver);
> +     }
> + 
> +     /* check whether we're reopening an existing tty */
> +     tty = tty_driver_lookup_tty(driver, inode, index);
> +     if (IS_ERR(tty)) {
> +             mutex_unlock(&tty_mutex);
> +             goto out;
> +     }
> + 
> +     if (tty) {
> +             mutex_unlock(&tty_mutex);
> +             retval = tty_lock_interruptible(tty);
> ++            tty_kref_put(tty);  /* drop kref from tty_driver_lookup_tty() */
> +             if (retval) {
> +                     if (retval == -EINTR)
> +                             retval = -ERESTARTSYS;
> +                     tty = ERR_PTR(retval);
> +                     goto out;
> +             }
>  -            /* safe to drop the kref from tty_driver_lookup_tty() */
>  -            tty_kref_put(tty);
> +             retval = tty_reopen(tty);
> +             if (retval < 0) {
> +                     tty_unlock(tty);
> +                     tty = ERR_PTR(retval);
> +             }
> +     } else { /* Returns with the tty_lock held for now */
> +             tty = tty_init_dev(driver, index);
> +             mutex_unlock(&tty_mutex);
> +     }
> + out:
> +     tty_driver_kref_put(driver);
> +     return tty;
> + }
> + 
> + /**
>    *  tty_open                -       open a tty device
>    *  @inode: inode of device file
>    *  @filp: file pointer to tty

Peter warned me this was going to happen...

Peter, is the merge above correct?

thanks,

greg k-h

Reply via email to