提交 06fb4e70 编写于 作者: D David S. Miller
...@@ -979,7 +979,6 @@ static void bond_poll_controller(struct net_device *bond_dev) ...@@ -979,7 +979,6 @@ static void bond_poll_controller(struct net_device *bond_dev)
if (bond_3ad_get_active_agg_info(bond, &ad_info)) if (bond_3ad_get_active_agg_info(bond, &ad_info))
return; return;
rcu_read_lock_bh();
bond_for_each_slave_rcu(bond, slave, iter) { bond_for_each_slave_rcu(bond, slave, iter) {
ops = slave->dev->netdev_ops; ops = slave->dev->netdev_ops;
if (!bond_slave_is_up(slave) || !ops->ndo_poll_controller) if (!bond_slave_is_up(slave) || !ops->ndo_poll_controller)
...@@ -1000,7 +999,6 @@ static void bond_poll_controller(struct net_device *bond_dev) ...@@ -1000,7 +999,6 @@ static void bond_poll_controller(struct net_device *bond_dev)
ops->ndo_poll_controller(slave->dev); ops->ndo_poll_controller(slave->dev);
up(&ni->dev_lock); up(&ni->dev_lock);
} }
rcu_read_unlock_bh();
} }
static void bond_netpoll_cleanup(struct net_device *bond_dev) static void bond_netpoll_cleanup(struct net_device *bond_dev)
......
...@@ -1659,7 +1659,7 @@ static int ravb_probe(struct platform_device *pdev) ...@@ -1659,7 +1659,7 @@ static int ravb_probe(struct platform_device *pdev)
ndev->dma = -1; ndev->dma = -1;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq < 0) { if (irq < 0) {
error = -ENODEV; error = irq;
goto out_release; goto out_release;
} }
ndev->irq = irq; ndev->irq = irq;
......
...@@ -3089,10 +3089,8 @@ static int sh_eth_drv_probe(struct platform_device *pdev) ...@@ -3089,10 +3089,8 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
ndev->dma = -1; ndev->dma = -1;
ret = platform_get_irq(pdev, 0); ret = platform_get_irq(pdev, 0);
if (ret < 0) { if (ret < 0)
ret = -ENODEV;
goto out_release; goto out_release;
}
ndev->irq = ret; ndev->irq = ret;
SET_NETDEV_DEV(ndev, &pdev->dev); SET_NETDEV_DEV(ndev, &pdev->dev);
......
...@@ -2428,7 +2428,10 @@ static int smsc911x_drv_probe(struct platform_device *pdev) ...@@ -2428,7 +2428,10 @@ static int smsc911x_drv_probe(struct platform_device *pdev)
res_size = resource_size(res); res_size = resource_size(res);
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq <= 0) { if (irq == -EPROBE_DEFER) {
retval = -EPROBE_DEFER;
goto out_0;
} else if (irq <= 0) {
pr_warn("Could not allocate irq resource\n"); pr_warn("Could not allocate irq resource\n");
retval = -ENODEV; retval = -ENODEV;
goto out_0; goto out_0;
......
...@@ -110,6 +110,7 @@ struct nlmsgerr { ...@@ -110,6 +110,7 @@ struct nlmsgerr {
#define NETLINK_TX_RING 7 #define NETLINK_TX_RING 7
#define NETLINK_LISTEN_ALL_NSID 8 #define NETLINK_LISTEN_ALL_NSID 8
#define NETLINK_LIST_MEMBERSHIPS 9 #define NETLINK_LIST_MEMBERSHIPS 9
#define NETLINK_CAP_ACK 10
struct nl_pktinfo { struct nl_pktinfo {
__u32 group; __u32 group;
......
...@@ -84,6 +84,7 @@ struct listeners { ...@@ -84,6 +84,7 @@ struct listeners {
#define NETLINK_F_BROADCAST_SEND_ERROR 0x4 #define NETLINK_F_BROADCAST_SEND_ERROR 0x4
#define NETLINK_F_RECV_NO_ENOBUFS 0x8 #define NETLINK_F_RECV_NO_ENOBUFS 0x8
#define NETLINK_F_LISTEN_ALL_NSID 0x10 #define NETLINK_F_LISTEN_ALL_NSID 0x10
#define NETLINK_F_CAP_ACK 0x20
static inline int netlink_is_kernel(struct sock *sk) static inline int netlink_is_kernel(struct sock *sk)
{ {
...@@ -610,11 +611,11 @@ static void netlink_increment_head(struct netlink_ring *ring) ...@@ -610,11 +611,11 @@ static void netlink_increment_head(struct netlink_ring *ring)
static void netlink_forward_ring(struct netlink_ring *ring) static void netlink_forward_ring(struct netlink_ring *ring)
{ {
unsigned int head = ring->head, pos = head; unsigned int head = ring->head;
const struct nl_mmap_hdr *hdr; const struct nl_mmap_hdr *hdr;
do { do {
hdr = __netlink_lookup_frame(ring, pos); hdr = __netlink_lookup_frame(ring, ring->head);
if (hdr->nm_status == NL_MMAP_STATUS_UNUSED) if (hdr->nm_status == NL_MMAP_STATUS_UNUSED)
break; break;
if (hdr->nm_status != NL_MMAP_STATUS_SKIP) if (hdr->nm_status != NL_MMAP_STATUS_SKIP)
...@@ -2258,6 +2259,13 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, ...@@ -2258,6 +2259,13 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
nlk->flags &= ~NETLINK_F_LISTEN_ALL_NSID; nlk->flags &= ~NETLINK_F_LISTEN_ALL_NSID;
err = 0; err = 0;
break; break;
case NETLINK_CAP_ACK:
if (val)
nlk->flags |= NETLINK_F_CAP_ACK;
else
nlk->flags &= ~NETLINK_F_CAP_ACK;
err = 0;
break;
default: default:
err = -ENOPROTOOPT; err = -ENOPROTOOPT;
} }
...@@ -2332,6 +2340,16 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, ...@@ -2332,6 +2340,16 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname,
netlink_table_ungrab(); netlink_table_ungrab();
break; break;
} }
case NETLINK_CAP_ACK:
if (len < sizeof(int))
return -EINVAL;
len = sizeof(int);
val = nlk->flags & NETLINK_F_CAP_ACK ? 1 : 0;
if (put_user(len, optlen) ||
put_user(val, optval))
return -EFAULT;
err = 0;
break;
default: default:
err = -ENOPROTOOPT; err = -ENOPROTOOPT;
} }
...@@ -2873,9 +2891,12 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err) ...@@ -2873,9 +2891,12 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
struct nlmsghdr *rep; struct nlmsghdr *rep;
struct nlmsgerr *errmsg; struct nlmsgerr *errmsg;
size_t payload = sizeof(*errmsg); size_t payload = sizeof(*errmsg);
struct netlink_sock *nlk = nlk_sk(NETLINK_CB(in_skb).sk);
/* error messages get the original request appened */ /* Error messages get the original request appened, unless the user
if (err) * requests to cap the error message.
*/
if (!(nlk->flags & NETLINK_F_CAP_ACK) && err)
payload += nlmsg_len(nlh); payload += nlmsg_len(nlh);
skb = netlink_alloc_skb(in_skb->sk, nlmsg_total_size(payload), skb = netlink_alloc_skb(in_skb->sk, nlmsg_total_size(payload),
...@@ -2898,7 +2919,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err) ...@@ -2898,7 +2919,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
NLMSG_ERROR, payload, 0); NLMSG_ERROR, payload, 0);
errmsg = nlmsg_data(rep); errmsg = nlmsg_data(rep);
errmsg->error = err; errmsg->error = err;
memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh)); memcpy(&errmsg->msg, nlh, payload > sizeof(*errmsg) ? nlh->nlmsg_len : sizeof(*nlh));
netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).portid, MSG_DONTWAIT); netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).portid, MSG_DONTWAIT);
} }
EXPORT_SYMBOL(netlink_ack); EXPORT_SYMBOL(netlink_ack);
......
...@@ -3090,8 +3090,19 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, ...@@ -3090,8 +3090,19 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
sctp_assoc_set_primary(asoc, asconf->transport); sctp_assoc_set_primary(asoc, asconf->transport);
sctp_assoc_del_nonprimary_peers(asoc, sctp_assoc_del_nonprimary_peers(asoc,
asconf->transport); asconf->transport);
} else return SCTP_ERROR_NO_ERROR;
sctp_assoc_del_peer(asoc, &addr); }
/* If the address is not part of the association, the
* ASCONF-ACK with Error Cause Indication Parameter
* which including cause of Unresolvable Address should
* be sent.
*/
peer = sctp_assoc_lookup_paddr(asoc, &addr);
if (!peer)
return SCTP_ERROR_DNS_FAILED;
sctp_assoc_rm_peer(asoc, peer);
break; break;
case SCTP_PARAM_SET_PRIMARY: case SCTP_PARAM_SET_PRIMARY:
/* ADDIP Section 4.2.4 /* ADDIP Section 4.2.4
......
...@@ -954,7 +954,7 @@ static void sctp_cmd_del_non_primary(struct sctp_association *asoc) ...@@ -954,7 +954,7 @@ static void sctp_cmd_del_non_primary(struct sctp_association *asoc)
t = list_entry(pos, struct sctp_transport, transports); t = list_entry(pos, struct sctp_transport, transports);
if (!sctp_cmp_addr_exact(&t->ipaddr, if (!sctp_cmp_addr_exact(&t->ipaddr,
&asoc->peer.primary_addr)) { &asoc->peer.primary_addr)) {
sctp_assoc_del_peer(asoc, &t->ipaddr); sctp_assoc_rm_peer(asoc, t);
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册