Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 188810
b: refs/heads/master
c: e74d098
h: refs/heads/master
v: v3
  • Loading branch information
Amit Shah authored and Greg Kroah-Hartman committed Mar 19, 2010
1 parent 770006e commit 20a98ae
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f157b58511e56d418eb582de96fedc4ea03d8061
refs/heads/master: e74d098c66543d0731de62eb747ccd5b636a6f4c
31 changes: 21 additions & 10 deletions trunk/drivers/char/hvc_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,14 +312,15 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
spin_lock_irqsave(&hp->lock, flags);
/* Check and then increment for fast path open. */
if (hp->count++ > 0) {
tty_kref_get(tty);
spin_unlock_irqrestore(&hp->lock, flags);
hvc_kick();
return 0;
} /* else count == 0 */

tty->driver_data = hp;

hp->tty = tty;
hp->tty = tty_kref_get(tty);

spin_unlock_irqrestore(&hp->lock, flags);

Expand All @@ -336,6 +337,7 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
spin_lock_irqsave(&hp->lock, flags);
hp->tty = NULL;
spin_unlock_irqrestore(&hp->lock, flags);
tty_kref_put(tty);
tty->driver_data = NULL;
kref_put(&hp->kref, destroy_hvc_struct);
printk(KERN_ERR "hvc_open: request_irq failed with rc %d.\n", rc);
Expand Down Expand Up @@ -363,13 +365,18 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
return;

hp = tty->driver_data;

spin_lock_irqsave(&hp->lock, flags);
tty_kref_get(tty);

if (--hp->count == 0) {
/* We are done with the tty pointer now. */
hp->tty = NULL;
spin_unlock_irqrestore(&hp->lock, flags);

/* Put the ref obtained in hvc_open() */
tty_kref_put(tty);

if (hp->ops->notifier_del)
hp->ops->notifier_del(hp, hp->data);

Expand All @@ -389,6 +396,7 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
spin_unlock_irqrestore(&hp->lock, flags);
}

tty_kref_put(tty);
kref_put(&hp->kref, destroy_hvc_struct);
}

Expand Down Expand Up @@ -424,10 +432,11 @@ static void hvc_hangup(struct tty_struct *tty)
spin_unlock_irqrestore(&hp->lock, flags);

if (hp->ops->notifier_hangup)
hp->ops->notifier_hangup(hp, hp->data);
hp->ops->notifier_hangup(hp, hp->data);

while(temp_open_count) {
--temp_open_count;
tty_kref_put(tty);
kref_put(&hp->kref, destroy_hvc_struct);
}
}
Expand Down Expand Up @@ -592,7 +601,7 @@ int hvc_poll(struct hvc_struct *hp)
}

/* No tty attached, just skip */
tty = hp->tty;
tty = tty_kref_get(hp->tty);
if (tty == NULL)
goto bail;

Expand Down Expand Up @@ -672,6 +681,8 @@ int hvc_poll(struct hvc_struct *hp)

tty_flip_buffer_push(tty);
}
if (tty)
tty_kref_put(tty);

return poll_mask;
}
Expand Down Expand Up @@ -807,7 +818,7 @@ int hvc_remove(struct hvc_struct *hp)
struct tty_struct *tty;

spin_lock_irqsave(&hp->lock, flags);
tty = hp->tty;
tty = tty_kref_get(hp->tty);

if (hp->index < MAX_NR_HVC_CONSOLES)
vtermnos[hp->index] = -1;
Expand All @@ -819,18 +830,18 @@ int hvc_remove(struct hvc_struct *hp)
/*
* We 'put' the instance that was grabbed when the kref instance
* was initialized using kref_init(). Let the last holder of this
* kref cause it to be removed, which will probably be the tty_hangup
* kref cause it to be removed, which will probably be the tty_vhangup
* below.
*/
kref_put(&hp->kref, destroy_hvc_struct);

/*
* This function call will auto chain call hvc_hangup. The tty should
* always be valid at this time unless a simultaneous tty close already
* cleaned up the hvc_struct.
* This function call will auto chain call hvc_hangup.
*/
if (tty)
tty_hangup(tty);
if (tty) {
tty_vhangup(tty);
tty_kref_put(tty);
}
return 0;
}
EXPORT_SYMBOL_GPL(hvc_remove);
Expand Down

0 comments on commit 20a98ae

Please sign in to comment.