rfkill: fix double-mutex-locking
PATCH 1/1 rfkill: fix double-mutex-locking
rfkill_toggle_radio is called from functions where rfkill->mutex is already aquired.
Remove the lock from rfkill_toggle_radio() and add it to the only calling function that calls it without the lock held.
Signed-off-by Michael Buesch <[email protected]>
net/rfkill/rfkill.c +5 -9
@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfstatic int rfkill_toggle_radio (struct rfkill *rfkill,enum rfkill_state state) { -int retval; - - retval =mutex_lock_interruptible (&rfkill->mutex); -if (retval) -return retval; +int retval =0 ;if (state != rfkill->state) { retval = rfkill->toggle_radio (rfkill->data, state);
@@ -74,7 +70,6 @@ static int rfkill_toggle_radio(struct rf } } -mutex_unlock (&rfkill->mutex);return retval; }
@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(structif (!capable (CAP_NET_ADMIN ))return -EPERM ; +if (mutex_lock_interruptible (&rfkill->mutex)) +return -ERESTARTSYS ; error =rfkill_toggle_radio (rfkill, state ?RFKILL_STATE_ON :RFKILL_STATE_OFF ); -if (error) -return error; +mutex_unlock (&rfkill->mutex); -return count; +return error ? error : count; } static ssize_t rfkill_claim_show(struct device *dev,
Signature · 1 line
Greetings Michael.
Quoted 7 lines · Michael Buesch
rfkill_toggle_radiois called from functions whererfkill->mutexis already aquired.Remove the lock from
rfkill_toggle_radio()and add it to the only calling function that calls it without the lock held.Signed-off-by Michael Buesch <[email protected]>
Acked-by Ivo van Doorn <[email protected]>
Quoted 43 lines
Index:
wireless-2.6/net/rfkill/rfkill.c
===================================================================net/rfkill/rfkill.c +5
-9@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfstatic int rfkill_toggle_radio (struct rfkill *rfkill,enum rfkill_state state) { -int retval; - - retval =mutex_lock_interruptible (&rfkill->mutex); -if (retval) -return retval; +int retval =0 ;if (state != rfkill->state) { retval = rfkill->toggle_radio (rfkill->data, state);@@ -74,7 +70,6 @@ static int rfkill_toggle_radio(struct rf } } -mutex_unlock (&rfkill->mutex);return retval; }@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(structif (!capable (CAP_NET_ADMIN ))return -EPERM ; +if (mutex_lock_interruptible (&rfkill->mutex)) +return -ERESTARTSYS ; error =rfkill_toggle_radio (rfkill, state ?RFKILL_STATE_ON :RFKILL_STATE_OFF ); -if (error) -return error; +mutex_unlock (&rfkill->mutex); -return count; +return error ? error : count; } static ssize_t rfkill_claim_show(struct device *dev,