[NETFILTER]: {nf_netlink,ip,ip6}_queue: use list_for_each_entry
[deliverable/linux.git] / net / netfilter / nfnetlink_queue.c
index 48e095a7de2db28a566fe906845a6d1bd480a1c5..74d5ed9490a9814bd8b14ebcb391361e2c822ef0 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/netfilter/nfnetlink_queue.h>
 #include <linux/list.h>
 #include <net/sock.h>
+#include <net/netfilter/nf_queue.h>
 
 #include <asm/atomic.h>
 
@@ -230,7 +231,7 @@ static inline void
 __enqueue_entry(struct nfqnl_instance *queue,
                      struct nfqnl_queue_entry *entry)
 {
-       list_add(&entry->list, &queue->queue_list);
+       list_add_tail(&entry->list, &queue->queue_list);
        queue->queue_total++;
 }
 
@@ -242,11 +243,9 @@ static inline struct nfqnl_queue_entry *
 __find_entry(struct nfqnl_instance *queue, nfqnl_cmpfn cmpfn,
                   unsigned long data)
 {
-       struct list_head *p;
-
-       list_for_each_prev(p, &queue->queue_list) {
-               struct nfqnl_queue_entry *entry = (struct nfqnl_queue_entry *)p;
+       struct nfqnl_queue_entry *entry;
 
+       list_for_each_entry(entry, &queue->queue_list, list) {
                if (!cmpfn || cmpfn(entry, data))
                        return entry;
        }
@@ -534,7 +533,7 @@ nla_put_failure:
 
 static int
 nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
-                    unsigned int queuenum, void *data)
+                    unsigned int queuenum)
 {
        int status = -EINVAL;
        struct sk_buff *nskb;
@@ -617,6 +616,7 @@ static int
 nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
 {
        int diff;
+       int err;
 
        diff = data_len - e->skb->len;
        if (diff < 0) {
@@ -626,25 +626,18 @@ nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
                if (data_len > 0xFFFF)
                        return -EINVAL;
                if (diff > skb_tailroom(e->skb)) {
-                       struct sk_buff *newskb;
-
-                       newskb = skb_copy_expand(e->skb,
-                                                skb_headroom(e->skb),
-                                                diff,
-                                                GFP_ATOMIC);
-                       if (newskb == NULL) {
+                       err = pskb_expand_head(e->skb, 0,
+                                              diff - skb_tailroom(e->skb),
+                                              GFP_ATOMIC);
+                       if (err) {
                                printk(KERN_WARNING "nf_queue: OOM "
                                      "in mangle, dropping packet\n");
-                               return -ENOMEM;
+                               return err;
                        }
-                       if (e->skb->sk)
-                               skb_set_owner_w(newskb, e->skb->sk);
-                       kfree_skb(e->skb);
-                       e->skb = newskb;
                }
                skb_put(e->skb, diff);
        }
-       if (!skb_make_writable(&e->skb, data_len))
+       if (!skb_make_writable(e->skb, data_len))
                return -ENOMEM;
        skb_copy_to_linear_data(e->skb, data, data_len);
        e->skb->ip_summed = CHECKSUM_NONE;
@@ -855,7 +848,7 @@ static const struct nla_policy nfqa_cfg_policy[NFQA_CFG_MAX+1] = {
        [NFQA_CFG_PARAMS]       = { .len = sizeof(struct nfqnl_msg_config_params) },
 };
 
-static struct nf_queue_handler nfqh = {
+static const struct nf_queue_handler nfqh = {
        .name   = "nf_queue",
        .outfn  = &nfqnl_enqueue_packet,
 };
@@ -1051,22 +1044,8 @@ static const struct seq_operations nfqnl_seq_ops = {
 
 static int nfqnl_open(struct inode *inode, struct file *file)
 {
-       struct seq_file *seq;
-       struct iter_state *is;
-       int ret;
-
-       is = kzalloc(sizeof(*is), GFP_KERNEL);
-       if (!is)
-               return -ENOMEM;
-       ret = seq_open(file, &nfqnl_seq_ops);
-       if (ret < 0)
-               goto out_free;
-       seq = file->private_data;
-       seq->private = is;
-       return ret;
-out_free:
-       kfree(is);
-       return ret;
+       return seq_open_private(file, &nfqnl_seq_ops,
+                       sizeof(struct iter_state));
 }
 
 static const struct file_operations nfqnl_file_ops = {
This page took 0.0275 seconds and 5 git commands to generate.