upgrade 3.12 to 3.12.10
Signed-off-by: Imre Kaloz <kaloz@openwrt.org> SVN-Revision: 39581
This commit is contained in:
parent
4c1dabb81e
commit
83d9cec491
13 changed files with 166 additions and 149 deletions
|
@ -20,8 +20,8 @@ endif
|
||||||
ifeq ($(LINUX_VERSION),3.10.28)
|
ifeq ($(LINUX_VERSION),3.10.28)
|
||||||
LINUX_KERNEL_MD5SUM:=789a39e8a381a60e46fe922cb66d77e2
|
LINUX_KERNEL_MD5SUM:=789a39e8a381a60e46fe922cb66d77e2
|
||||||
endif
|
endif
|
||||||
ifeq ($(LINUX_VERSION),3.12.5)
|
ifeq ($(LINUX_VERSION),3.12.10)
|
||||||
LINUX_KERNEL_MD5SUM:=5b5330f657f562f7bef6da100a7133b1
|
LINUX_KERNEL_MD5SUM:=93325074b7b1d7bb76fb7d4348f0aa7a
|
||||||
endif
|
endif
|
||||||
ifeq ($(LINUX_VERSION),3.13.1)
|
ifeq ($(LINUX_VERSION),3.13.1)
|
||||||
LINUX_KERNEL_MD5SUM:=18f528e5632f0096e642c511722630dc
|
LINUX_KERNEL_MD5SUM:=18f528e5632f0096e642c511722630dc
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
{USB_DEVICE(0x0af0, 0xd155)},
|
{USB_DEVICE(0x0af0, 0xd155)},
|
||||||
--- a/drivers/usb/storage/unusual_devs.h
|
--- a/drivers/usb/storage/unusual_devs.h
|
||||||
+++ b/drivers/usb/storage/unusual_devs.h
|
+++ b/drivers/usb/storage/unusual_devs.h
|
||||||
@@ -1259,6 +1259,18 @@ UNUSUAL_DEV( 0x0af0, 0x8304, 0x0000, 0x0
|
@@ -1266,6 +1266,18 @@ UNUSUAL_DEV( 0x0af0, 0x8304, 0x0000, 0x0
|
||||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||||
0 ),
|
0 ),
|
||||||
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
From 673498b8ed4c4d4b7221c5309d891c5eac2b7528 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stefan Tomanek <stefan.tomanek@wertarbyte.de>
|
|
||||||
Date: Tue, 10 Dec 2013 23:21:25 +0100
|
|
||||||
Subject: [PATCH] inet: fix NULL pointer Oops in fib(6)_rule_suppress
|
|
||||||
|
|
||||||
This changes ensures that the routing entry investigated by the suppress
|
|
||||||
function actually does point to a device struct before following that pointer,
|
|
||||||
fixing a possible kernel oops situation when verifying the interface group
|
|
||||||
associated with a routing table entry.
|
|
||||||
|
|
||||||
According to Daniel Golle, this Oops can be triggered by a user process trying
|
|
||||||
to establish an outgoing IPv6 connection while having no real IPv6 connectivity
|
|
||||||
set up (only autoassigned link-local addresses).
|
|
||||||
|
|
||||||
Fixes: 6ef94cfafba15 ("fib_rules: add route suppression based on ifgroup")
|
|
||||||
|
|
||||||
Reported-by: Daniel Golle <daniel.golle@gmail.com>
|
|
||||||
Tested-by: Daniel Golle <daniel.golle@gmail.com>
|
|
||||||
Signed-off-by: Stefan Tomanek <stefan.tomanek@wertarbyte.de>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
net/ipv4/fib_rules.c | 5 ++++-
|
|
||||||
net/ipv6/fib6_rules.c | 6 +++++-
|
|
||||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
--- a/net/ipv4/fib_rules.c
|
|
||||||
+++ b/net/ipv4/fib_rules.c
|
|
||||||
@@ -104,7 +104,10 @@ errout:
|
|
||||||
static bool fib4_rule_suppress(struct fib_rule *rule, struct fib_lookup_arg *arg)
|
|
||||||
{
|
|
||||||
struct fib_result *result = (struct fib_result *) arg->result;
|
|
||||||
- struct net_device *dev = result->fi->fib_dev;
|
|
||||||
+ struct net_device *dev = NULL;
|
|
||||||
+
|
|
||||||
+ if (result->fi)
|
|
||||||
+ dev = result->fi->fib_dev;
|
|
||||||
|
|
||||||
/* do not accept result if the route does
|
|
||||||
* not meet the required prefix length
|
|
||||||
--- a/net/ipv6/fib6_rules.c
|
|
||||||
+++ b/net/ipv6/fib6_rules.c
|
|
||||||
@@ -122,7 +122,11 @@ out:
|
|
||||||
static bool fib6_rule_suppress(struct fib_rule *rule, struct fib_lookup_arg *arg)
|
|
||||||
{
|
|
||||||
struct rt6_info *rt = (struct rt6_info *) arg->result;
|
|
||||||
- struct net_device *dev = rt->rt6i_idev->dev;
|
|
||||||
+ struct net_device *dev = NULL;
|
|
||||||
+
|
|
||||||
+ if (rt->rt6i_idev)
|
|
||||||
+ dev = rt->rt6i_idev->dev;
|
|
||||||
+
|
|
||||||
/* do not accept result if the route does
|
|
||||||
* not meet the required prefix length
|
|
||||||
*/
|
|
|
@ -61,10 +61,10 @@ Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
||||||
retval = pdata->pre_setup(hcd);
|
retval = pdata->pre_setup(hcd);
|
||||||
--- a/drivers/usb/host/ehci.h
|
--- a/drivers/usb/host/ehci.h
|
||||||
+++ b/drivers/usb/host/ehci.h
|
+++ b/drivers/usb/host/ehci.h
|
||||||
@@ -203,6 +203,7 @@ struct ehci_hcd { /* one per controlle
|
@@ -204,6 +204,7 @@ struct ehci_hcd { /* one per controlle
|
||||||
unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
|
|
||||||
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
||||||
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
||||||
|
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
||||||
+ unsigned ignore_oc:1;
|
+ unsigned ignore_oc:1;
|
||||||
|
|
||||||
/* required for usb32 quirk */
|
/* required for usb32 quirk */
|
||||||
|
|
|
@ -71,9 +71,9 @@
|
||||||
|
|
||||||
--- a/scripts/link-vmlinux.sh
|
--- a/scripts/link-vmlinux.sh
|
||||||
+++ b/scripts/link-vmlinux.sh
|
+++ b/scripts/link-vmlinux.sh
|
||||||
@@ -84,6 +84,10 @@ kallsyms()
|
@@ -86,6 +86,10 @@ kallsyms()
|
||||||
|
kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET"
|
||||||
kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET"
|
fi
|
||||||
|
|
||||||
+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then
|
+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then
|
||||||
+ kallsymopt="${kallsymopt} --uncompressed"
|
+ kallsymopt="${kallsymopt} --uncompressed"
|
||||||
|
|
|
@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
#define PACKET_FANOUT_LB 1
|
#define PACKET_FANOUT_LB 1
|
||||||
--- a/net/packet/af_packet.c
|
--- a/net/packet/af_packet.c
|
||||||
+++ b/net/packet/af_packet.c
|
+++ b/net/packet/af_packet.c
|
||||||
@@ -1393,6 +1393,7 @@ static int packet_rcv_spkt(struct sk_buf
|
@@ -1414,6 +1414,7 @@ static int packet_rcv_spkt(struct sk_buf
|
||||||
{
|
{
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
struct sockaddr_pkt *spkt;
|
struct sockaddr_pkt *spkt;
|
||||||
|
@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When we registered the protocol we saved the socket in the data
|
* When we registered the protocol we saved the socket in the data
|
||||||
@@ -1400,6 +1401,7 @@ static int packet_rcv_spkt(struct sk_buf
|
@@ -1421,6 +1422,7 @@ static int packet_rcv_spkt(struct sk_buf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sk = pt->af_packet_priv;
|
sk = pt->af_packet_priv;
|
||||||
|
@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Yank back the headers [hope the device set this
|
* Yank back the headers [hope the device set this
|
||||||
@@ -1412,7 +1414,7 @@ static int packet_rcv_spkt(struct sk_buf
|
@@ -1433,7 +1435,7 @@ static int packet_rcv_spkt(struct sk_buf
|
||||||
* so that this procedure is noop.
|
* so that this procedure is noop.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!net_eq(dev_net(dev), sock_net(sk)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
@@ -1619,12 +1621,12 @@ static int packet_rcv(struct sk_buff *sk
|
@@ -1640,12 +1642,12 @@ static int packet_rcv(struct sk_buff *sk
|
||||||
int skb_len = skb->len;
|
int skb_len = skb->len;
|
||||||
unsigned int snaplen, res;
|
unsigned int snaplen, res;
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
if (!net_eq(dev_net(dev), sock_net(sk)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
@@ -1737,12 +1739,12 @@ static int tpacket_rcv(struct sk_buff *s
|
@@ -1758,12 +1760,12 @@ static int tpacket_rcv(struct sk_buff *s
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
__u32 ts_status;
|
__u32 ts_status;
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
if (!net_eq(dev_net(dev), sock_net(sk)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
@@ -2638,6 +2640,7 @@ static int packet_create(struct net *net
|
@@ -2652,6 +2654,7 @@ static int packet_create(struct net *net
|
||||||
spin_lock_init(&po->bind_lock);
|
spin_lock_init(&po->bind_lock);
|
||||||
mutex_init(&po->pg_vec_lock);
|
mutex_init(&po->pg_vec_lock);
|
||||||
po->prot_hook.func = packet_rcv;
|
po->prot_hook.func = packet_rcv;
|
||||||
|
@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
|
||||||
if (sock->type == SOCK_PACKET)
|
if (sock->type == SOCK_PACKET)
|
||||||
po->prot_hook.func = packet_rcv_spkt;
|
po->prot_hook.func = packet_rcv_spkt;
|
||||||
@@ -3204,6 +3207,16 @@ packet_setsockopt(struct socket *sock, i
|
@@ -3218,6 +3221,16 @@ packet_setsockopt(struct socket *sock, i
|
||||||
po->tp_tx_has_off = !!val;
|
po->tp_tx_has_off = !!val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
default:
|
default:
|
||||||
return -ENOPROTOOPT;
|
return -ENOPROTOOPT;
|
||||||
}
|
}
|
||||||
@@ -3255,6 +3268,13 @@ static int packet_getsockopt(struct sock
|
@@ -3269,6 +3282,13 @@ static int packet_getsockopt(struct sock
|
||||||
case PACKET_VNET_HDR:
|
case PACKET_VNET_HDR:
|
||||||
val = po->has_vnet_hdr;
|
val = po->has_vnet_hdr;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -96,7 +96,7 @@
|
||||||
if (vlan_tx_tag_present(skb))
|
if (vlan_tx_tag_present(skb))
|
||||||
--- a/net/bridge/br_private.h
|
--- a/net/bridge/br_private.h
|
||||||
+++ b/net/bridge/br_private.h
|
+++ b/net/bridge/br_private.h
|
||||||
@@ -725,15 +725,29 @@ static inline u16 br_get_pvid(const stru
|
@@ -735,15 +735,29 @@ static inline u16 br_get_pvid(const stru
|
||||||
|
|
||||||
/* br_netfilter.c */
|
/* br_netfilter.c */
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/include/linux/skbuff.h
|
--- a/include/linux/skbuff.h
|
||||||
+++ b/include/linux/skbuff.h
|
+++ b/include/linux/skbuff.h
|
||||||
@@ -1741,7 +1741,7 @@ static inline int pskb_network_may_pull(
|
@@ -1746,7 +1746,7 @@ static inline int pskb_network_may_pull(
|
||||||
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
|
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
|
||||||
*/
|
*/
|
||||||
#ifndef NET_SKB_PAD
|
#ifndef NET_SKB_PAD
|
||||||
|
|
|
@ -14,7 +14,7 @@ when needed.
|
||||||
|
|
||||||
--- a/include/linux/skbuff.h
|
--- a/include/linux/skbuff.h
|
||||||
+++ b/include/linux/skbuff.h
|
+++ b/include/linux/skbuff.h
|
||||||
@@ -1786,6 +1786,24 @@ static inline void pskb_trim_unique(stru
|
@@ -1791,6 +1791,24 @@ static inline void pskb_trim_unique(stru
|
||||||
BUG_ON(err);
|
BUG_ON(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,32 @@
|
||||||
|
From 1b5aaa4b16f6e6471ab1c07b38068197a1b4c395 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Fri, 24 May 2013 14:40:54 +0200
|
||||||
|
Subject: [PATCH 1/2] ipv6: allow rejecting with "source address failed policy"
|
||||||
|
|
||||||
|
RFC6204 L-14 requires rejecting traffic from invalid addresses with
|
||||||
|
ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/
|
||||||
|
egress policy) on the LAN side, so add an appropriate rule for that.
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
---
|
||||||
|
include/net/netns/ipv6.h | 1 +
|
||||||
|
include/uapi/linux/fib_rules.h | 4 +++
|
||||||
|
include/uapi/linux/rtnetlink.h | 1 +
|
||||||
|
net/ipv4/fib_semantics.c | 4 +++
|
||||||
|
net/ipv4/fib_trie.c | 1 +
|
||||||
|
net/ipv4/ipmr.c | 1 +
|
||||||
|
net/ipv6/fib6_rules.c | 4 +++
|
||||||
|
net/ipv6/ip6mr.c | 2 ++
|
||||||
|
net/ipv6/route.c | 58 +++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
9 files changed, 75 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
--- a/include/net/netns/ipv6.h
|
--- a/include/net/netns/ipv6.h
|
||||||
+++ b/include/net/netns/ipv6.h
|
+++ b/include/net/netns/ipv6.h
|
||||||
@@ -55,6 +55,7 @@ struct netns_ipv6 {
|
@@ -55,6 +55,7 @@ struct netns_ipv6 {
|
||||||
unsigned long ip6_rt_last_gc;
|
unsigned long ip6_rt_last_gc;
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
struct rt6_info *ip6_prohibit_entry;
|
struct rt6_info *ip6_prohibit_entry;
|
||||||
+ struct rt6_info *ip6_failed_policy_entry;
|
+ struct rt6_info *ip6_policy_failed_entry;
|
||||||
struct rt6_info *ip6_blk_hole_entry;
|
struct rt6_info *ip6_blk_hole_entry;
|
||||||
struct fib6_table *fib6_local_tbl;
|
struct fib6_table *fib6_local_tbl;
|
||||||
struct fib_rules_ops *fib6_rules_ops;
|
struct fib_rules_ops *fib6_rules_ops;
|
||||||
|
@ -17,7 +39,7 @@
|
||||||
+ FR_ACT_RES9,
|
+ FR_ACT_RES9,
|
||||||
+ FR_ACT_RES10,
|
+ FR_ACT_RES10,
|
||||||
+ FR_ACT_RES11,
|
+ FR_ACT_RES11,
|
||||||
+ FR_ACT_FAILED_POLICY, /* Drop with EPERM */
|
+ FR_ACT_POLICY_FAILED, /* Drop with EACCES */
|
||||||
__FR_ACT_MAX,
|
__FR_ACT_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,31 +49,18 @@
|
||||||
RTN_THROW, /* Not in this table */
|
RTN_THROW, /* Not in this table */
|
||||||
RTN_NAT, /* Translate this address */
|
RTN_NAT, /* Translate this address */
|
||||||
RTN_XRESOLVE, /* Use external resolver */
|
RTN_XRESOLVE, /* Use external resolver */
|
||||||
+ RTN_FAILED_POLICY, /* Failed ingress/egress policy */
|
+ RTN_POLICY_FAILED, /* Failed ingress/egress policy */
|
||||||
__RTN_MAX
|
__RTN_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
--- a/net/ipv4/fib_rules.c
|
|
||||||
+++ b/net/ipv4/fib_rules.c
|
|
||||||
@@ -84,6 +84,10 @@ static int fib4_rule_action(struct fib_r
|
|
||||||
err = -EACCES;
|
|
||||||
goto errout;
|
|
||||||
|
|
||||||
+ case FR_ACT_FAILED_POLICY:
|
|
||||||
+ err = -EPERM;
|
|
||||||
+ goto errout;
|
|
||||||
+
|
|
||||||
case FR_ACT_BLACKHOLE:
|
|
||||||
default:
|
|
||||||
err = -EINVAL;
|
|
||||||
--- a/net/ipv4/fib_semantics.c
|
--- a/net/ipv4/fib_semantics.c
|
||||||
+++ b/net/ipv4/fib_semantics.c
|
+++ b/net/ipv4/fib_semantics.c
|
||||||
@@ -138,6 +138,10 @@ const struct fib_prop fib_props[RTN_MAX
|
@@ -138,6 +138,10 @@ const struct fib_prop fib_props[RTN_MAX
|
||||||
.error = -EINVAL,
|
.error = -EINVAL,
|
||||||
.scope = RT_SCOPE_NOWHERE,
|
.scope = RT_SCOPE_NOWHERE,
|
||||||
},
|
},
|
||||||
+ [RTN_FAILED_POLICY] = {
|
+ [RTN_POLICY_FAILED] = {
|
||||||
+ .error = -EPERM,
|
+ .error = -EACCES,
|
||||||
+ .scope = RT_SCOPE_UNIVERSE,
|
+ .scope = RT_SCOPE_UNIVERSE,
|
||||||
+ },
|
+ },
|
||||||
};
|
};
|
||||||
|
@ -63,60 +72,67 @@
|
||||||
[RTN_THROW] = "THROW",
|
[RTN_THROW] = "THROW",
|
||||||
[RTN_NAT] = "NAT",
|
[RTN_NAT] = "NAT",
|
||||||
[RTN_XRESOLVE] = "XRESOLVE",
|
[RTN_XRESOLVE] = "XRESOLVE",
|
||||||
+ [RTN_FAILED_POLICY] = "FAILED_POLICY",
|
+ [RTN_POLICY_FAILED] = "POLICY_FAILED",
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
|
static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
|
||||||
--- a/net/ipv4/ipmr.c
|
--- a/net/ipv4/ipmr.c
|
||||||
+++ b/net/ipv4/ipmr.c
|
+++ b/net/ipv4/ipmr.c
|
||||||
@@ -181,6 +181,7 @@ static int ipmr_rule_action(struct fib_r
|
@@ -184,6 +184,7 @@ static int ipmr_rule_action(struct fib_r
|
||||||
case FR_ACT_UNREACHABLE:
|
case FR_ACT_UNREACHABLE:
|
||||||
return -ENETUNREACH;
|
return -ENETUNREACH;
|
||||||
case FR_ACT_PROHIBIT:
|
case FR_ACT_PROHIBIT:
|
||||||
+ case FR_ACT_FAILED_POLICY:
|
+ case FR_ACT_POLICY_FAILED:
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
case FR_ACT_BLACKHOLE:
|
case FR_ACT_BLACKHOLE:
|
||||||
default:
|
default:
|
||||||
--- a/net/ipv6/fib6_rules.c
|
--- a/net/ipv6/fib6_rules.c
|
||||||
+++ b/net/ipv6/fib6_rules.c
|
+++ b/net/ipv6/fib6_rules.c
|
||||||
@@ -73,6 +73,9 @@ static int fib6_rule_action(struct fib_r
|
@@ -73,6 +73,10 @@ static int fib6_rule_action(struct fib_r
|
||||||
err = -EACCES;
|
err = -EACCES;
|
||||||
rt = net->ipv6.ip6_prohibit_entry;
|
rt = net->ipv6.ip6_prohibit_entry;
|
||||||
goto discard_pkt;
|
goto discard_pkt;
|
||||||
+ case FR_ACT_FAILED_POLICY:
|
+ case FR_ACT_POLICY_FAILED:
|
||||||
+ rt = net->ipv6.ip6_failed_policy_entry;
|
+ err = -EACCES;
|
||||||
|
+ rt = net->ipv6.ip6_policy_failed_entry;
|
||||||
+ goto discard_pkt;
|
+ goto discard_pkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
table = fib6_get_table(net, rule->table);
|
table = fib6_get_table(net, rule->table);
|
||||||
--- a/net/ipv6/ip6mr.c
|
--- a/net/ipv6/ip6mr.c
|
||||||
+++ b/net/ipv6/ip6mr.c
|
+++ b/net/ipv6/ip6mr.c
|
||||||
@@ -166,6 +166,8 @@ static int ip6mr_rule_action(struct fib_
|
@@ -169,6 +169,8 @@ static int ip6mr_rule_action(struct fib_
|
||||||
return -ENETUNREACH;
|
return -ENETUNREACH;
|
||||||
case FR_ACT_PROHIBIT:
|
case FR_ACT_PROHIBIT:
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
+ case FR_ACT_FAILED_POLICY:
|
+ case FR_ACT_POLICY_FAILED:
|
||||||
+ return -EPERM;
|
+ return -EACCES;
|
||||||
case FR_ACT_BLACKHOLE:
|
case FR_ACT_BLACKHOLE:
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
--- a/net/ipv6/route.c
|
--- a/net/ipv6/route.c
|
||||||
+++ b/net/ipv6/route.c
|
+++ b/net/ipv6/route.c
|
||||||
@@ -252,6 +252,24 @@ static const struct rt6_info ip6_prohibi
|
@@ -86,6 +86,8 @@ static int ip6_pkt_discard(struct sk_bu
|
||||||
|
static int ip6_pkt_discard_out(struct sk_buff *skb);
|
||||||
|
static int ip6_pkt_prohibit(struct sk_buff *skb);
|
||||||
|
static int ip6_pkt_prohibit_out(struct sk_buff *skb);
|
||||||
|
+static int ip6_pkt_policy_failed(struct sk_buff *skb);
|
||||||
|
+static int ip6_pkt_policy_failed_out(struct sk_buff *skb);
|
||||||
|
static void ip6_link_failure(struct sk_buff *skb);
|
||||||
|
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
||||||
|
struct sk_buff *skb, u32 mtu);
|
||||||
|
@@ -251,6 +253,21 @@ static const struct rt6_info ip6_prohibi
|
||||||
.rt6i_ref = ATOMIC_INIT(1),
|
.rt6i_ref = ATOMIC_INIT(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
+static int ip6_pkt_failed_policy(struct sk_buff *skb);
|
+static const struct rt6_info ip6_policy_failed_entry_template = {
|
||||||
+static int ip6_pkt_failed_policy_out(struct sk_buff *skb);
|
|
||||||
+
|
|
||||||
+static const struct rt6_info ip6_failed_policy_entry_template = {
|
|
||||||
+ .dst = {
|
+ .dst = {
|
||||||
+ .__refcnt = ATOMIC_INIT(1),
|
+ .__refcnt = ATOMIC_INIT(1),
|
||||||
+ .__use = 1,
|
+ .__use = 1,
|
||||||
+ .obsolete = DST_OBSOLETE_FORCE_CHK,
|
+ .obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||||
+ .error = -EPERM,
|
+ .error = -EACCES,
|
||||||
+ .input = ip6_pkt_failed_policy,
|
+ .input = ip6_pkt_policy_failed,
|
||||||
+ .output = ip6_pkt_failed_policy_out,
|
+ .output = ip6_pkt_policy_failed_out,
|
||||||
+ },
|
+ },
|
||||||
+ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
|
+ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
|
||||||
+ .rt6i_protocol = RTPROT_KERNEL,
|
+ .rt6i_protocol = RTPROT_KERNEL,
|
||||||
|
@ -127,82 +143,84 @@
|
||||||
static const struct rt6_info ip6_blk_hole_entry_template = {
|
static const struct rt6_info ip6_blk_hole_entry_template = {
|
||||||
.dst = {
|
.dst = {
|
||||||
.__refcnt = ATOMIC_INIT(1),
|
.__refcnt = ATOMIC_INIT(1),
|
||||||
@@ -1583,6 +1601,9 @@ int ip6_route_add(struct fib6_config *cf
|
@@ -1581,6 +1598,11 @@ int ip6_route_add(struct fib6_config *cf
|
||||||
case RTN_THROW:
|
rt->dst.output = ip6_pkt_prohibit_out;
|
||||||
rt->dst.error = -EAGAIN;
|
rt->dst.input = ip6_pkt_prohibit;
|
||||||
break;
|
break;
|
||||||
+ case RTN_FAILED_POLICY:
|
+ case RTN_POLICY_FAILED:
|
||||||
+ rt->dst.error = -EPERM;
|
+ rt->dst.error = -EACCES;
|
||||||
|
+ rt->dst.output = ip6_pkt_policy_failed_out;
|
||||||
|
+ rt->dst.input = ip6_pkt_policy_failed;
|
||||||
+ break;
|
+ break;
|
||||||
|
case RTN_THROW:
|
||||||
default:
|
default:
|
||||||
rt->dst.error = -ENETUNREACH;
|
rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
|
||||||
break;
|
@@ -2160,6 +2182,17 @@ static int ip6_pkt_prohibit_out(struct s
|
||||||
@@ -2162,6 +2183,17 @@ static int ip6_pkt_prohibit_out(struct s
|
|
||||||
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
+static int ip6_pkt_failed_policy(struct sk_buff *skb)
|
+static int ip6_pkt_policy_failed(struct sk_buff *skb)
|
||||||
+{
|
+{
|
||||||
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);
|
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static int ip6_pkt_failed_policy_out(struct sk_buff *skb)
|
+static int ip6_pkt_policy_failed_out(struct sk_buff *skb)
|
||||||
+{
|
+{
|
||||||
+ skb->dev = skb_dst(skb)->dev;
|
+ skb->dev = skb_dst(skb)->dev;
|
||||||
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);
|
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2368,7 +2400,8 @@ static int rtm_to_fib6_config(struct sk_
|
* Allocate a dst for local (unicast / anycast) address.
|
||||||
|
*/
|
||||||
|
@@ -2362,7 +2395,8 @@ static int rtm_to_fib6_config(struct sk_
|
||||||
if (rtm->rtm_type == RTN_UNREACHABLE ||
|
if (rtm->rtm_type == RTN_UNREACHABLE ||
|
||||||
rtm->rtm_type == RTN_BLACKHOLE ||
|
rtm->rtm_type == RTN_BLACKHOLE ||
|
||||||
rtm->rtm_type == RTN_PROHIBIT ||
|
rtm->rtm_type == RTN_PROHIBIT ||
|
||||||
- rtm->rtm_type == RTN_THROW)
|
- rtm->rtm_type == RTN_THROW)
|
||||||
+ rtm->rtm_type == RTN_THROW ||
|
+ rtm->rtm_type == RTN_THROW ||
|
||||||
+ rtm->rtm_type == RTN_FAILED_POLICY)
|
+ rtm->rtm_type == RTN_POLICY_FAILED)
|
||||||
cfg->fc_flags |= RTF_REJECT;
|
cfg->fc_flags |= RTF_REJECT;
|
||||||
|
|
||||||
if (rtm->rtm_type == RTN_LOCAL)
|
if (rtm->rtm_type == RTN_LOCAL)
|
||||||
@@ -2570,6 +2603,9 @@ static int rt6_fill_node(struct net *net
|
@@ -2564,6 +2598,9 @@ static int rt6_fill_node(struct net *net
|
||||||
case -EACCES:
|
case -EACCES:
|
||||||
rtm->rtm_type = RTN_PROHIBIT;
|
rtm->rtm_type = RTN_PROHIBIT;
|
||||||
break;
|
break;
|
||||||
+ case -EPERM:
|
+ case -EPERM:
|
||||||
+ rtm->rtm_type = RTN_FAILED_POLICY;
|
+ rtm->rtm_type = RTN_POLICY_FAILED;
|
||||||
+ break;
|
+ break;
|
||||||
case -EAGAIN:
|
case -EAGAIN:
|
||||||
rtm->rtm_type = RTN_THROW;
|
rtm->rtm_type = RTN_THROW;
|
||||||
break;
|
break;
|
||||||
@@ -2820,6 +2856,8 @@ static int ip6_route_dev_notify(struct n
|
@@ -2814,6 +2851,8 @@ static int ip6_route_dev_notify(struct n
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
|
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
|
||||||
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
|
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
|
||||||
+ net->ipv6.ip6_failed_policy_entry->dst.dev = dev;
|
+ net->ipv6.ip6_policy_failed_entry->dst.dev = dev;
|
||||||
+ net->ipv6.ip6_failed_policy_entry->rt6i_idev = in6_dev_get(dev);
|
+ net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev);
|
||||||
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
|
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
|
||||||
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
|
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
|
||||||
#endif
|
#endif
|
||||||
@@ -3080,6 +3118,17 @@ static int __net_init ip6_route_net_init
|
@@ -3074,6 +3113,17 @@ static int __net_init ip6_route_net_init
|
||||||
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
||||||
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
|
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
|
||||||
ip6_template_metrics, true);
|
ip6_template_metrics, true);
|
||||||
+
|
+
|
||||||
+ net->ipv6.ip6_failed_policy_entry =
|
+ net->ipv6.ip6_policy_failed_entry =
|
||||||
+ kmemdup(&ip6_failed_policy_entry_template,
|
+ kmemdup(&ip6_policy_failed_entry_template,
|
||||||
+ sizeof(*net->ipv6.ip6_failed_policy_entry), GFP_KERNEL);
|
+ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);
|
||||||
+ if (!net->ipv6.ip6_failed_policy_entry)
|
+ if (!net->ipv6.ip6_policy_failed_entry)
|
||||||
+ goto out_ip6_blk_hole_entry;
|
+ goto out_ip6_blk_hole_entry;
|
||||||
+ net->ipv6.ip6_failed_policy_entry->dst.path =
|
+ net->ipv6.ip6_policy_failed_entry->dst.path =
|
||||||
+ (struct dst_entry *)net->ipv6.ip6_failed_policy_entry;
|
+ (struct dst_entry *)net->ipv6.ip6_policy_failed_entry;
|
||||||
+ net->ipv6.ip6_failed_policy_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
+ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
||||||
+ dst_init_metrics(&net->ipv6.ip6_failed_policy_entry->dst,
|
+ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst,
|
||||||
+ ip6_template_metrics, true);
|
+ ip6_template_metrics, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
net->ipv6.sysctl.flush_delay = 0;
|
net->ipv6.sysctl.flush_delay = 0;
|
||||||
@@ -3098,6 +3147,8 @@ out:
|
@@ -3092,6 +3142,8 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
|
@ -211,20 +229,20 @@
|
||||||
out_ip6_prohibit_entry:
|
out_ip6_prohibit_entry:
|
||||||
kfree(net->ipv6.ip6_prohibit_entry);
|
kfree(net->ipv6.ip6_prohibit_entry);
|
||||||
out_ip6_null_entry:
|
out_ip6_null_entry:
|
||||||
@@ -3115,6 +3166,7 @@ static void __net_exit ip6_route_net_exi
|
@@ -3109,6 +3161,7 @@ static void __net_exit ip6_route_net_exi
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
kfree(net->ipv6.ip6_prohibit_entry);
|
kfree(net->ipv6.ip6_prohibit_entry);
|
||||||
kfree(net->ipv6.ip6_blk_hole_entry);
|
kfree(net->ipv6.ip6_blk_hole_entry);
|
||||||
+ kfree(net->ipv6.ip6_failed_policy_entry);
|
+ kfree(net->ipv6.ip6_policy_failed_entry);
|
||||||
#endif
|
#endif
|
||||||
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
||||||
}
|
}
|
||||||
@@ -3211,6 +3263,9 @@ int __init ip6_route_init(void)
|
@@ -3205,6 +3258,9 @@ int __init ip6_route_init(void)
|
||||||
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
||||||
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
|
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
|
||||||
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
||||||
+ init_net.ipv6.ip6_failed_policy_entry->dst.dev = init_net.loopback_dev;
|
+ init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev;
|
||||||
+ init_net.ipv6.ip6_failed_policy_entry->rt6i_idev =
|
+ init_net.ipv6.ip6_policy_failed_entry->rt6i_idev =
|
||||||
+ in6_dev_get(init_net.loopback_dev);
|
+ in6_dev_get(init_net.loopback_dev);
|
||||||
#endif
|
#endif
|
||||||
ret = fib6_init();
|
ret = fib6_init();
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
From 7749b481ce5d7e232b1f7da5e6b2c44816f51681 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Sun, 19 Jan 2014 20:45:51 +0100
|
||||||
|
Subject: [PATCH 2/2] net: provide defines for _POLICY_FAILED until all code is
|
||||||
|
updated
|
||||||
|
|
||||||
|
Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination
|
||||||
|
unreachable, conflicting with our name.
|
||||||
|
|
||||||
|
Add appropriate defines to allow our code to build with the new
|
||||||
|
name until we have updated our local patches for older kernels
|
||||||
|
and userspace packages.
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
---
|
||||||
|
include/uapi/linux/fib_rules.h | 2 ++
|
||||||
|
include/uapi/linux/icmpv6.h | 2 ++
|
||||||
|
include/uapi/linux/rtnetlink.h | 2 ++
|
||||||
|
3 files changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/include/uapi/linux/fib_rules.h
|
||||||
|
+++ b/include/uapi/linux/fib_rules.h
|
||||||
|
@@ -71,6 +71,8 @@ enum {
|
||||||
|
__FR_ACT_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED
|
||||||
|
+
|
||||||
|
#define FR_ACT_MAX (__FR_ACT_MAX - 1)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--- a/include/uapi/linux/icmpv6.h
|
||||||
|
+++ b/include/uapi/linux/icmpv6.h
|
||||||
|
@@ -118,6 +118,8 @@ struct icmp6hdr {
|
||||||
|
#define ICMPV6_POLICY_FAIL 5
|
||||||
|
#define ICMPV6_REJECT_ROUTE 6
|
||||||
|
|
||||||
|
+#define ICMPV6_FAILED_POLICY ICMPV6_POLICY_FAIL
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Codes for Time Exceeded
|
||||||
|
*/
|
||||||
|
--- a/include/uapi/linux/rtnetlink.h
|
||||||
|
+++ b/include/uapi/linux/rtnetlink.h
|
||||||
|
@@ -207,6 +207,8 @@ enum {
|
||||||
|
__RTN_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define RTN_FAILED_POLICY RTN_POLICY_FAILED
|
||||||
|
+
|
||||||
|
#define RTN_MAX (__RTN_MAX - 1)
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#define IF_GET_IFACE 0x0001 /* for querying only */
|
#define IF_GET_IFACE 0x0001 /* for querying only */
|
||||||
--- a/include/linux/skbuff.h
|
--- a/include/linux/skbuff.h
|
||||||
+++ b/include/linux/skbuff.h
|
+++ b/include/linux/skbuff.h
|
||||||
@@ -1771,6 +1771,10 @@ static inline int pskb_trim(struct sk_bu
|
@@ -1776,6 +1776,10 @@ static inline int pskb_trim(struct sk_bu
|
||||||
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
|
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
/**
|
/**
|
||||||
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
|
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
|
||||||
* @skb: buffer to alter
|
* @skb: buffer to alter
|
||||||
@@ -1898,16 +1902,6 @@ static inline struct sk_buff *dev_alloc_
|
@@ -1903,16 +1907,6 @@ static inline struct sk_buff *dev_alloc_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
||||||
---
|
---
|
||||||
--- a/arch/arm/mach-omap2/omap_hwmod.c
|
--- a/arch/arm/mach-omap2/omap_hwmod.c
|
||||||
+++ b/arch/arm/mach-omap2/omap_hwmod.c
|
+++ b/arch/arm/mach-omap2/omap_hwmod.c
|
||||||
@@ -2357,6 +2357,8 @@ static struct device_node *of_dev_hwmod_
|
@@ -2393,6 +2393,8 @@ static struct device_node *of_dev_hwmod_
|
||||||
/**
|
/**
|
||||||
* _init_mpu_rt_base - populate the virtual address for a hwmod
|
* _init_mpu_rt_base - populate the virtual address for a hwmod
|
||||||
* @oh: struct omap_hwmod * to locate the virtual address
|
* @oh: struct omap_hwmod * to locate the virtual address
|
||||||
|
@ -23,7 +23,7 @@ Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
||||||
*
|
*
|
||||||
* Cache the virtual address used by the MPU to access this IP block's
|
* Cache the virtual address used by the MPU to access this IP block's
|
||||||
* registers. This address is needed early so the OCP registers that
|
* registers. This address is needed early so the OCP registers that
|
||||||
@@ -2365,11 +2367,11 @@ static struct device_node *of_dev_hwmod_
|
@@ -2401,11 +2403,11 @@ static struct device_node *of_dev_hwmod_
|
||||||
* Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
|
* Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
|
||||||
* -ENXIO on absent or invalid register target address space.
|
* -ENXIO on absent or invalid register target address space.
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +37,7 @@ Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
||||||
|
|
||||||
if (!oh)
|
if (!oh)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -2385,12 +2387,10 @@ static int __init _init_mpu_rt_base(stru
|
@@ -2421,12 +2423,10 @@ static int __init _init_mpu_rt_base(stru
|
||||||
oh->name);
|
oh->name);
|
||||||
|
|
||||||
/* Extract the IO space from device tree blob */
|
/* Extract the IO space from device tree blob */
|
||||||
|
@ -52,7 +52,7 @@ Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
||||||
} else {
|
} else {
|
||||||
va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
|
va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
|
||||||
}
|
}
|
||||||
@@ -2423,12 +2423,16 @@ static int __init _init_mpu_rt_base(stru
|
@@ -2459,12 +2459,16 @@ static int __init _init_mpu_rt_base(stru
|
||||||
static int __init _init(struct omap_hwmod *oh, void *data)
|
static int __init _init(struct omap_hwmod *oh, void *data)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
@ -70,7 +70,7 @@ Signed-off-by: Paul Walmsley <paul@pwsan.com>
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
|
WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
|
||||||
oh->name);
|
oh->name);
|
||||||
@@ -2442,6 +2446,12 @@ static int __init _init(struct omap_hwmo
|
@@ -2478,6 +2482,12 @@ static int __init _init(struct omap_hwmo
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue