Re: [PATCH v2] hidp: Make hidp_get_raw_report abort if the session is terminating.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2013-02-20 at 18:16 +0000, Karl Relton wrote:
> From: Karl Relton <karllinuxtest.relton@xxxxxxxxxxxx>
> 
>  After linux 3.2 the hid_destroy_device call in hidp_session
>  cleaning up invokes a hook to the power_supply code which
>  in turn tries to read the battery capacity. This read will
>  trigger a call to hidp_get_raw_report which is bound to fail
>  because the device is being taken away - so rather than
>  wait for the 5 second timeout failure this changes enables
>  it to fail straight away.
> 
> Signed-off-by: Karl Relton <karllinuxtest.relton@xxxxxxxxxxxx>
> Reviewed-by: David Herrmann <dh.herrmann@xxxxxxxxx>
> ---
>  net/bluetooth/hidp/core.c |    4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
> index b2bcbe2..4b26ea7 100644
> --- a/net/bluetooth/hidp/core.c
> +++ b/net/bluetooth/hidp/core.c
> @@ -311,6 +311,9 @@ static int hidp_get_raw_report(struct hid_device *hid,
>  	int numbered_reports = hid->report_enum[report_type].numbered;
>  	int ret;
>  
> +	if (atomic_read(&session->terminate))
> +		return -EIO;
> +
>  	switch (report_type) {

Actually I've just realised that hidp_get_raw_report calls
__hidp_send_ctrl_message which already has the session->terminate test,
also returning -EIO on failure. So adding it again here is redundant.

> @@ -722,6 +725,7 @@ static int hidp_session(void *arg)
>  		set_current_state(TASK_INTERRUPTIBLE);
>  	}
>  	set_current_state(TASK_RUNNING);
> +	atomic_inc(&session->terminate);
>  	remove_wait_queue(sk_sleep(intr_sk), &intr_wait);
>  	remove_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait);
>  

So its just this one single line we need - to ensure session->terminate
is non-zero, which will ensure calls to other things (like
hidp_get_raw_report) abort swiftly.

I'll change the patch and send v3 this evening (need to get back to the
day job!).

Karl


--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux