diff options
Diffstat (limited to 'drivers/char/tpm/tpm-dev-common.c')
| -rw-r--r-- | drivers/char/tpm/tpm-dev-common.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c index 8856cce5a23b..817ae09a369e 100644 --- a/drivers/char/tpm/tpm-dev-common.c +++ b/drivers/char/tpm/tpm-dev-common.c @@ -233,12 +233,19 @@ __poll_t tpm_common_poll(struct file *file, poll_table *wait)  	__poll_t mask = 0;  	poll_wait(file, &priv->async_wait, wait); +	mutex_lock(&priv->buffer_mutex); -	if (!priv->response_read || priv->response_length) +	/* +	 * The response_length indicates if there is still response +	 * (or part of it) to be consumed. Partial reads decrease it +	 * by the number of bytes read, and write resets it the zero. +	 */ +	if (priv->response_length)  		mask = EPOLLIN | EPOLLRDNORM;  	else  		mask = EPOLLOUT | EPOLLWRNORM; +	mutex_unlock(&priv->buffer_mutex);  	return mask;  }  |