git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
KVM: SVM: Fix nested nmi handling
[safe/jmp/linux-2.6]
/
net
/
rose
/
af_rose.c
diff --git
a/net/rose/af_rose.c
b/net/rose/af_rose.c
index
f3a691f
..
4fb711a
100644
(file)
--- a/
net/rose/af_rose.c
+++ b/
net/rose/af_rose.c
@@
-18,6
+18,7
@@
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/in.h>
+#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
@@
-63,7
+64,7
@@
int sysctl_rose_window_size = ROSE_DEFAULT_WINDOW_SIZE;
static HLIST_HEAD(rose_list);
static DEFINE_SPINLOCK(rose_list_lock);
static HLIST_HEAD(rose_list);
static DEFINE_SPINLOCK(rose_list_lock);
-static struct proto_ops rose_proto_ops;
+static
const
struct proto_ops rose_proto_ops;
ax25_address rose_callsign;
ax25_address rose_callsign;
@@
-74,6
+75,7
@@
ax25_address rose_callsign;
* separate class since they always nest.
*/
static struct lock_class_key rose_netdev_xmit_lock_key;
* separate class since they always nest.
*/
static struct lock_class_key rose_netdev_xmit_lock_key;
+static struct lock_class_key rose_netdev_addr_lock_key;
static void rose_set_lockdep_one(struct net_device *dev,
struct netdev_queue *txq,
static void rose_set_lockdep_one(struct net_device *dev,
struct netdev_queue *txq,
@@
-84,29
+86,28
@@
static void rose_set_lockdep_one(struct net_device *dev,
static void rose_set_lockdep_key(struct net_device *dev)
{
static void rose_set_lockdep_key(struct net_device *dev)
{
+ lockdep_set_class(&dev->addr_list_lock, &rose_netdev_addr_lock_key);
netdev_for_each_tx_queue(dev, rose_set_lockdep_one, NULL);
}
/*
* Convert a ROSE address into text.
*/
netdev_for_each_tx_queue(dev, rose_set_lockdep_one, NULL);
}
/*
* Convert a ROSE address into text.
*/
-c
onst char *rose2asc(
const rose_address *addr)
+c
har *rose2asc(char *buf,
const rose_address *addr)
{
{
- static char buffer[11];
-
if (addr->rose_addr[0] == 0x00 && addr->rose_addr[1] == 0x00 &&
addr->rose_addr[2] == 0x00 && addr->rose_addr[3] == 0x00 &&
addr->rose_addr[4] == 0x00) {
if (addr->rose_addr[0] == 0x00 && addr->rose_addr[1] == 0x00 &&
addr->rose_addr[2] == 0x00 && addr->rose_addr[3] == 0x00 &&
addr->rose_addr[4] == 0x00) {
- strcpy(buf
fer
, "*");
+ strcpy(buf, "*");
} else {
} else {
- sprintf(buf
fer
, "%02X%02X%02X%02X%02X", addr->rose_addr[0] & 0xFF,
+ sprintf(buf, "%02X%02X%02X%02X%02X", addr->rose_addr[0] & 0xFF,
addr->rose_addr[1] & 0xFF,
addr->rose_addr[2] & 0xFF,
addr->rose_addr[3] & 0xFF,
addr->rose_addr[4] & 0xFF);
}
addr->rose_addr[1] & 0xFF,
addr->rose_addr[2] & 0xFF,
addr->rose_addr[3] & 0xFF,
addr->rose_addr[4] & 0xFF);
}
- return buf
fer
;
+ return buf;
}
/*
}
/*
@@
-209,7
+210,7
@@
static int rose_device_event(struct notifier_block *this, unsigned long event,
{
struct net_device *dev = (struct net_device *)ptr;
{
struct net_device *dev = (struct net_device *)ptr;
- if (
dev_net(dev) != &init_net
)
+ if (
!net_eq(dev_net(dev), &init_net)
)
return NOTIFY_DONE;
if (event != NETDEV_DOWN)
return NOTIFY_DONE;
if (event != NETDEV_DOWN)
@@
-354,8
+355,7
@@
void rose_destroy_socket(struct sock *sk)
kfree_skb(skb);
}
kfree_skb(skb);
}
- if (atomic_read(&sk->sk_wmem_alloc) ||
- atomic_read(&sk->sk_rmem_alloc)) {
+ if (sk_has_allocations(sk)) {
/* Defer: outstanding buffers */
setup_timer(&sk->sk_timer, rose_destroy_timer,
(unsigned long)sk);
/* Defer: outstanding buffers */
setup_timer(&sk->sk_timer, rose_destroy_timer,
(unsigned long)sk);
@@
-371,7
+371,7
@@
void rose_destroy_socket(struct sock *sk)
*/
static int rose_setsockopt(struct socket *sock, int level, int optname,
*/
static int rose_setsockopt(struct socket *sock, int level, int optname,
- char __user *optval, int optlen)
+ char __user *optval,
unsigned
int optlen)
{
struct sock *sk = sock->sk;
struct rose_sock *rose = rose_sk(sk);
{
struct sock *sk = sock->sk;
struct rose_sock *rose = rose_sk(sk);
@@
-513,12
+513,13
@@
static struct proto rose_proto = {
.obj_size = sizeof(struct rose_sock),
};
.obj_size = sizeof(struct rose_sock),
};
-static int rose_create(struct net *net, struct socket *sock, int protocol)
+static int rose_create(struct net *net, struct socket *sock, int protocol,
+ int kern)
{
struct sock *sk;
struct rose_sock *rose;
{
struct sock *sk;
struct rose_sock *rose;
- if (
net != &init_net
)
+ if (
!net_eq(net, &init_net)
)
return -EAFNOSUPPORT;
if (sock->type != SOCK_SEQPACKET || protocol != 0)
return -EAFNOSUPPORT;
if (sock->type != SOCK_SEQPACKET || protocol != 0)
@@
-688,7
+689,7
@@
static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
source = &addr->srose_call;
source = &addr->srose_call;
- user = ax25_findbyuid(current
->euid
);
+ user = ax25_findbyuid(current
_euid()
);
if (user) {
rose->source_call = user->call;
ax25_uid_put(user);
if (user) {
rose->source_call = user->call;
ax25_uid_put(user);
@@
-789,7
+790,7
@@
static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
goto out_release;
}
goto out_release;
}
- user = ax25_findbyuid(current
->euid
);
+ user = ax25_findbyuid(current
_euid()
);
if (!user) {
err = -EINVAL;
goto out_release;
if (!user) {
err = -EINVAL;
goto out_release;
@@
-955,6
+956,7
@@
static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
struct rose_sock *rose = rose_sk(sk);
int n;
struct rose_sock *rose = rose_sk(sk);
int n;
+ memset(srose, 0, sizeof(*srose));
if (peer != 0) {
if (sk->sk_state != TCP_ESTABLISHED)
return -ENOTCONN;
if (peer != 0) {
if (sk->sk_state != TCP_ESTABLISHED)
return -ENOTCONN;
@@
-1118,6
+1120,10
@@
static int rose_sendmsg(struct kiocb *iocb, struct socket *sock,
/* Build a packet */
SOCK_DEBUG(sk, "ROSE: sendto: building packet.\n");
/* Build a packet */
SOCK_DEBUG(sk, "ROSE: sendto: building packet.\n");
+ /* Sanity check the packet size */
+ if (len > 65535)
+ return -EMSGSIZE;
+
size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN;
if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN;
if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
@@
-1304,7
+1310,8
@@
static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
switch (cmd) {
case TIOCOUTQ: {
long amount;
switch (cmd) {
case TIOCOUTQ: {
long amount;
- amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
+
+ amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
if (amount < 0)
amount = 0;
return put_user(amount, (unsigned int __user *) argp);
if (amount < 0)
amount = 0;
return put_user(amount, (unsigned int __user *) argp);
@@
-1398,29
+1405,13
@@
static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
static void *rose_info_start(struct seq_file *seq, loff_t *pos)
__acquires(rose_list_lock)
{
static void *rose_info_start(struct seq_file *seq, loff_t *pos)
__acquires(rose_list_lock)
{
- int i;
- struct sock *s;
- struct hlist_node *node;
-
spin_lock_bh(&rose_list_lock);
spin_lock_bh(&rose_list_lock);
- if (*pos == 0)
- return SEQ_START_TOKEN;
-
- i = 1;
- sk_for_each(s, node, &rose_list) {
- if (i == *pos)
- return s;
- ++i;
- }
- return NULL;
+ return seq_hlist_start_head(&rose_list, *pos);
}
static void *rose_info_next(struct seq_file *seq, void *v, loff_t *pos)
{
}
static void *rose_info_next(struct seq_file *seq, void *v, loff_t *pos)
{
- ++*pos;
-
- return (v == SEQ_START_TOKEN) ? sk_head(&rose_list)
- : sk_next((struct sock *)v);
+ return seq_hlist_next(v, &rose_list, pos);
}
static void rose_info_stop(struct seq_file *seq, void *v)
}
static void rose_info_stop(struct seq_file *seq, void *v)
@@
-1431,14
+1422,14
@@
static void rose_info_stop(struct seq_file *seq, void *v)
static int rose_info_show(struct seq_file *seq, void *v)
{
static int rose_info_show(struct seq_file *seq, void *v)
{
- char buf[11];
+ char buf[11]
, rsbuf[11]
;
if (v == SEQ_START_TOKEN)
seq_puts(seq,
"dest_addr dest_call src_addr src_call dev lci neigh st vs vr va t t1 t2 t3 hb idle Snd-Q Rcv-Q inode\n");
else {
if (v == SEQ_START_TOKEN)
seq_puts(seq,
"dest_addr dest_call src_addr src_call dev lci neigh st vs vr va t t1 t2 t3 hb idle Snd-Q Rcv-Q inode\n");
else {
- struct sock *s =
v
;
+ struct sock *s =
sk_entry(v)
;
struct rose_sock *rose = rose_sk(s);
const char *devname, *callsign;
const struct net_device *dev = rose->device;
struct rose_sock *rose = rose_sk(s);
const char *devname, *callsign;
const struct net_device *dev = rose->device;
@@
-1449,8
+1440,8
@@
static int rose_info_show(struct seq_file *seq, void *v)
devname = dev->name;
seq_printf(seq, "%-10s %-9s ",
devname = dev->name;
seq_printf(seq, "%-10s %-9s ",
-
rose2asc(
&rose->dest_addr),
- ax2asc(buf, &rose->dest_call));
+
rose2asc(rsbuf,
&rose->dest_addr),
+
ax2asc(buf, &rose->dest_call));
if (ax25cmp(&rose->source_call, &null_ax25_address) == 0)
callsign = "??????-?";
if (ax25cmp(&rose->source_call, &null_ax25_address) == 0)
callsign = "??????-?";
@@
-1459,7
+1450,7
@@
static int rose_info_show(struct seq_file *seq, void *v)
seq_printf(seq,
"%-10s %-9s %-5s %3.3X %05d %d %d %d %d %3lu %3lu %3lu %3lu %3lu %3lu/%03lu %5d %5d %ld\n",
seq_printf(seq,
"%-10s %-9s %-5s %3.3X %05d %d %d %d %d %3lu %3lu %3lu %3lu %3lu %3lu/%03lu %5d %5d %ld\n",
- rose2asc(&rose->source_addr),
+ rose2asc(
rsbuf,
&rose->source_addr),
callsign,
devname,
rose->lci & 0x0FFF,
callsign,
devname,
rose->lci & 0x0FFF,
@@
-1475,8
+1466,8
@@
static int rose_info_show(struct seq_file *seq, void *v)
rose->hb / HZ,
ax25_display_timer(&rose->idletimer) / (60 * HZ),
rose->idle / (60 * HZ),
rose->hb / HZ,
ax25_display_timer(&rose->idletimer) / (60 * HZ),
rose->idle / (60 * HZ),
-
atomic_read(&s->sk_wmem_alloc
),
-
atomic_read(&s->sk_rmem_alloc
),
+
sk_wmem_alloc_get(s
),
+
sk_rmem_alloc_get(s
),
s->sk_socket ? SOCK_INODE(s->sk_socket)->i_ino : 0L);
}
s->sk_socket ? SOCK_INODE(s->sk_socket)->i_ino : 0L);
}
@@
-1504,13
+1495,13
@@
static const struct file_operations rose_info_fops = {
};
#endif /* CONFIG_PROC_FS */
};
#endif /* CONFIG_PROC_FS */
-static struct net_proto_family rose_family_ops = {
+static
const
struct net_proto_family rose_family_ops = {
.family = PF_ROSE,
.create = rose_create,
.owner = THIS_MODULE,
};
.family = PF_ROSE,
.create = rose_create,
.owner = THIS_MODULE,
};
-static struct proto_ops rose_proto_ops = {
+static
const
struct proto_ops rose_proto_ops = {
.family = PF_ROSE,
.owner = THIS_MODULE,
.release = rose_release,
.family = PF_ROSE,
.owner = THIS_MODULE,
.release = rose_release,
@@
-1575,8
+1566,7
@@
static int __init rose_proto_init(void)
char name[IFNAMSIZ];
sprintf(name, "rose%d", i);
char name[IFNAMSIZ];
sprintf(name, "rose%d", i);
- dev = alloc_netdev(sizeof(struct net_device_stats),
- name, rose_setup);
+ dev = alloc_netdev(0, name, rose_setup);
if (!dev) {
printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate memory\n");
rc = -ENOMEM;
if (!dev) {
printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate memory\n");
rc = -ENOMEM;