diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-02 12:49:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-02 12:49:06 -0400 |
| commit | ca55bd7e2905d344bf697f7c2cc347cb42999e7a (patch) | |
| tree | f2b45dcfd55e72398d29320d2b3b9c3bace94a85 /net | |
| parent | 4157fd85fc794bb7896b65c0cf686aa89d711d57 (diff) | |
| parent | 12186be7d2e1106cede1cc728526e3d7998cbe94 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
net_cls: fix unconfigured struct tcf_proto keeps chaining and avoid kernel panic when we use cls_cgroup
e1000: add missing length check to e1000 receive routine
forcedeth: add phy_power_down parameter, leave phy powered up by default (v2)
Bluetooth: Remove useless flush_work() causing lockdep warnings
Diffstat (limited to 'net')
| -rw-r--r-- | net/bluetooth/hci_sysfs.c | 6 | ||||
| -rw-r--r-- | net/sched/cls_api.c | 23 |
2 files changed, 17 insertions, 12 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 4cc3624bd22d..95f7a7a544b4 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
| @@ -90,9 +90,6 @@ static void add_conn(struct work_struct *work) | |||
| 90 | struct hci_conn *conn = container_of(work, struct hci_conn, work_add); | 90 | struct hci_conn *conn = container_of(work, struct hci_conn, work_add); |
| 91 | struct hci_dev *hdev = conn->hdev; | 91 | struct hci_dev *hdev = conn->hdev; |
| 92 | 92 | ||
| 93 | /* ensure previous del is complete */ | ||
| 94 | flush_work(&conn->work_del); | ||
| 95 | |||
| 96 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); | 93 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); |
| 97 | 94 | ||
| 98 | if (device_add(&conn->dev) < 0) { | 95 | if (device_add(&conn->dev) < 0) { |
| @@ -118,9 +115,6 @@ static void del_conn(struct work_struct *work) | |||
| 118 | struct hci_conn *conn = container_of(work, struct hci_conn, work_del); | 115 | struct hci_conn *conn = container_of(work, struct hci_conn, work_del); |
| 119 | struct hci_dev *hdev = conn->hdev; | 116 | struct hci_dev *hdev = conn->hdev; |
| 120 | 117 | ||
| 121 | /* ensure previous add is complete */ | ||
| 122 | flush_work(&conn->work_add); | ||
| 123 | |||
| 124 | if (!device_is_registered(&conn->dev)) | 118 | if (!device_is_registered(&conn->dev)) |
| 125 | return; | 119 | return; |
| 126 | 120 | ||
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 0759f32e9dca..09cdcdfe7e91 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -135,6 +135,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg) | |||
| 135 | unsigned long cl; | 135 | unsigned long cl; |
| 136 | unsigned long fh; | 136 | unsigned long fh; |
| 137 | int err; | 137 | int err; |
| 138 | int tp_created = 0; | ||
| 138 | 139 | ||
| 139 | if (net != &init_net) | 140 | if (net != &init_net) |
| 140 | return -EINVAL; | 141 | return -EINVAL; |
| @@ -266,10 +267,7 @@ replay: | |||
| 266 | goto errout; | 267 | goto errout; |
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | spin_lock_bh(root_lock); | 270 | tp_created = 1; |
| 270 | tp->next = *back; | ||
| 271 | *back = tp; | ||
| 272 | spin_unlock_bh(root_lock); | ||
| 273 | 271 | ||
| 274 | } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) | 272 | } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) |
| 275 | goto errout; | 273 | goto errout; |
| @@ -296,8 +294,11 @@ replay: | |||
| 296 | switch (n->nlmsg_type) { | 294 | switch (n->nlmsg_type) { |
| 297 | case RTM_NEWTFILTER: | 295 | case RTM_NEWTFILTER: |
| 298 | err = -EEXIST; | 296 | err = -EEXIST; |
| 299 | if (n->nlmsg_flags & NLM_F_EXCL) | 297 | if (n->nlmsg_flags & NLM_F_EXCL) { |
| 298 | if (tp_created) | ||
| 299 | tcf_destroy(tp); | ||
| 300 | goto errout; | 300 | goto errout; |
| 301 | } | ||
| 301 | break; | 302 | break; |
| 302 | case RTM_DELTFILTER: | 303 | case RTM_DELTFILTER: |
| 303 | err = tp->ops->delete(tp, fh); | 304 | err = tp->ops->delete(tp, fh); |
| @@ -314,8 +315,18 @@ replay: | |||
| 314 | } | 315 | } |
| 315 | 316 | ||
| 316 | err = tp->ops->change(tp, cl, t->tcm_handle, tca, &fh); | 317 | err = tp->ops->change(tp, cl, t->tcm_handle, tca, &fh); |
| 317 | if (err == 0) | 318 | if (err == 0) { |
| 319 | if (tp_created) { | ||
| 320 | spin_lock_bh(root_lock); | ||
| 321 | tp->next = *back; | ||
| 322 | *back = tp; | ||
| 323 | spin_unlock_bh(root_lock); | ||
| 324 | } | ||
| 318 | tfilter_notify(skb, n, tp, fh, RTM_NEWTFILTER); | 325 | tfilter_notify(skb, n, tp, fh, RTM_NEWTFILTER); |
| 326 | } else { | ||
| 327 | if (tp_created) | ||
| 328 | tcf_destroy(tp); | ||
| 329 | } | ||
| 319 | 330 | ||
| 320 | errout: | 331 | errout: |
| 321 | if (cl) | 332 | if (cl) |
