mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
Merge tag 'v4.9.164' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-4.9.y
This is the 4.9.164 stable release
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 163
|
||||
SUBLEVEL = 164
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -996,12 +996,12 @@ static inline int intel_pmu_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int intel_cpuc_prepare(struct cpu_hw_event *cpuc, int cpu)
|
||||
static inline int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void intel_cpuc_finish(struct cpu_hw_event *cpuc)
|
||||
static inline void intel_cpuc_finish(struct cpu_hw_events *cpuc)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -4489,7 +4489,6 @@ bio_full:
|
||||
atomic_inc(&r10_bio->remaining);
|
||||
read_bio->bi_next = NULL;
|
||||
generic_make_request(read_bio);
|
||||
sector_nr += nr_sectors;
|
||||
sectors_done += nr_sectors;
|
||||
if (sector_nr <= last)
|
||||
goto read_more;
|
||||
|
||||
@@ -675,7 +675,7 @@ static bool __tmio_mmc_sdcard_irq(struct tmio_mmc_host *host,
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tmio_mmc_sdio_irq(int irq, void *devid)
|
||||
static bool tmio_mmc_sdio_irq(int irq, void *devid)
|
||||
{
|
||||
struct tmio_mmc_host *host = devid;
|
||||
struct mmc_host *mmc = host->mmc;
|
||||
@@ -684,7 +684,7 @@ static void tmio_mmc_sdio_irq(int irq, void *devid)
|
||||
unsigned int sdio_status;
|
||||
|
||||
if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
|
||||
return;
|
||||
return false;
|
||||
|
||||
status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
|
||||
ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask;
|
||||
@@ -697,6 +697,8 @@ static void tmio_mmc_sdio_irq(int irq, void *devid)
|
||||
|
||||
if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
|
||||
mmc_signal_sdio_irq(mmc);
|
||||
|
||||
return ireg;
|
||||
}
|
||||
|
||||
irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
||||
@@ -718,9 +720,10 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
||||
if (__tmio_mmc_sdcard_irq(host, ireg, status))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
tmio_mmc_sdio_irq(irq, devid);
|
||||
if (tmio_mmc_sdio_irq(irq, devid))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
return IRQ_HANDLED;
|
||||
return IRQ_NONE;
|
||||
}
|
||||
EXPORT_SYMBOL(tmio_mmc_irq);
|
||||
|
||||
|
||||
@@ -2633,6 +2633,8 @@ int mlx4_cmd_use_events(struct mlx4_dev *dev)
|
||||
if (!priv->cmd.context)
|
||||
return -ENOMEM;
|
||||
|
||||
if (mlx4_is_mfunc(dev))
|
||||
mutex_lock(&priv->cmd.slave_cmd_mutex);
|
||||
down_write(&priv->cmd.switch_sem);
|
||||
for (i = 0; i < priv->cmd.max_cmds; ++i) {
|
||||
priv->cmd.context[i].token = i;
|
||||
@@ -2658,6 +2660,8 @@ int mlx4_cmd_use_events(struct mlx4_dev *dev)
|
||||
down(&priv->cmd.poll_sem);
|
||||
priv->cmd.use_events = 1;
|
||||
up_write(&priv->cmd.switch_sem);
|
||||
if (mlx4_is_mfunc(dev))
|
||||
mutex_unlock(&priv->cmd.slave_cmd_mutex);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -2670,6 +2674,8 @@ void mlx4_cmd_use_polling(struct mlx4_dev *dev)
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
int i;
|
||||
|
||||
if (mlx4_is_mfunc(dev))
|
||||
mutex_lock(&priv->cmd.slave_cmd_mutex);
|
||||
down_write(&priv->cmd.switch_sem);
|
||||
priv->cmd.use_events = 0;
|
||||
|
||||
@@ -2677,9 +2683,12 @@ void mlx4_cmd_use_polling(struct mlx4_dev *dev)
|
||||
down(&priv->cmd.event_sem);
|
||||
|
||||
kfree(priv->cmd.context);
|
||||
priv->cmd.context = NULL;
|
||||
|
||||
up(&priv->cmd.poll_sem);
|
||||
up_write(&priv->cmd.switch_sem);
|
||||
if (mlx4_is_mfunc(dev))
|
||||
mutex_unlock(&priv->cmd.slave_cmd_mutex);
|
||||
}
|
||||
|
||||
struct mlx4_cmd_mailbox *mlx4_alloc_cmd_mailbox(struct mlx4_dev *dev)
|
||||
|
||||
@@ -2677,13 +2677,13 @@ static int qp_get_mtt_size(struct mlx4_qp_context *qpc)
|
||||
int total_pages;
|
||||
int total_mem;
|
||||
int page_offset = (be32_to_cpu(qpc->params2) >> 6) & 0x3f;
|
||||
int tot;
|
||||
|
||||
sq_size = 1 << (log_sq_size + log_sq_sride + 4);
|
||||
rq_size = (srq|rss|xrc) ? 0 : (1 << (log_rq_size + log_rq_stride + 4));
|
||||
total_mem = sq_size + rq_size;
|
||||
total_pages =
|
||||
roundup_pow_of_two((total_mem + (page_offset << 6)) >>
|
||||
page_shift);
|
||||
tot = (total_mem + (page_offset << 6)) >> page_shift;
|
||||
total_pages = !tot ? 1 : roundup_pow_of_two(tot);
|
||||
|
||||
return total_pages;
|
||||
}
|
||||
|
||||
@@ -457,7 +457,7 @@ static int ravb_dmac_init(struct net_device *ndev)
|
||||
RCR_EFFS | RCR_ENCF | RCR_ETS0 | RCR_ESF | 0x18000000, RCR);
|
||||
|
||||
/* Set FIFO size */
|
||||
ravb_write(ndev, TGC_TQP_AVBMODE1 | 0x00222200, TGC);
|
||||
ravb_write(ndev, TGC_TQP_AVBMODE1 | 0x00112200, TGC);
|
||||
|
||||
/* Timestamp enable */
|
||||
ravb_write(ndev, TCCR_TFEN, TCCR);
|
||||
|
||||
@@ -463,7 +463,12 @@ static int ipvlan_nl_changelink(struct net_device *dev,
|
||||
struct ipvl_port *port = ipvlan_port_get_rtnl(ipvlan->phy_dev);
|
||||
int err = 0;
|
||||
|
||||
if (data && data[IFLA_IPVLAN_MODE]) {
|
||||
if (!data)
|
||||
return 0;
|
||||
if (!ns_capable(dev_net(ipvlan->phy_dev)->user_ns, CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (data[IFLA_IPVLAN_MODE]) {
|
||||
u16 nmode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
|
||||
|
||||
err = ipvlan_set_port_mode(port, nmode);
|
||||
@@ -530,6 +535,8 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
||||
struct ipvl_dev *tmp = netdev_priv(phy_dev);
|
||||
|
||||
phy_dev = tmp->phy_dev;
|
||||
if (!ns_capable(dev_net(phy_dev)->user_ns, CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
} else if (!netif_is_ipvlan_port(phy_dev)) {
|
||||
err = ipvlan_port_create(phy_dev);
|
||||
if (err < 0)
|
||||
|
||||
@@ -319,7 +319,6 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner)
|
||||
err = device_register(&bus->dev);
|
||||
if (err) {
|
||||
pr_err("mii_bus %s failed to register\n", bus->id);
|
||||
put_device(&bus->dev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -541,6 +541,7 @@ static void pptp_sock_destruct(struct sock *sk)
|
||||
pppox_unbind_sock(sk);
|
||||
}
|
||||
skb_queue_purge(&sk->sk_receive_queue);
|
||||
dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
|
||||
}
|
||||
|
||||
static int pptp_create(struct net *net, struct socket *sock, int kern)
|
||||
|
||||
@@ -1380,6 +1380,14 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
if (unlikely(!(vxlan->dev->flags & IFF_UP))) {
|
||||
rcu_read_unlock();
|
||||
atomic_long_inc(&vxlan->dev->rx_dropped);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
stats = this_cpu_ptr(vxlan->dev->tstats);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
stats->rx_packets++;
|
||||
@@ -1387,6 +1395,9 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
|
||||
gro_cells_receive(&vxlan->gro_cells, skb);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
|
||||
drop:
|
||||
@@ -2362,6 +2373,8 @@ static void vxlan_uninit(struct net_device *dev)
|
||||
{
|
||||
struct vxlan_dev *vxlan = netdev_priv(dev);
|
||||
|
||||
gro_cells_destroy(&vxlan->gro_cells);
|
||||
|
||||
vxlan_fdb_delete_default(vxlan);
|
||||
|
||||
free_percpu(dev->tstats);
|
||||
@@ -3112,7 +3125,6 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)
|
||||
{
|
||||
struct vxlan_dev *vxlan = netdev_priv(dev);
|
||||
|
||||
gro_cells_destroy(&vxlan->gro_cells);
|
||||
list_del(&vxlan->next);
|
||||
unregister_netdevice_queue(dev, head);
|
||||
}
|
||||
|
||||
@@ -640,7 +640,7 @@ static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u64 guest_cid)
|
||||
hash_del_rcu(&vsock->hash);
|
||||
|
||||
vsock->guest_cid = guest_cid;
|
||||
hash_add_rcu(vhost_vsock_hash, &vsock->hash, guest_cid);
|
||||
hash_add_rcu(vhost_vsock_hash, &vsock->hash, vsock->guest_cid);
|
||||
spin_unlock_bh(&vhost_vsock_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
|
||||
/* Maximum object reference count (detects object deletion issues) */
|
||||
|
||||
#define ACPI_MAX_REFERENCE_COUNT 0x1000
|
||||
#define ACPI_MAX_REFERENCE_COUNT 0x4000
|
||||
|
||||
/* Default page size for use in mapping memory for operation regions */
|
||||
|
||||
|
||||
@@ -148,16 +148,20 @@ extern raw_spinlock_t devtree_lock;
|
||||
#ifdef CONFIG_OF
|
||||
void of_core_init(void);
|
||||
|
||||
static inline bool is_of_node(struct fwnode_handle *fwnode)
|
||||
static inline bool is_of_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_OF;
|
||||
}
|
||||
|
||||
static inline struct device_node *to_of_node(struct fwnode_handle *fwnode)
|
||||
{
|
||||
return is_of_node(fwnode) ?
|
||||
container_of(fwnode, struct device_node, fwnode) : NULL;
|
||||
}
|
||||
#define to_of_node(__fwnode) \
|
||||
({ \
|
||||
typeof(__fwnode) __to_of_node_fwnode = (__fwnode); \
|
||||
\
|
||||
is_of_node(__to_of_node_fwnode) ? \
|
||||
container_of(__to_of_node_fwnode, \
|
||||
struct device_node, fwnode) : \
|
||||
NULL; \
|
||||
})
|
||||
|
||||
static inline bool of_have_populated_dt(void)
|
||||
{
|
||||
@@ -529,12 +533,12 @@ static inline void of_core_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool is_of_node(struct fwnode_handle *fwnode)
|
||||
static inline bool is_of_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct device_node *to_of_node(struct fwnode_handle *fwnode)
|
||||
static inline struct device_node *to_of_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -18,22 +18,36 @@ static inline int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *sk
|
||||
{
|
||||
struct gro_cell *cell;
|
||||
struct net_device *dev = skb->dev;
|
||||
int res;
|
||||
|
||||
if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO))
|
||||
return netif_rx(skb);
|
||||
rcu_read_lock();
|
||||
if (unlikely(!(dev->flags & IFF_UP)))
|
||||
goto drop;
|
||||
|
||||
if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) {
|
||||
res = netif_rx(skb);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
cell = this_cpu_ptr(gcells->cells);
|
||||
|
||||
if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) {
|
||||
drop:
|
||||
atomic_long_inc(&dev->rx_dropped);
|
||||
kfree_skb(skb);
|
||||
return NET_RX_DROP;
|
||||
res = NET_RX_DROP;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
__skb_queue_tail(&cell->napi_skbs, skb);
|
||||
if (skb_queue_len(&cell->napi_skbs) == 1)
|
||||
napi_schedule(&cell->napi);
|
||||
return NET_RX_SUCCESS;
|
||||
|
||||
res = NET_RX_SUCCESS;
|
||||
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
}
|
||||
|
||||
/* called under BH context */
|
||||
|
||||
@@ -94,9 +94,8 @@ static void hsr_check_announce(struct net_device *hsr_dev,
|
||||
&& (old_operstate != IF_OPER_UP)) {
|
||||
/* Went up */
|
||||
hsr->announce_count = 0;
|
||||
hsr->announce_timer.expires = jiffies +
|
||||
msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
|
||||
add_timer(&hsr->announce_timer);
|
||||
mod_timer(&hsr->announce_timer,
|
||||
jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL));
|
||||
}
|
||||
|
||||
if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP))
|
||||
@@ -331,6 +330,7 @@ static void hsr_announce(unsigned long data)
|
||||
{
|
||||
struct hsr_priv *hsr;
|
||||
struct hsr_port *master;
|
||||
unsigned long interval;
|
||||
|
||||
hsr = (struct hsr_priv *) data;
|
||||
|
||||
@@ -342,18 +342,16 @@ static void hsr_announce(unsigned long data)
|
||||
hsr->protVersion);
|
||||
hsr->announce_count++;
|
||||
|
||||
hsr->announce_timer.expires = jiffies +
|
||||
msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
|
||||
interval = msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
|
||||
} else {
|
||||
send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK,
|
||||
hsr->protVersion);
|
||||
|
||||
hsr->announce_timer.expires = jiffies +
|
||||
msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
|
||||
interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
|
||||
}
|
||||
|
||||
if (is_admin_up(master->dev))
|
||||
add_timer(&hsr->announce_timer);
|
||||
mod_timer(&hsr->announce_timer, jiffies + interval);
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
@@ -485,7 +483,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
|
||||
|
||||
res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER);
|
||||
if (res)
|
||||
return res;
|
||||
goto err_add_port;
|
||||
|
||||
res = register_netdevice(hsr_dev);
|
||||
if (res)
|
||||
@@ -505,6 +503,8 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
|
||||
fail:
|
||||
hsr_for_each_port(hsr, port)
|
||||
hsr_del_port(port);
|
||||
err_add_port:
|
||||
hsr_del_node(&hsr->self_node_db);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -124,6 +124,18 @@ int hsr_create_self_node(struct list_head *self_node_db,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hsr_del_node(struct list_head *self_node_db)
|
||||
{
|
||||
struct hsr_node *node;
|
||||
|
||||
rcu_read_lock();
|
||||
node = list_first_or_null_rcu(self_node_db, struct hsr_node, mac_list);
|
||||
rcu_read_unlock();
|
||||
if (node) {
|
||||
list_del_rcu(&node->mac_list);
|
||||
kfree(node);
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate an hsr_node and add it to node_db. 'addr' is the node's AddressA;
|
||||
* seq_out is used to initialize filtering of outgoing duplicate frames
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
struct hsr_node;
|
||||
|
||||
void hsr_del_node(struct list_head *self_node_db);
|
||||
struct hsr_node *hsr_add_node(struct list_head *node_db, unsigned char addr[],
|
||||
u16 seq_out);
|
||||
struct hsr_node *hsr_get_node(struct hsr_port *port, struct sk_buff *skb,
|
||||
|
||||
@@ -790,7 +790,6 @@ static void inet_child_forget(struct sock *sk, struct request_sock *req,
|
||||
tcp_sk(child)->fastopen_rsk = NULL;
|
||||
}
|
||||
inet_csk_destroy_sock(child);
|
||||
reqsk_put(req);
|
||||
}
|
||||
|
||||
struct sock *inet_csk_reqsk_queue_add(struct sock *sk,
|
||||
@@ -861,6 +860,7 @@ void inet_csk_listen_stop(struct sock *sk)
|
||||
sock_hold(child);
|
||||
|
||||
inet_child_forget(sk, req, child);
|
||||
reqsk_put(req);
|
||||
bh_unlock_sock(child);
|
||||
local_bh_enable();
|
||||
sock_put(child);
|
||||
|
||||
@@ -1619,6 +1619,10 @@ static void ip_del_fnhe(struct fib_nh *nh, __be32 daddr)
|
||||
if (fnhe->fnhe_daddr == daddr) {
|
||||
rcu_assign_pointer(*fnhe_p, rcu_dereference_protected(
|
||||
fnhe->fnhe_next, lockdep_is_held(&fnhe_lock)));
|
||||
/* set fnhe_daddr to 0 to ensure it won't bind with
|
||||
* new dsts in rt_bind_exception().
|
||||
*/
|
||||
fnhe->fnhe_daddr = 0;
|
||||
fnhe_flush_routes(fnhe);
|
||||
kfree_rcu(fnhe, rcu);
|
||||
break;
|
||||
|
||||
@@ -225,7 +225,12 @@ struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb,
|
||||
if (child) {
|
||||
atomic_set(&req->rsk_refcnt, 1);
|
||||
sock_rps_save_rxhash(child, skb);
|
||||
inet_csk_reqsk_queue_add(sk, req, child);
|
||||
if (!inet_csk_reqsk_queue_add(sk, req, child)) {
|
||||
bh_unlock_sock(child);
|
||||
sock_put(child);
|
||||
child = NULL;
|
||||
reqsk_put(req);
|
||||
}
|
||||
} else {
|
||||
reqsk_free(req);
|
||||
}
|
||||
|
||||
@@ -6476,7 +6476,13 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
||||
af_ops->send_synack(fastopen_sk, dst, &fl, req,
|
||||
&foc, TCP_SYNACK_FASTOPEN);
|
||||
/* Add the child socket directly into the accept queue */
|
||||
inet_csk_reqsk_queue_add(sk, req, fastopen_sk);
|
||||
if (!inet_csk_reqsk_queue_add(sk, req, fastopen_sk)) {
|
||||
reqsk_fastopen_remove(fastopen_sk, req, false);
|
||||
bh_unlock_sock(fastopen_sk);
|
||||
sock_put(fastopen_sk);
|
||||
reqsk_put(req);
|
||||
goto drop;
|
||||
}
|
||||
sk->sk_data_ready(sk);
|
||||
bh_unlock_sock(fastopen_sk);
|
||||
sock_put(fastopen_sk);
|
||||
|
||||
@@ -3190,7 +3190,7 @@ static int rt6_fill_node(struct net *net,
|
||||
table = rt->rt6i_table->tb6_id;
|
||||
else
|
||||
table = RT6_TABLE_UNSPEC;
|
||||
rtm->rtm_table = table;
|
||||
rtm->rtm_table = table < 256 ? table : RT_TABLE_COMPAT;
|
||||
if (nla_put_u32(skb, RTA_TABLE, table))
|
||||
goto nla_put_failure;
|
||||
if (rt->rt6i_flags & RTF_REJECT) {
|
||||
|
||||
@@ -767,8 +767,9 @@ static bool check_6rd(struct ip_tunnel *tunnel, const struct in6_addr *v6dst,
|
||||
pbw0 = tunnel->ip6rd.prefixlen >> 5;
|
||||
pbi0 = tunnel->ip6rd.prefixlen & 0x1f;
|
||||
|
||||
d = (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
|
||||
tunnel->ip6rd.relay_prefixlen;
|
||||
d = tunnel->ip6rd.relay_prefixlen < 32 ?
|
||||
(ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
|
||||
tunnel->ip6rd.relay_prefixlen : 0;
|
||||
|
||||
pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen;
|
||||
if (pbi1 > 0)
|
||||
|
||||
@@ -681,9 +681,6 @@ static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
if (flags & MSG_OOB)
|
||||
goto out;
|
||||
|
||||
if (addr_len)
|
||||
*addr_len = sizeof(*lsa);
|
||||
|
||||
if (flags & MSG_ERRQUEUE)
|
||||
return ipv6_recv_error(sk, msg, len, addr_len);
|
||||
|
||||
@@ -713,6 +710,7 @@ static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
lsa->l2tp_conn_id = 0;
|
||||
if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL)
|
||||
lsa->l2tp_scope_id = inet6_iif(skb);
|
||||
*addr_len = sizeof(*lsa);
|
||||
}
|
||||
|
||||
if (np->rxopt.all)
|
||||
|
||||
@@ -355,7 +355,7 @@ static int rxrpc_get_client_conn(struct rxrpc_call *call,
|
||||
* normally have to take channel_lock but we do this before anyone else
|
||||
* can see the connection.
|
||||
*/
|
||||
list_add_tail(&call->chan_wait_link, &candidate->waiting_calls);
|
||||
list_add(&call->chan_wait_link, &candidate->waiting_calls);
|
||||
|
||||
if (cp->exclusive) {
|
||||
call->conn = candidate;
|
||||
@@ -430,7 +430,7 @@ found_extant_conn:
|
||||
spin_lock(&conn->channel_lock);
|
||||
call->conn = conn;
|
||||
call->security_ix = conn->security_ix;
|
||||
list_add(&call->chan_wait_link, &conn->waiting_calls);
|
||||
list_add_tail(&call->chan_wait_link, &conn->waiting_calls);
|
||||
spin_unlock(&conn->channel_lock);
|
||||
_leave(" = 0 [extant %d]", conn->debug_id);
|
||||
return 0;
|
||||
|
||||
@@ -891,7 +891,7 @@ retry:
|
||||
addr->hash ^= sk->sk_type;
|
||||
|
||||
__unix_remove_socket(sk);
|
||||
u->addr = addr;
|
||||
smp_store_release(&u->addr, addr);
|
||||
__unix_insert_socket(&unix_socket_table[addr->hash], sk);
|
||||
spin_unlock(&unix_table_lock);
|
||||
err = 0;
|
||||
@@ -1065,7 +1065,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
|
||||
err = 0;
|
||||
__unix_remove_socket(sk);
|
||||
u->addr = addr;
|
||||
smp_store_release(&u->addr, addr);
|
||||
__unix_insert_socket(list, sk);
|
||||
|
||||
out_unlock:
|
||||
@@ -1336,15 +1336,29 @@ restart:
|
||||
RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);
|
||||
otheru = unix_sk(other);
|
||||
|
||||
/* copy address information from listening to new sock*/
|
||||
if (otheru->addr) {
|
||||
atomic_inc(&otheru->addr->refcnt);
|
||||
newu->addr = otheru->addr;
|
||||
}
|
||||
/* copy address information from listening to new sock
|
||||
*
|
||||
* The contents of *(otheru->addr) and otheru->path
|
||||
* are seen fully set up here, since we have found
|
||||
* otheru in hash under unix_table_lock. Insertion
|
||||
* into the hash chain we'd found it in had been done
|
||||
* in an earlier critical area protected by unix_table_lock,
|
||||
* the same one where we'd set *(otheru->addr) contents,
|
||||
* as well as otheru->path and otheru->addr itself.
|
||||
*
|
||||
* Using smp_store_release() here to set newu->addr
|
||||
* is enough to make those stores, as well as stores
|
||||
* to newu->path visible to anyone who gets newu->addr
|
||||
* by smp_load_acquire(). IOW, the same warranties
|
||||
* as for unix_sock instances bound in unix_bind() or
|
||||
* in unix_autobind().
|
||||
*/
|
||||
if (otheru->path.dentry) {
|
||||
path_get(&otheru->path);
|
||||
newu->path = otheru->path;
|
||||
}
|
||||
atomic_inc(&otheru->addr->refcnt);
|
||||
smp_store_release(&newu->addr, otheru->addr);
|
||||
|
||||
/* Set credentials */
|
||||
copy_peercred(sk, other);
|
||||
@@ -1457,7 +1471,7 @@ out:
|
||||
static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct unix_sock *u;
|
||||
struct unix_address *addr;
|
||||
DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr);
|
||||
int err = 0;
|
||||
|
||||
@@ -1472,19 +1486,15 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
|
||||
sock_hold(sk);
|
||||
}
|
||||
|
||||
u = unix_sk(sk);
|
||||
unix_state_lock(sk);
|
||||
if (!u->addr) {
|
||||
addr = smp_load_acquire(&unix_sk(sk)->addr);
|
||||
if (!addr) {
|
||||
sunaddr->sun_family = AF_UNIX;
|
||||
sunaddr->sun_path[0] = 0;
|
||||
*uaddr_len = sizeof(short);
|
||||
} else {
|
||||
struct unix_address *addr = u->addr;
|
||||
|
||||
*uaddr_len = addr->len;
|
||||
memcpy(sunaddr, addr->name, *uaddr_len);
|
||||
}
|
||||
unix_state_unlock(sk);
|
||||
sock_put(sk);
|
||||
out:
|
||||
return err;
|
||||
@@ -2098,11 +2108,11 @@ static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
|
||||
static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr);
|
||||
|
||||
if (u->addr) {
|
||||
msg->msg_namelen = u->addr->len;
|
||||
memcpy(msg->msg_name, u->addr->name, u->addr->len);
|
||||
if (addr) {
|
||||
msg->msg_namelen = addr->len;
|
||||
memcpy(msg->msg_name, addr->name, addr->len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2818,7 +2828,7 @@ static int unix_seq_show(struct seq_file *seq, void *v)
|
||||
(s->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING),
|
||||
sock_i_ino(s));
|
||||
|
||||
if (u->addr) {
|
||||
if (u->addr) { // under unix_table_lock here
|
||||
int i, len;
|
||||
seq_putc(seq, ' ');
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb)
|
||||
{
|
||||
struct unix_address *addr = unix_sk(sk)->addr;
|
||||
/* might or might not have unix_table_lock */
|
||||
struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr);
|
||||
|
||||
if (!addr)
|
||||
return 0;
|
||||
|
||||
@@ -678,8 +678,7 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
|
||||
int len, i, rc = 0;
|
||||
|
||||
if (!sock_flag(sk, SOCK_ZAPPED) ||
|
||||
addr_len != sizeof(struct sockaddr_x25) ||
|
||||
if (addr_len != sizeof(struct sockaddr_x25) ||
|
||||
addr->sx25_family != AF_X25) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
@@ -694,9 +693,13 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
}
|
||||
|
||||
lock_sock(sk);
|
||||
x25_sk(sk)->source_addr = addr->sx25_addr;
|
||||
x25_insert_socket(sk);
|
||||
sock_reset_flag(sk, SOCK_ZAPPED);
|
||||
if (sock_flag(sk, SOCK_ZAPPED)) {
|
||||
x25_sk(sk)->source_addr = addr->sx25_addr;
|
||||
x25_insert_socket(sk);
|
||||
sock_reset_flag(sk, SOCK_ZAPPED);
|
||||
} else {
|
||||
rc = -EINVAL;
|
||||
}
|
||||
release_sock(sk);
|
||||
SOCK_DEBUG(sk, "x25_bind: socket is bound\n");
|
||||
out:
|
||||
@@ -812,8 +815,13 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
|
||||
sock->state = SS_CONNECTED;
|
||||
rc = 0;
|
||||
out_put_neigh:
|
||||
if (rc)
|
||||
if (rc) {
|
||||
read_lock_bh(&x25_list_lock);
|
||||
x25_neigh_put(x25->neighbour);
|
||||
x25->neighbour = NULL;
|
||||
read_unlock_bh(&x25_list_lock);
|
||||
x25->state = X25_STATE_0;
|
||||
}
|
||||
out_put_route:
|
||||
x25_route_put(rt);
|
||||
out:
|
||||
|
||||
@@ -187,7 +187,7 @@ static int proc_keys_show(struct seq_file *m, void *v)
|
||||
|
||||
struct keyring_search_context ctx = {
|
||||
.index_key = key->index_key,
|
||||
.cred = current_cred(),
|
||||
.cred = m->file->f_cred,
|
||||
.match_data.cmp = lookup_user_key_possessed,
|
||||
.match_data.raw_data = key,
|
||||
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
|
||||
@@ -207,11 +207,7 @@ static int proc_keys_show(struct seq_file *m, void *v)
|
||||
}
|
||||
}
|
||||
|
||||
/* check whether the current task is allowed to view the key (assuming
|
||||
* non-possession)
|
||||
* - the caller holds a spinlock, and thus the RCU read lock, making our
|
||||
* access to __current_cred() safe
|
||||
*/
|
||||
/* check whether the current task is allowed to view the key */
|
||||
rc = key_task_permission(key_ref, ctx.cred, KEY_NEED_VIEW);
|
||||
if (rc < 0)
|
||||
return 0;
|
||||
|
||||
@@ -321,6 +321,7 @@ static void dump_common_audit_data(struct audit_buffer *ab,
|
||||
if (a->u.net->sk) {
|
||||
struct sock *sk = a->u.net->sk;
|
||||
struct unix_sock *u;
|
||||
struct unix_address *addr;
|
||||
int len = 0;
|
||||
char *p = NULL;
|
||||
|
||||
@@ -351,14 +352,15 @@ static void dump_common_audit_data(struct audit_buffer *ab,
|
||||
#endif
|
||||
case AF_UNIX:
|
||||
u = unix_sk(sk);
|
||||
addr = smp_load_acquire(&u->addr);
|
||||
if (!addr)
|
||||
break;
|
||||
if (u->path.dentry) {
|
||||
audit_log_d_path(ab, " path=", &u->path);
|
||||
break;
|
||||
}
|
||||
if (!u->addr)
|
||||
break;
|
||||
len = u->addr->len-sizeof(short);
|
||||
p = &u->addr->name->sun_path[0];
|
||||
len = addr->len-sizeof(short);
|
||||
p = &addr->name->sun_path[0];
|
||||
audit_log_format(ab, " path=");
|
||||
if (*p)
|
||||
audit_log_untrustedstring(ab, p);
|
||||
|
||||
@@ -474,7 +474,19 @@ static const struct ieee1394_device_id bebob_id_table[] = {
|
||||
/* Focusrite, SaffirePro 26 I/O */
|
||||
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000003, &saffirepro_26_spec),
|
||||
/* Focusrite, SaffirePro 10 I/O */
|
||||
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000006, &saffirepro_10_spec),
|
||||
{
|
||||
// The combination of vendor_id and model_id is the same as the
|
||||
// same as the one of Liquid Saffire 56.
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_MODEL_ID |
|
||||
IEEE1394_MATCH_SPECIFIER_ID |
|
||||
IEEE1394_MATCH_VERSION,
|
||||
.vendor_id = VEN_FOCUSRITE,
|
||||
.model_id = 0x000006,
|
||||
.specifier_id = 0x00a02d,
|
||||
.version = 0x010001,
|
||||
.driver_data = (kernel_ulong_t)&saffirepro_10_spec,
|
||||
},
|
||||
/* Focusrite, Saffire(no label and LE) */
|
||||
SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, MODEL_FOCUSRITE_SAFFIRE_BOTH,
|
||||
&saffire_spec),
|
||||
|
||||
Reference in New Issue
Block a user