Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
[safe/jmp/linux-2.6] / net / core / filter.c
index e3987e1..d38ef7f 100644 (file)
@@ -86,7 +86,7 @@ int sk_filter(struct sock *sk, struct sk_buff *skb)
                return err;
 
        rcu_read_lock_bh();
-       filter = rcu_dereference(sk->sk_filter);
+       filter = rcu_dereference_bh(sk->sk_filter);
        if (filter) {
                unsigned int pkt_len = sk_run_filter(skb, filter->insns,
                                filter->len);
@@ -306,6 +306,9 @@ load_b:
                case SKF_AD_MARK:
                        A = skb->mark;
                        continue;
+               case SKF_AD_QUEUE:
+                       A = skb->queue_mapping;
+                       continue;
                case SKF_AD_NLATTR: {
                        struct nlattr *nla;
 
@@ -518,7 +521,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
        }
 
        rcu_read_lock_bh();
-       old_fp = rcu_dereference(sk->sk_filter);
+       old_fp = rcu_dereference_bh(sk->sk_filter);
        rcu_assign_pointer(sk->sk_filter, fp);
        rcu_read_unlock_bh();
 
@@ -526,6 +529,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
                sk_filter_delayed_uncharge(sk, old_fp);
        return 0;
 }
+EXPORT_SYMBOL_GPL(sk_attach_filter);
 
 int sk_detach_filter(struct sock *sk)
 {
@@ -533,7 +537,7 @@ int sk_detach_filter(struct sock *sk)
        struct sk_filter *filter;
 
        rcu_read_lock_bh();
-       filter = rcu_dereference(sk->sk_filter);
+       filter = rcu_dereference_bh(sk->sk_filter);
        if (filter) {
                rcu_assign_pointer(sk->sk_filter, NULL);
                sk_filter_delayed_uncharge(sk, filter);
@@ -542,3 +546,4 @@ int sk_detach_filter(struct sock *sk)
        rcu_read_unlock_bh();
        return ret;
 }
+EXPORT_SYMBOL_GPL(sk_detach_filter);