git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
net
/
ipv6
/
ip6_flowlabel.c
diff --git
a/net/ipv6/ip6_flowlabel.c
b/net/ipv6/ip6_flowlabel.c
index
22ff734
..
f9ca639
100644
(file)
--- a/
net/ipv6/ip6_flowlabel.c
+++ b/
net/ipv6/ip6_flowlabel.c
@@
-9,6
+9,7
@@
* Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
*/
* Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
*/
+#include <linux/capability.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/types.h>
@@
-50,15
+51,15
@@
static atomic_t fl_size = ATOMIC_INIT(0);
static struct ip6_flowlabel *fl_ht[FL_HASH_MASK+1];
static void ip6_fl_gc(unsigned long dummy);
static struct ip6_flowlabel *fl_ht[FL_HASH_MASK+1];
static void ip6_fl_gc(unsigned long dummy);
-static
struct timer_list ip6_fl_gc_timer = TIMER_INITIALIZER(
ip6_fl_gc, 0, 0);
+static
DEFINE_TIMER(ip6_fl_gc_timer,
ip6_fl_gc, 0, 0);
/* FL hash table lock: it protects only of GC */
/* FL hash table lock: it protects only of GC */
-static
rwlock_t ip6_fl_lock = RW_LOCK_UNLOCKED
;
+static
DEFINE_RWLOCK(ip6_fl_lock)
;
/* Big socket sock */
/* Big socket sock */
-static
rwlock_t ip6_sk_fl_lock = RW_LOCK_UNLOCKED
;
+static
DEFINE_RWLOCK(ip6_sk_fl_lock)
;
static __inline__ struct ip6_flowlabel * __fl_lookup(u32 label)
static __inline__ struct ip6_flowlabel * __fl_lookup(u32 label)
@@
-87,7
+88,7
@@
static struct ip6_flowlabel * fl_lookup(u32 label)
static void fl_free(struct ip6_flowlabel *fl)
{
static void fl_free(struct ip6_flowlabel *fl)
{
- if (fl
->opt
)
+ if (fl)
kfree(fl->opt);
kfree(fl);
}
kfree(fl->opt);
kfree(fl);
}
@@
-200,6
+201,8
@@
struct ip6_flowlabel * fl6_sock_lookup(struct sock *sk, u32 label)
return NULL;
}
return NULL;
}
+EXPORT_SYMBOL_GPL(fl6_sock_lookup);
+
void fl6_free_socklist(struct sock *sk)
{
struct ipv6_pinfo *np = inet6_sk(sk);
void fl6_free_socklist(struct sock *sk)
{
struct ipv6_pinfo *np = inet6_sk(sk);
@@
-226,10
+229,10
@@
struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
struct ipv6_txoptions * fopt)
{
struct ipv6_txoptions * fl_opt = fl->opt;
struct ipv6_txoptions * fopt)
{
struct ipv6_txoptions * fl_opt = fl->opt;
-
+
if (fopt == NULL || fopt->opt_flen == 0)
return fl_opt;
if (fopt == NULL || fopt->opt_flen == 0)
return fl_opt;
-
+
if (fl_opt != NULL) {
opt_space->hopopt = fl_opt->hopopt;
opt_space->dst0opt = fl_opt->dst0opt;
if (fl_opt != NULL) {
opt_space->hopopt = fl_opt->hopopt;
opt_space->dst0opt = fl_opt->dst0opt;
@@
-244,7
+247,6
@@
struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
opt_space->opt_nflen = 0;
}
opt_space->dst1opt = fopt->dst1opt;
opt_space->opt_nflen = 0;
}
opt_space->dst1opt = fopt->dst1opt;
- opt_space->auth = fopt->auth;
opt_space->opt_flen = fopt->opt_flen;
return opt_space;
}
opt_space->opt_flen = fopt->opt_flen;
return opt_space;
}
@@
-277,7
+279,7
@@
static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo
}
static struct ip6_flowlabel *
}
static struct ip6_flowlabel *
-fl_create(struct in6_flowlabel_req *freq, char *optval, int optlen, int *err_p)
+fl_create(struct in6_flowlabel_req *freq, char
__user
*optval, int optlen, int *err_p)
{
struct ip6_flowlabel *fl;
int olen;
{
struct ip6_flowlabel *fl;
int olen;
@@
-285,10
+287,9
@@
fl_create(struct in6_flowlabel_req *freq, char *optval, int optlen, int *err_p)
int err;
err = -ENOMEM;
int err;
err = -ENOMEM;
- fl = k
m
alloc(sizeof(*fl), GFP_KERNEL);
+ fl = k
z
alloc(sizeof(*fl), GFP_KERNEL);
if (fl == NULL)
goto done;
if (fl == NULL)
goto done;
- memset(fl, 0, sizeof(*fl));
olen = optlen - CMSG_ALIGN(sizeof(*freq));
if (olen > 0) {
olen = optlen - CMSG_ALIGN(sizeof(*freq));
if (olen > 0) {
@@
-311,7
+312,7
@@
fl_create(struct in6_flowlabel_req *freq, char *optval, int optlen, int *err_p)
msg.msg_control = (void*)(fl->opt+1);
flowi.oif = 0;
msg.msg_control = (void*)(fl->opt+1);
flowi.oif = 0;
- err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk);
+ err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk
, &junk
);
if (err)
goto done;
err = -EINVAL;
if (err)
goto done;
err = -EINVAL;
@@
-351,8
+352,7
@@
fl_create(struct in6_flowlabel_req *freq, char *optval, int optlen, int *err_p)
return fl;
done:
return fl;
done:
- if (fl)
- fl_free(fl);
+ fl_free(fl);
*err_p = err;
return NULL;
}
*err_p = err;
return NULL;
}
@@
-407,7
+407,7
@@
static int ipv6_opt_cmp(struct ipv6_txoptions *o1, struct ipv6_txoptions *o2)
return 0;
}
return 0;
}
-int ipv6_flowlabel_opt(struct sock *sk, char *optval, int optlen)
+int ipv6_flowlabel_opt(struct sock *sk, char
__user
*optval, int optlen)
{
int err;
struct ipv6_pinfo *np = inet6_sk(sk);
{
int err;
struct ipv6_pinfo *np = inet6_sk(sk);
@@
-481,7
+481,7
@@
int ipv6_flowlabel_opt(struct sock *sk, char *optval, int optlen)
goto done;
}
fl1 = sfl->fl;
goto done;
}
fl1 = sfl->fl;
- atomic_inc(&fl->users);
+ atomic_inc(&fl
1
->users);
break;
}
}
break;
}
}
@@
-500,7
+500,7
@@
int ipv6_flowlabel_opt(struct sock *sk, char *optval, int optlen)
goto release;
err = -EINVAL;
goto release;
err = -EINVAL;
- if (
ipv6_addr_cmp
(&fl1->dst, &fl->dst) ||
+ if (
!ipv6_addr_equal
(&fl1->dst, &fl->dst) ||
ipv6_opt_cmp(fl1->opt, fl->opt))
goto release;
ipv6_opt_cmp(fl1->opt, fl->opt))
goto release;
@@
-536,9
+536,12
@@
release:
if (err)
goto done;
if (err)
goto done;
- /* Do not check for fault */
- if (!freq.flr_label)
- copy_to_user(optval + ((u8*)&freq.flr_label - (u8*)&freq), &fl->label, sizeof(fl->label));
+ if (!freq.flr_label) {
+ if (copy_to_user(&((struct in6_flowlabel_req __user *) optval)->flr_label,
+ &fl->label, sizeof(fl->label))) {
+ /* Intentionally ignore fault. */
+ }
+ }
sfl1->fl = fl;
sfl1->next = np->ipv6_fl_list;
sfl1->fl = fl;
sfl1->next = np->ipv6_fl_list;
@@
-550,10
+553,8
@@
release:
}
done:
}
done:
- if (fl)
- fl_free(fl);
- if (sfl1)
- kfree(sfl1);
+ fl_free(fl);
+ kfree(sfl1);
return err;
}
return err;
}
@@
-627,9
+628,7
@@
static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl)
{
while(fl) {
seq_printf(seq,
{
while(fl) {
seq_printf(seq,
- "%05X %-1d %-6d %-6d %-6ld %-8ld "
- "%02x%02x%02x%02x%02x%02x%02x%02x "
- "%-4d\n",
+ "%05X %-1d %-6d %-6d %-6ld %-8ld " NIP6_SEQFMT " %-4d\n",
(unsigned)ntohl(fl->label),
fl->share,
(unsigned)fl->owner,
(unsigned)ntohl(fl->label),
fl->share,
(unsigned)fl->owner,
@@
-645,8
+644,8
@@
static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl)
static int ip6fl_seq_show(struct seq_file *seq, void *v)
{
if (v == SEQ_START_TOKEN)
static int ip6fl_seq_show(struct seq_file *seq, void *v)
{
if (v == SEQ_START_TOKEN)
- seq_printf(seq, "
Label S Owner Users Linger Expires "
-
"Dst Opt\n
");
+ seq_printf(seq, "
%-5s %-1s %-6s %-6s %-6s %-8s %-32s %s\n",
+
"Label", "S", "Owner", "Users", "Linger", "Expires", "Dst", "Opt
");
else
ip6fl_fl_seq_show(seq, v);
return 0;
else
ip6fl_fl_seq_show(seq, v);
return 0;
@@
-663,7
+662,7
@@
static int ip6fl_seq_open(struct inode *inode, struct file *file)
{
struct seq_file *seq;
int rc = -ENOMEM;
{
struct seq_file *seq;
int rc = -ENOMEM;
- struct ip6fl_iter_state *s = k
m
alloc(sizeof(*s), GFP_KERNEL);
+ struct ip6fl_iter_state *s = k
z
alloc(sizeof(*s), GFP_KERNEL);
if (!s)
goto out;
if (!s)
goto out;
@@
-674,7
+673,6
@@
static int ip6fl_seq_open(struct inode *inode, struct file *file)
seq = file->private_data;
seq->private = s;
seq = file->private_data;
seq->private = s;
- memset(s, 0, sizeof(*s));
out:
return rc;
out_kfree:
out:
return rc;
out_kfree:
@@
-692,14
+690,14
@@
static struct file_operations ip6fl_seq_fops = {
#endif
#endif
-void ip6_flowlabel_init()
+void ip6_flowlabel_init(
void
)
{
#ifdef CONFIG_PROC_FS
proc_net_fops_create("ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops);
#endif
}
{
#ifdef CONFIG_PROC_FS
proc_net_fops_create("ip6_flowlabel", S_IRUGO, &ip6fl_seq_fops);
#endif
}
-void ip6_flowlabel_cleanup()
+void ip6_flowlabel_cleanup(
void
)
{
del_timer(&ip6_fl_gc_timer);
#ifdef CONFIG_PROC_FS
{
del_timer(&ip6_fl_gc_timer);
#ifdef CONFIG_PROC_FS