Commit 7f4c5341 authored by Michael Buesch's avatar Michael Buesch Committed by John W. Linville
Browse files

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: default avatarMichael Buesch <mb@bu3sch.de>
Acked-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8312512e
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfkill *rfkill,
static 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 rfkill *rfkill,
		}
	}

	mutex_unlock(&rfkill->mutex);
	return retval;
}

@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(struct device *dev,
	if (!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,