MIPS: SMP: Allow suspend and hibernation if CPU hotplug is available
[pandora-kernel.git] / net / netfilter / nfnetlink.c
index b8ab37a..92761a9 100644 (file)
@@ -107,9 +107,10 @@ int nfnetlink_has_listeners(unsigned int group)
 }
 EXPORT_SYMBOL_GPL(nfnetlink_has_listeners);
 
-int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, int echo)
+int nfnetlink_send(struct sk_buff *skb, u32 pid,
+                  unsigned group, int echo, gfp_t flags)
 {
-       return nlmsg_notify(nfnl, skb, pid, group, echo, gfp_any());
+       return nlmsg_notify(nfnl, skb, pid, group, echo, flags);
 }
 EXPORT_SYMBOL_GPL(nfnetlink_send);
 
@@ -136,7 +137,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                return -EPERM;
 
        /* All the messages must at least contain nfgenmsg */
-       if (nlh->nlmsg_len < NLMSG_SPACE(sizeof(struct nfgenmsg)))
+       if (nlh->nlmsg_len < NLMSG_LENGTH(sizeof(struct nfgenmsg)))
                return 0;
 
        type = nlh->nlmsg_type;
@@ -160,19 +161,14 @@ replay:
        {
                int min_len = NLMSG_SPACE(sizeof(struct nfgenmsg));
                u_int8_t cb_id = NFNL_MSG_TYPE(nlh->nlmsg_type);
-               u_int16_t attr_count = ss->cb[cb_id].attr_count;
-               struct nlattr *cda[attr_count+1];
-
-               if (likely(nlh->nlmsg_len >= min_len)) {
-                       struct nlattr *attr = (void *)nlh + NLMSG_ALIGN(min_len);
-                       int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(min_len);
-
-                       err = nla_parse(cda, attr_count, attr, attrlen,
-                                       ss->cb[cb_id].policy);
-                       if (err < 0)
-                               return err;
-               } else
-                       return -EINVAL;
+               struct nlattr *cda[ss->cb[cb_id].attr_count + 1];
+               struct nlattr *attr = (void *)nlh + min_len;
+               int attrlen = nlh->nlmsg_len - min_len;
+
+               err = nla_parse(cda, ss->cb[cb_id].attr_count,
+                               attr, attrlen, ss->cb[cb_id].policy);
+               if (err < 0)
+                       return err;
 
                err = nc->call(nfnl, skb, nlh, cda);
                if (err == -EAGAIN)