diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 1dac78271045..4d45bb4fe380 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c @@ -1015,9 +1015,24 @@ static void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata, void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata) { + struct sta_info *sta; + if (!sdata->vif.debugfs_dir) return; + /* + * Before we delete the netdev’s debugfs tree, clear sta->debugfs_dir + * for every station on this interface. This ensures any later call to + * ieee80211_sta_debugfs_remove() sees NULL and avoids touching a dentry + * that we are about to free. + */ + rcu_read_lock(); + list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) { + if (sta->sdata == sdata) + sta->debugfs_dir = NULL; + } + rcu_read_unlock(); + debugfs_remove_recursive(sdata->vif.debugfs_dir); sdata->vif.debugfs_dir = NULL; sdata->debugfs.subdir_stations = NULL;