return -EINVAL;
        }
 
-       mutex_lock(&cfg80211_mutex);
-
-       if (!reg_is_valid_request(alpha2)) {
-               r = -EINVAL;
-               goto bad_reg;
-       }
-
        size_of_regd = sizeof(struct ieee80211_regdomain) +
                       num_rules * sizeof(struct ieee80211_reg_rule);
 
        rd = kzalloc(size_of_regd, GFP_KERNEL);
-       if (!rd) {
-               r = -ENOMEM;
-               goto bad_reg;
-       }
+       if (!rd)
+               return -ENOMEM;
 
        rd->n_reg_rules = num_rules;
        rd->alpha2[0] = alpha2[0];
                }
        }
 
+       mutex_lock(&cfg80211_mutex);
+
        r = set_regdom(rd);
+       /* set_regdom took ownership */
        rd = NULL;
+       mutex_unlock(&cfg80211_mutex);
 
  bad_reg:
-       mutex_unlock(&cfg80211_mutex);
        kfree(rd);
        return r;
 }
 
        return kobject_uevent(®_pdev->dev.kobj, KOBJ_CHANGE);
 }
 
-/* Used by nl80211 before kmalloc'ing our regulatory domain */
-bool reg_is_valid_request(const char *alpha2)
+static bool reg_is_valid_request(const char *alpha2)
 {
+       assert_reg_lock();
+
        if (!last_request)
                return false;
 
+       if (last_request->processed)
+               return false;
+
        return alpha2_equal(last_request->alpha2, alpha2);
 }
 
 
        last_request = pending_request;
        last_request->intersect = intersect;
+       last_request->processed = false;
 
        pending_request = NULL;
 
        const struct ieee80211_regdomain *regd;
        const struct ieee80211_regdomain *intersected_rd = NULL;
        struct wiphy *request_wiphy;
+
        /* Some basic sanity checks first */
 
+       if (!reg_is_valid_request(rd->alpha2))
+               return -EINVAL;
+
        if (is_world_regdom(rd->alpha2)) {
-               if (WARN_ON(!reg_is_valid_request(rd->alpha2)))
-                       return -EINVAL;
                update_world_regdomain(rd);
                return 0;
        }
            !is_unknown_alpha2(rd->alpha2))
                return -EINVAL;
 
-       if (!last_request)
-               return -EINVAL;
-
        /*
         * Lets only bother proceeding on the same alpha2 if the current
         * rd is non static (it means CRDA was present and was used last)
         * internal EEPROM data
         */
 
-       if (WARN_ON(!reg_is_valid_request(rd->alpha2)))
-               return -EINVAL;
-
        if (!is_valid_rd(rd)) {
                pr_err("Invalid regulatory domain detected:\n");
                print_regdomain_info(rd);
 
 extern const struct ieee80211_regdomain *cfg80211_regdomain;
 
 bool is_world_regdom(const char *alpha2);
-bool reg_is_valid_request(const char *alpha2);
 bool reg_supported_dfs_region(u8 dfs_region);
 
 int regulatory_hint_user(const char *alpha2,