Merge common code using goto instruction. Except less LOC, one of the benefit is decrease number of places where function ieee80211_scan_completed() is called. Signed-off-by: Stanislaw Gruszka <sgruszka@xxxxxxxxxx> --- net/mac80211/scan.c | 40 ++++++++++++++++++---------------------- 1 files changed, 18 insertions(+), 22 deletions(-) diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 57b5e66..e9ab896 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -652,53 +652,43 @@ void ieee80211_scan_work(struct work_struct *work) container_of(work, struct ieee80211_local, scan_work.work); struct ieee80211_sub_if_data *sdata = local->scan_sdata; unsigned long next_delay = 0; + int rc = 1; + bool aborted = true; - if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) { - bool aborted; + mutex_lock(&local->mtx); + if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) { aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); - __ieee80211_scan_completed(&local->hw, aborted); - return; + goto out_complete; } - mutex_lock(&local->mtx); if (!sdata || !local->scan_req) { mutex_unlock(&local->mtx); return; } if (local->hw_scan_req) { - int rc = drv_hw_scan(local, sdata, local->hw_scan_req); - mutex_unlock(&local->mtx); - if (rc) - __ieee80211_scan_completed(&local->hw, true); - return; + rc = drv_hw_scan(local, sdata, local->hw_scan_req); + goto out_complete; } if (local->scan_req && !local->scanning) { struct cfg80211_scan_request *req = local->scan_req; - int rc; local->scan_req = NULL; local->scan_sdata = NULL; rc = __ieee80211_start_scan(sdata, req); - mutex_unlock(&local->mtx); - - if (rc) - __ieee80211_scan_completed(&local->hw, true); - return; + goto out_complete; } - mutex_unlock(&local->mtx); - /* * Avoid re-scheduling when the sdata is going away. */ - if (!ieee80211_sdata_running(sdata)) { - __ieee80211_scan_completed(&local->hw, true); - return; - } + if (!ieee80211_sdata_running(sdata)) + goto out_complete; + + mutex_unlock(&local->mtx); /* * as long as no delay is required advance immediately @@ -726,6 +716,12 @@ void ieee80211_scan_work(struct work_struct *work) } while (next_delay == 0); ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay); + return; + +out_complete: + mutex_unlock(&local->mtx); + if (rc) + __ieee80211_scan_completed(&local->hw, true); } int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html