--- x/net/nfc/llcp_core.c +++ y/net/nfc/llcp_core.c @@ -17,6 +17,7 @@ static u8 llcp_magic[3] = {0x46, 0x66, 0x6d}; static LIST_HEAD(llcp_devices); +static DEFINE_SPINLOCK(llcp_devices_lock); static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb); @@ -281,11 +282,17 @@ static void nfc_llcp_sdreq_timer(struct struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev) { struct nfc_llcp_local *local; + unsigned long flags; + + spin_lock_irqsave(&llcp_devices_lock, flags); list_for_each_entry(local, &llcp_devices, list) - if (local->dev == dev) + if (local->dev == dev) { + spin_unlock_irqrestore(&llcp_devices_lock, flags); return local; + } + spin_unlock_irqrestore(&llcp_devices_lock, flags); pr_debug("No device found\n"); return NULL; @@ -1562,6 +1569,7 @@ void nfc_llcp_mac_is_up(struct nfc_dev * int nfc_llcp_register_device(struct nfc_dev *ndev) { struct nfc_llcp_local *local; + unsigned long flags; local = kzalloc(sizeof(struct nfc_llcp_local), GFP_KERNEL); if (local == NULL) @@ -1600,7 +1608,9 @@ int nfc_llcp_register_device(struct nfc_ timer_setup(&local->sdreq_timer, nfc_llcp_sdreq_timer, 0); INIT_WORK(&local->sdreq_timeout_work, nfc_llcp_sdreq_timeout_work); + spin_lock_irqsave(&llcp_devices_lock, flags); list_add(&local->list, &llcp_devices); + spin_unlock_irqrestore(&llcp_devices_lock, flags); return 0; }