Merge branch 'master' into next
Conflicts: fs/nfsd/nfs4recover.c Manually fixed above to use new creds API functions, e.g. nfs4_save_creds(). Signed-off-by: James Morris <jmorris@namei.org>
这个提交包含在:
@@ -101,6 +101,18 @@ static inline __be16 pppoe_proto(const struct sk_buff *skb)
|
||||
pppoe_proto(skb) == htons(PPP_IPV6) && \
|
||||
brnf_filter_pppoe_tagged)
|
||||
|
||||
static void fake_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
{
|
||||
}
|
||||
|
||||
static struct dst_ops fake_dst_ops = {
|
||||
.family = AF_INET,
|
||||
.protocol = __constant_htons(ETH_P_IP),
|
||||
.update_pmtu = fake_update_pmtu,
|
||||
.entry_size = sizeof(struct rtable),
|
||||
.entries = ATOMIC_INIT(0),
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize bogus route table used to keep netfilter happy.
|
||||
* Currently, we fill in the PMTU entry because netfilter
|
||||
@@ -117,6 +129,7 @@ void br_netfilter_rtable_init(struct net_bridge *br)
|
||||
rt->u.dst.path = &rt->u.dst;
|
||||
rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
|
||||
rt->u.dst.flags = DST_NOXFRM;
|
||||
rt->u.dst.ops = &fake_dst_ops;
|
||||
}
|
||||
|
||||
static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
|
||||
|
50
net/compat.c
50
net/compat.c
@@ -725,7 +725,7 @@ EXPORT_SYMBOL(compat_mc_getsockopt);
|
||||
static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
|
||||
AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
|
||||
AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
|
||||
AL(6)};
|
||||
AL(4)};
|
||||
#undef AL
|
||||
|
||||
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags)
|
||||
@@ -738,52 +738,13 @@ asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, uns
|
||||
return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen,
|
||||
const compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize, int flags)
|
||||
{
|
||||
compat_sigset_t ss32;
|
||||
sigset_t ksigmask, sigsaved;
|
||||
int ret;
|
||||
|
||||
if (sigmask) {
|
||||
if (sigsetsize != sizeof(compat_sigset_t))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&ss32, sigmask, sizeof(ss32)))
|
||||
return -EFAULT;
|
||||
sigset_from_compat(&ksigmask, &ss32);
|
||||
|
||||
sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
|
||||
sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
|
||||
}
|
||||
|
||||
ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
|
||||
|
||||
if (ret == -ERESTARTNOHAND) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
|
||||
{
|
||||
int ret;
|
||||
u32 a[6];
|
||||
u32 a0, a1;
|
||||
|
||||
if (call < SYS_SOCKET || call > SYS_PACCEPT)
|
||||
if (call < SYS_SOCKET || call > SYS_ACCEPT4)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(a, args, nas[call]))
|
||||
return -EFAULT;
|
||||
@@ -804,7 +765,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
|
||||
ret = sys_listen(a0, a1);
|
||||
break;
|
||||
case SYS_ACCEPT:
|
||||
ret = do_accept(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
|
||||
ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
|
||||
break;
|
||||
case SYS_GETSOCKNAME:
|
||||
ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
|
||||
@@ -844,9 +805,8 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
|
||||
case SYS_RECVMSG:
|
||||
ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
|
||||
break;
|
||||
case SYS_PACCEPT:
|
||||
ret = compat_sys_paccept(a0, compat_ptr(a1), compat_ptr(a[2]),
|
||||
compat_ptr(a[3]), a[4], a[5]);
|
||||
case SYS_ACCEPT4:
|
||||
ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
@@ -1973,13 +1973,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
|
||||
|
||||
/* make sure that we don't pick a non-existing transmit queue */
|
||||
ntxq = pkt_dev->odev->real_num_tx_queues;
|
||||
if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) {
|
||||
printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU "
|
||||
"disabled because CPU count (%d) exceeds number "
|
||||
"of tx queues (%d) on %s\n", num_online_cpus(), ntxq,
|
||||
pkt_dev->odev->name);
|
||||
pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
|
||||
}
|
||||
|
||||
if (ntxq <= pkt_dev->queue_map_min) {
|
||||
printk(KERN_WARNING "pktgen: WARNING: Requested "
|
||||
"queue_map_min (zero-based) (%d) exceeds valid range "
|
||||
@@ -2202,6 +2196,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev)
|
||||
}
|
||||
pkt_dev->cur_queue_map = t;
|
||||
}
|
||||
pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues;
|
||||
}
|
||||
|
||||
/* Increment/randomize headers according to flags and current values
|
||||
|
@@ -149,7 +149,7 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here)
|
||||
|
||||
void skb_truesize_bug(struct sk_buff *skb)
|
||||
{
|
||||
printk(KERN_ERR "SKB BUG: Invalid truesize (%u) "
|
||||
WARN(net_ratelimit(), KERN_ERR "SKB BUG: Invalid truesize (%u) "
|
||||
"len=%u, sizeof(sk_buff)=%Zd\n",
|
||||
skb->truesize, skb->len, sizeof(struct sk_buff));
|
||||
}
|
||||
|
@@ -2035,9 +2035,6 @@ static inline void release_proto_idx(struct proto *prot)
|
||||
|
||||
int proto_register(struct proto *prot, int alloc_slab)
|
||||
{
|
||||
char *request_sock_slab_name = NULL;
|
||||
char *timewait_sock_slab_name;
|
||||
|
||||
if (alloc_slab) {
|
||||
prot->slab = kmem_cache_create(prot->name, prot->obj_size, 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
@@ -2051,12 +2048,12 @@ int proto_register(struct proto *prot, int alloc_slab)
|
||||
if (prot->rsk_prot != NULL) {
|
||||
static const char mask[] = "request_sock_%s";
|
||||
|
||||
request_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
|
||||
if (request_sock_slab_name == NULL)
|
||||
prot->rsk_prot->slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
|
||||
if (prot->rsk_prot->slab_name == NULL)
|
||||
goto out_free_sock_slab;
|
||||
|
||||
sprintf(request_sock_slab_name, mask, prot->name);
|
||||
prot->rsk_prot->slab = kmem_cache_create(request_sock_slab_name,
|
||||
sprintf(prot->rsk_prot->slab_name, mask, prot->name);
|
||||
prot->rsk_prot->slab = kmem_cache_create(prot->rsk_prot->slab_name,
|
||||
prot->rsk_prot->obj_size, 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
|
||||
@@ -2070,14 +2067,14 @@ int proto_register(struct proto *prot, int alloc_slab)
|
||||
if (prot->twsk_prot != NULL) {
|
||||
static const char mask[] = "tw_sock_%s";
|
||||
|
||||
timewait_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
|
||||
prot->twsk_prot->twsk_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
|
||||
|
||||
if (timewait_sock_slab_name == NULL)
|
||||
if (prot->twsk_prot->twsk_slab_name == NULL)
|
||||
goto out_free_request_sock_slab;
|
||||
|
||||
sprintf(timewait_sock_slab_name, mask, prot->name);
|
||||
sprintf(prot->twsk_prot->twsk_slab_name, mask, prot->name);
|
||||
prot->twsk_prot->twsk_slab =
|
||||
kmem_cache_create(timewait_sock_slab_name,
|
||||
kmem_cache_create(prot->twsk_prot->twsk_slab_name,
|
||||
prot->twsk_prot->twsk_obj_size,
|
||||
0, SLAB_HWCACHE_ALIGN,
|
||||
NULL);
|
||||
@@ -2093,14 +2090,14 @@ int proto_register(struct proto *prot, int alloc_slab)
|
||||
return 0;
|
||||
|
||||
out_free_timewait_sock_slab_name:
|
||||
kfree(timewait_sock_slab_name);
|
||||
kfree(prot->twsk_prot->twsk_slab_name);
|
||||
out_free_request_sock_slab:
|
||||
if (prot->rsk_prot && prot->rsk_prot->slab) {
|
||||
kmem_cache_destroy(prot->rsk_prot->slab);
|
||||
prot->rsk_prot->slab = NULL;
|
||||
}
|
||||
out_free_request_sock_slab_name:
|
||||
kfree(request_sock_slab_name);
|
||||
kfree(prot->rsk_prot->slab_name);
|
||||
out_free_sock_slab:
|
||||
kmem_cache_destroy(prot->slab);
|
||||
prot->slab = NULL;
|
||||
@@ -2123,18 +2120,14 @@ void proto_unregister(struct proto *prot)
|
||||
}
|
||||
|
||||
if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) {
|
||||
const char *name = kmem_cache_name(prot->rsk_prot->slab);
|
||||
|
||||
kmem_cache_destroy(prot->rsk_prot->slab);
|
||||
kfree(name);
|
||||
kfree(prot->rsk_prot->slab_name);
|
||||
prot->rsk_prot->slab = NULL;
|
||||
}
|
||||
|
||||
if (prot->twsk_prot != NULL && prot->twsk_prot->twsk_slab != NULL) {
|
||||
const char *name = kmem_cache_name(prot->twsk_prot->twsk_slab);
|
||||
|
||||
kmem_cache_destroy(prot->twsk_prot->twsk_slab);
|
||||
kfree(name);
|
||||
kfree(prot->twsk_prot->twsk_slab_name);
|
||||
prot->twsk_prot->twsk_slab = NULL;
|
||||
}
|
||||
}
|
||||
|
@@ -1117,6 +1117,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
||||
},
|
||||
},
|
||||
.proto = sk->sk_protocol,
|
||||
.flags = inet_sk_flowi_flags(sk),
|
||||
.uli_u = {
|
||||
.ports = {
|
||||
.sport = inet->sport,
|
||||
|
@@ -1945,13 +1945,14 @@ int __init ip_mr_init(void)
|
||||
goto proc_cache_fail;
|
||||
#endif
|
||||
return 0;
|
||||
reg_notif_fail:
|
||||
kmem_cache_destroy(mrt_cachep);
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_vif_fail:
|
||||
unregister_netdevice_notifier(&ip_mr_notifier);
|
||||
proc_cache_fail:
|
||||
proc_net_remove(&init_net, "ip_mr_vif");
|
||||
proc_vif_fail:
|
||||
unregister_netdevice_notifier(&ip_mr_notifier);
|
||||
#endif
|
||||
reg_notif_fail:
|
||||
del_timer(&ipmr_expire_timer);
|
||||
kmem_cache_destroy(mrt_cachep);
|
||||
return err;
|
||||
}
|
||||
|
@@ -722,7 +722,8 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb)
|
||||
static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb,
|
||||
unsigned int mss_now)
|
||||
{
|
||||
if (skb->len <= mss_now || !sk_can_gso(sk)) {
|
||||
if (skb->len <= mss_now || !sk_can_gso(sk) ||
|
||||
tcp_urg_mode(tcp_sk(sk))) {
|
||||
/* Avoid the costly divide in the normal
|
||||
* non-TSO case.
|
||||
*/
|
||||
@@ -1163,7 +1164,9 @@ static int tcp_init_tso_segs(struct sock *sk, struct sk_buff *skb,
|
||||
{
|
||||
int tso_segs = tcp_skb_pcount(skb);
|
||||
|
||||
if (!tso_segs || (tso_segs > 1 && tcp_skb_mss(skb) != mss_now)) {
|
||||
if (!tso_segs ||
|
||||
(tso_segs > 1 && (tcp_skb_mss(skb) != mss_now ||
|
||||
tcp_urg_mode(tcp_sk(sk))))) {
|
||||
tcp_set_skb_tso_segs(sk, skb, mss_now);
|
||||
tso_segs = tcp_skb_pcount(skb);
|
||||
}
|
||||
|
@@ -633,6 +633,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
.saddr = saddr,
|
||||
.tos = tos } },
|
||||
.proto = sk->sk_protocol,
|
||||
.flags = inet_sk_flowi_flags(sk),
|
||||
.uli_u = { .ports =
|
||||
{ .sport = inet->sport,
|
||||
.dport = dport } } };
|
||||
|
@@ -224,7 +224,7 @@ static struct file_operations ip6mr_vif_fops = {
|
||||
.open = ip6mr_vif_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
.release = seq_release_private,
|
||||
};
|
||||
|
||||
static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
@@ -338,7 +338,7 @@ static struct file_operations ip6mr_mfc_fops = {
|
||||
.open = ipmr_mfc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
.release = seq_release_private,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@@ -132,7 +132,7 @@ static struct snmp_mib snmp6_udplite6_list[] = {
|
||||
|
||||
static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
||||
{
|
||||
static char name[32];
|
||||
char name[32];
|
||||
int i;
|
||||
|
||||
/* print by name -- deprecated items */
|
||||
@@ -144,7 +144,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
||||
p = icmp6type2name[icmptype];
|
||||
if (!p) /* don't print un-named types here */
|
||||
continue;
|
||||
(void) snprintf(name, sizeof(name)-1, "Icmp6%s%s",
|
||||
snprintf(name, sizeof(name), "Icmp6%s%s",
|
||||
i & 0x100 ? "Out" : "In", p);
|
||||
seq_printf(seq, "%-32s\t%lu\n", name,
|
||||
snmp_fold_field(mib, i));
|
||||
@@ -157,7 +157,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
|
||||
val = snmp_fold_field(mib, i);
|
||||
if (!val)
|
||||
continue;
|
||||
(void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u",
|
||||
snprintf(name, sizeof(name), "Icmp6%sType%u",
|
||||
i & 0x100 ? "Out" : "In", i & 0xff);
|
||||
seq_printf(seq, "%-32s\t%lu\n", name, val);
|
||||
}
|
||||
|
@@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
|
||||
ieee80211_restart_sta_timer(sdata);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/* driver notification call */
|
||||
void ieee80211_notify_mac(struct ieee80211_hw *hw,
|
||||
enum ieee80211_notification_types notif_type)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
switch (notif_type) {
|
||||
case IEEE80211_NOTIFY_RE_ASSOC:
|
||||
rtnl_lock();
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||
continue;
|
||||
|
||||
ieee80211_sta_req_auth(sdata, &sdata->u.sta);
|
||||
}
|
||||
rtnl_unlock();
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_notify_mac);
|
||||
|
@@ -271,6 +271,7 @@ static int ieee80211_ioctl_siwmode(struct net_device *dev,
|
||||
__u32 *mode, char *extra)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int type;
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
@@ -281,6 +282,13 @@ static int ieee80211_ioctl_siwmode(struct net_device *dev,
|
||||
type = NL80211_IFTYPE_STATION;
|
||||
break;
|
||||
case IW_MODE_ADHOC:
|
||||
/* Setting ad-hoc mode on non ibss channel is not
|
||||
* supported.
|
||||
*/
|
||||
if (local->oper_channel &&
|
||||
(local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
type = NL80211_IFTYPE_ADHOC;
|
||||
break;
|
||||
case IW_MODE_REPEAT:
|
||||
|
@@ -305,9 +305,7 @@ void nf_conntrack_hash_insert(struct nf_conn *ct)
|
||||
hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
|
||||
repl_hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
|
||||
|
||||
spin_lock_bh(&nf_conntrack_lock);
|
||||
__nf_conntrack_hash_insert(ct, hash, repl_hash);
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_conntrack_hash_insert);
|
||||
|
||||
|
@@ -1090,7 +1090,7 @@ ctnetlink_create_conntrack(struct nlattr *cda[],
|
||||
struct nf_conn_help *help;
|
||||
struct nf_conntrack_helper *helper;
|
||||
|
||||
ct = nf_conntrack_alloc(&init_net, otuple, rtuple, GFP_KERNEL);
|
||||
ct = nf_conntrack_alloc(&init_net, otuple, rtuple, GFP_ATOMIC);
|
||||
if (ct == NULL || IS_ERR(ct))
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1138,7 +1138,7 @@ ctnetlink_create_conntrack(struct nlattr *cda[],
|
||||
}
|
||||
}
|
||||
|
||||
nf_ct_acct_ext_add(ct, GFP_KERNEL);
|
||||
nf_ct_acct_ext_add(ct, GFP_ATOMIC);
|
||||
|
||||
#if defined(CONFIG_NF_CONNTRACK_MARK)
|
||||
if (cda[CTA_MARK])
|
||||
@@ -1212,13 +1212,14 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
||||
atomic_inc(&master_ct->ct_general.use);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
err = -ENOENT;
|
||||
if (nlh->nlmsg_flags & NLM_F_CREATE)
|
||||
err = ctnetlink_create_conntrack(cda,
|
||||
&otuple,
|
||||
&rtuple,
|
||||
master_ct);
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
|
||||
if (err < 0 && master_ct)
|
||||
nf_ct_put(master_ct);
|
||||
|
||||
|
@@ -33,9 +33,30 @@
|
||||
#include <net/phonet/phonet.h>
|
||||
#include <net/phonet/pn_dev.h>
|
||||
|
||||
static struct net_proto_family phonet_proto_family;
|
||||
static struct phonet_protocol *phonet_proto_get(int protocol);
|
||||
static inline void phonet_proto_put(struct phonet_protocol *pp);
|
||||
/* Transport protocol registration */
|
||||
static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
|
||||
static DEFINE_SPINLOCK(proto_tab_lock);
|
||||
|
||||
static struct phonet_protocol *phonet_proto_get(int protocol)
|
||||
{
|
||||
struct phonet_protocol *pp;
|
||||
|
||||
if (protocol >= PHONET_NPROTO)
|
||||
return NULL;
|
||||
|
||||
spin_lock(&proto_tab_lock);
|
||||
pp = proto_tab[protocol];
|
||||
if (pp && !try_module_get(pp->prot->owner))
|
||||
pp = NULL;
|
||||
spin_unlock(&proto_tab_lock);
|
||||
|
||||
return pp;
|
||||
}
|
||||
|
||||
static inline void phonet_proto_put(struct phonet_protocol *pp)
|
||||
{
|
||||
module_put(pp->prot->owner);
|
||||
}
|
||||
|
||||
/* protocol family functions */
|
||||
|
||||
@@ -375,10 +396,6 @@ static struct packet_type phonet_packet_type = {
|
||||
.func = phonet_rcv,
|
||||
};
|
||||
|
||||
/* Transport protocol registration */
|
||||
static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
|
||||
static DEFINE_SPINLOCK(proto_tab_lock);
|
||||
|
||||
int __init_or_module phonet_proto_register(int protocol,
|
||||
struct phonet_protocol *pp)
|
||||
{
|
||||
@@ -412,27 +429,6 @@ void phonet_proto_unregister(int protocol, struct phonet_protocol *pp)
|
||||
}
|
||||
EXPORT_SYMBOL(phonet_proto_unregister);
|
||||
|
||||
static struct phonet_protocol *phonet_proto_get(int protocol)
|
||||
{
|
||||
struct phonet_protocol *pp;
|
||||
|
||||
if (protocol >= PHONET_NPROTO)
|
||||
return NULL;
|
||||
|
||||
spin_lock(&proto_tab_lock);
|
||||
pp = proto_tab[protocol];
|
||||
if (pp && !try_module_get(pp->prot->owner))
|
||||
pp = NULL;
|
||||
spin_unlock(&proto_tab_lock);
|
||||
|
||||
return pp;
|
||||
}
|
||||
|
||||
static inline void phonet_proto_put(struct phonet_protocol *pp)
|
||||
{
|
||||
module_put(pp->prot->owner);
|
||||
}
|
||||
|
||||
/* Module registration */
|
||||
static int __init phonet_init(void)
|
||||
{
|
||||
|
@@ -115,7 +115,7 @@ int phonet_address_del(struct net_device *dev, u8 addr)
|
||||
pnd = __phonet_get(dev);
|
||||
if (!pnd || !test_and_clear_bit(addr >> 2, pnd->addrs))
|
||||
err = -EADDRNOTAVAIL;
|
||||
if (bitmap_empty(pnd->addrs, 64))
|
||||
else if (bitmap_empty(pnd->addrs, 64))
|
||||
__phonet_device_free(pnd);
|
||||
spin_unlock_bh(&pndevs.lock);
|
||||
return err;
|
||||
|
@@ -1072,6 +1072,10 @@ static int rose_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
unsigned char *asmptr;
|
||||
int n, size, qbit = 0;
|
||||
|
||||
/* ROSE empty frame has no meaning : don't send */
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -1265,6 +1269,12 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
skb_reset_transport_header(skb);
|
||||
copied = skb->len;
|
||||
|
||||
/* ROSE empty frame has no meaning : ignore it */
|
||||
if (copied == 0) {
|
||||
skb_free_datagram(sk, skb);
|
||||
return copied;
|
||||
}
|
||||
|
||||
if (copied > size) {
|
||||
copied = size;
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
|
@@ -417,6 +417,8 @@ static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab)
|
||||
struct nlattr *nest;
|
||||
|
||||
nest = nla_nest_start(skb, TCA_STAB);
|
||||
if (nest == NULL)
|
||||
goto nla_put_failure;
|
||||
NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts);
|
||||
nla_nest_end(skb, nest);
|
||||
|
||||
|
@@ -270,6 +270,8 @@ static void dev_watchdog_down(struct net_device *dev)
|
||||
void netif_carrier_on(struct net_device *dev)
|
||||
{
|
||||
if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
|
||||
if (dev->reg_state == NETREG_UNINITIALIZED)
|
||||
return;
|
||||
linkwatch_fire_event(dev);
|
||||
if (netif_running(dev))
|
||||
__netdev_watchdog_up(dev);
|
||||
@@ -285,8 +287,11 @@ EXPORT_SYMBOL(netif_carrier_on);
|
||||
*/
|
||||
void netif_carrier_off(struct net_device *dev)
|
||||
{
|
||||
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state))
|
||||
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
|
||||
if (dev->reg_state == NETREG_UNINITIALIZED)
|
||||
return;
|
||||
linkwatch_fire_event(dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(netif_carrier_off);
|
||||
|
||||
|
80
net/socket.c
80
net/socket.c
@@ -1426,8 +1426,8 @@ asmlinkage long sys_listen(int fd, int backlog)
|
||||
* clean when we restucture accept also.
|
||||
*/
|
||||
|
||||
long do_accept(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen, int flags)
|
||||
asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen, int flags)
|
||||
{
|
||||
struct socket *sock, *newsock;
|
||||
struct file *newfile;
|
||||
@@ -1510,66 +1510,10 @@ out_fd:
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef HAVE_SET_RESTORE_SIGMASK
|
||||
asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen,
|
||||
const sigset_t __user *sigmask,
|
||||
size_t sigsetsize, int flags)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
int ret;
|
||||
|
||||
if (sigmask) {
|
||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
||||
if (sigsetsize != sizeof(sigset_t))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
|
||||
return -EFAULT;
|
||||
|
||||
sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
|
||||
sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
|
||||
}
|
||||
|
||||
ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
|
||||
|
||||
if (ret < 0 && signal_pending(current)) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen,
|
||||
const sigset_t __user *sigmask,
|
||||
size_t sigsetsize, int flags)
|
||||
{
|
||||
/* The platform does not support restoring the signal mask in the
|
||||
* return path. So we do not allow using paccept() with a signal
|
||||
* mask. */
|
||||
if (sigmask)
|
||||
return -EINVAL;
|
||||
|
||||
return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen)
|
||||
{
|
||||
return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0);
|
||||
return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2096,7 +2040,7 @@ static const unsigned char nargs[19]={
|
||||
AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
|
||||
AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
|
||||
AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
|
||||
AL(6)
|
||||
AL(4)
|
||||
};
|
||||
|
||||
#undef AL
|
||||
@@ -2115,7 +2059,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
|
||||
unsigned long a0, a1;
|
||||
int err;
|
||||
|
||||
if (call < 1 || call > SYS_PACCEPT)
|
||||
if (call < 1 || call > SYS_ACCEPT4)
|
||||
return -EINVAL;
|
||||
|
||||
/* copy_from_user should be SMP safe. */
|
||||
@@ -2143,9 +2087,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
|
||||
err = sys_listen(a0, a1);
|
||||
break;
|
||||
case SYS_ACCEPT:
|
||||
err =
|
||||
do_accept(a0, (struct sockaddr __user *)a1,
|
||||
(int __user *)a[2], 0);
|
||||
err = sys_accept4(a0, (struct sockaddr __user *)a1,
|
||||
(int __user *)a[2], 0);
|
||||
break;
|
||||
case SYS_GETSOCKNAME:
|
||||
err =
|
||||
@@ -2192,12 +2135,9 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
|
||||
case SYS_RECVMSG:
|
||||
err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
|
||||
break;
|
||||
case SYS_PACCEPT:
|
||||
err =
|
||||
sys_paccept(a0, (struct sockaddr __user *)a1,
|
||||
(int __user *)a[2],
|
||||
(const sigset_t __user *) a[3],
|
||||
a[4], a[5]);
|
||||
case SYS_ACCEPT4:
|
||||
err = sys_accept4(a0, (struct sockaddr __user *)a1,
|
||||
(int __user *)a[2], a[3]);
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
|
@@ -133,13 +133,29 @@ static int
|
||||
generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags)
|
||||
{
|
||||
struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base);
|
||||
int i;
|
||||
|
||||
if (gcred->acred.uid != acred->uid ||
|
||||
gcred->acred.gid != acred->gid ||
|
||||
gcred->acred.group_info != acred->group_info ||
|
||||
gcred->acred.machine_cred != acred->machine_cred)
|
||||
return 0;
|
||||
goto out_nomatch;
|
||||
|
||||
/* Optimisation in the case where pointers are identical... */
|
||||
if (gcred->acred.group_info == acred->group_info)
|
||||
goto out_match;
|
||||
|
||||
/* Slow path... */
|
||||
if (gcred->acred.group_info->ngroups != acred->group_info->ngroups)
|
||||
goto out_nomatch;
|
||||
for (i = 0; i < gcred->acred.group_info->ngroups; i++) {
|
||||
if (GROUP_AT(gcred->acred.group_info, i) !=
|
||||
GROUP_AT(acred->group_info, i))
|
||||
goto out_nomatch;
|
||||
}
|
||||
out_match:
|
||||
return 1;
|
||||
out_nomatch:
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init rpc_init_generic_auth(void)
|
||||
|
@@ -1183,7 +1183,11 @@ int svc_addsock(struct svc_serv *serv,
|
||||
else if (so->state > SS_UNCONNECTED)
|
||||
err = -EISCONN;
|
||||
else {
|
||||
svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS);
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
err = -ENOENT;
|
||||
else
|
||||
svsk = svc_setup_socket(serv, so, &err,
|
||||
SVC_SOCK_DEFAULTS);
|
||||
if (svsk) {
|
||||
struct sockaddr_storage addr;
|
||||
struct sockaddr *sin = (struct sockaddr *)&addr;
|
||||
@@ -1196,7 +1200,8 @@ int svc_addsock(struct svc_serv *serv,
|
||||
spin_unlock_bh(&serv->sv_lock);
|
||||
svc_xprt_received(&svsk->sk_xprt);
|
||||
err = 0;
|
||||
}
|
||||
} else
|
||||
module_put(THIS_MODULE);
|
||||
}
|
||||
if (err) {
|
||||
sockfd_put(so);
|
||||
|
@@ -1342,6 +1342,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
|
||||
if (NULL == siocb->scm)
|
||||
siocb->scm = &tmp_scm;
|
||||
wait_for_unix_gc();
|
||||
err = scm_send(sock, msg, siocb->scm);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@@ -1492,6 +1493,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
|
||||
if (NULL == siocb->scm)
|
||||
siocb->scm = &tmp_scm;
|
||||
wait_for_unix_gc();
|
||||
err = scm_send(sock, msg, siocb->scm);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@@ -80,6 +80,7 @@
|
||||
#include <linux/file.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <net/sock.h>
|
||||
#include <net/af_unix.h>
|
||||
@@ -91,6 +92,7 @@
|
||||
static LIST_HEAD(gc_inflight_list);
|
||||
static LIST_HEAD(gc_candidates);
|
||||
static DEFINE_SPINLOCK(unix_gc_lock);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait);
|
||||
|
||||
unsigned int unix_tot_inflight;
|
||||
|
||||
@@ -266,12 +268,16 @@ static void inc_inflight_move_tail(struct unix_sock *u)
|
||||
list_move_tail(&u->link, &gc_candidates);
|
||||
}
|
||||
|
||||
/* The external entry point: unix_gc() */
|
||||
static bool gc_in_progress = false;
|
||||
|
||||
void wait_for_unix_gc(void)
|
||||
{
|
||||
wait_event(unix_gc_wait, gc_in_progress == false);
|
||||
}
|
||||
|
||||
/* The external entry point: unix_gc() */
|
||||
void unix_gc(void)
|
||||
{
|
||||
static bool gc_in_progress = false;
|
||||
|
||||
struct unix_sock *u;
|
||||
struct unix_sock *next;
|
||||
struct sk_buff_head hitlist;
|
||||
@@ -376,6 +382,7 @@ void unix_gc(void)
|
||||
/* All candidates should have been detached by now. */
|
||||
BUG_ON(!list_empty(&gc_candidates));
|
||||
gc_in_progress = false;
|
||||
wake_up(&unix_gc_wait);
|
||||
|
||||
out:
|
||||
spin_unlock(&unix_gc_lock);
|
||||
|
@@ -343,9 +343,9 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by,
|
||||
return 0;
|
||||
return -EALREADY;
|
||||
}
|
||||
if (WARN_ON(!is_alpha2_set(alpha2) || !is_an_alpha2(alpha2)),
|
||||
if (WARN(!is_alpha2_set(alpha2) || !is_an_alpha2(alpha2),
|
||||
"Invalid Country IE regulatory hint passed "
|
||||
"to the wireless core\n")
|
||||
"to the wireless core\n"))
|
||||
return -EINVAL;
|
||||
/* We ignore Country IE hints for now, as we haven't yet
|
||||
* added the dot11MultiDomainCapabilityEnabled flag
|
||||
|
在新工单中引用
屏蔽一个用户