Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
authorJohn W. Linville <linville@tuxdriver.com>
Fri, 28 Sep 2012 15:11:16 +0000 (11:11 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 28 Sep 2012 15:11:16 +0000 (11:11 -0400)
Conflicts:
net/nfc/netlink.c

Signed-off-by: John W. Linville <linville@tuxdriver.com>
1  2 
Documentation/feature-removal-schedule.txt
MAINTAINERS
drivers/net/wireless/mac80211_hwsim.c
include/net/cfg80211.h
include/net/nfc/nfc.h
net/nfc/netlink.c
net/wireless/mlme.c
net/wireless/nl80211.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -761,31 -761,63 +761,63 @@@ static struct genl_ops nfc_genl_ops[] 
        },
  };
  
- static int nfc_genl_rcv_nl_event(struct notifier_block *this,
-                                unsigned long event, void *ptr)
+ struct urelease_work {
+       struct  work_struct w;
 -      int     pid;
++      int     portid;
+ };
+ static void nfc_urelease_event_work(struct work_struct *work)
  {
-       struct netlink_notify *n = ptr;
+       struct urelease_work *w = container_of(work, struct urelease_work, w);
        struct class_dev_iter iter;
        struct nfc_dev *dev;
  
-       if (event != NETLINK_URELEASE || n->protocol != NETLINK_GENERIC)
-               goto out;
 -      pr_debug("pid %d\n", w->pid);
++      pr_debug("portid %d\n", w->portid);
  
-       pr_debug("NETLINK_URELEASE event from id %d\n", n->portid);
+       mutex_lock(&nfc_devlist_mutex);
  
        nfc_device_iter_init(&iter);
        dev = nfc_device_iter_next(&iter);
  
        while (dev) {
-               if (dev->genl_data.poll_req_portid == n->portid) {
+               mutex_lock(&dev->genl_data.genl_data_mutex);
 -              if (dev->genl_data.poll_req_pid == w->pid) {
++              if (dev->genl_data.poll_req_portid == w->portid) {
                        nfc_stop_poll(dev);
 -                      dev->genl_data.poll_req_pid = 0;
 +                      dev->genl_data.poll_req_portid = 0;
                }
+               mutex_unlock(&dev->genl_data.genl_data_mutex);
                dev = nfc_device_iter_next(&iter);
        }
  
        nfc_device_iter_exit(&iter);
  
 -      pr_debug("NETLINK_URELEASE event from id %d\n", n->pid);
+       mutex_unlock(&nfc_devlist_mutex);
+       kfree(w);
+ }
+ static int nfc_genl_rcv_nl_event(struct notifier_block *this,
+                                unsigned long event, void *ptr)
+ {
+       struct netlink_notify *n = ptr;
+       struct urelease_work *w;
+       if (event != NETLINK_URELEASE || n->protocol != NETLINK_GENERIC)
+               goto out;
 -              w->pid = n->pid;
++      pr_debug("NETLINK_URELEASE event from id %d\n", n->portid);
+       w = kmalloc(sizeof(*w), GFP_ATOMIC);
+       if (w) {
+               INIT_WORK((struct work_struct *) w, nfc_urelease_event_work);
++              w->portid = n->portid;
+               schedule_work((struct work_struct *) w);
+       }
  out:
        return NOTIFY_DONE;
  }
Simple merge
Simple merge