vt: synchronize_rcu() under spinlock is not nice...
vcs_poll_data_free() calls unregister_vt_notifier(), which calls atomic_notifier_chain_unregister(), which calls synchronize_rcu(). Do it *after* we'd dropped ->f_lock. Cc: stable@vger.kernel.org (all kernels since 2.6.37) Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
7ea600b531
commit
e8cd81693b
|
@ -93,7 +93,7 @@ vcs_poll_data_free(struct vcs_poll_data *poll)
|
|||
static struct vcs_poll_data *
|
||||
vcs_poll_data_get(struct file *file)
|
||||
{
|
||||
struct vcs_poll_data *poll = file->private_data;
|
||||
struct vcs_poll_data *poll = file->private_data, *kill = NULL;
|
||||
|
||||
if (poll)
|
||||
return poll;
|
||||
|
@ -122,10 +122,12 @@ vcs_poll_data_get(struct file *file)
|
|||
file->private_data = poll;
|
||||
} else {
|
||||
/* someone else raced ahead of us */
|
||||
vcs_poll_data_free(poll);
|
||||
kill = poll;
|
||||
poll = file->private_data;
|
||||
}
|
||||
spin_unlock(&file->f_lock);
|
||||
if (kill)
|
||||
vcs_poll_data_free(kill);
|
||||
|
||||
return poll;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue