sbitmap: Try each queue to wake up at least one waiter
[platform/kernel/linux-starfive.git] / lib / nlattr.c
index 40f22b1..dffd60e 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/jiffies.h>
+#include <linux/nospec.h>
 #include <linux/skbuff.h>
 #include <linux/string.h>
 #include <linux/types.h>
@@ -124,10 +125,12 @@ void nla_get_range_unsigned(const struct nla_policy *pt,
                range->max = U8_MAX;
                break;
        case NLA_U16:
+       case NLA_BE16:
        case NLA_BINARY:
                range->max = U16_MAX;
                break;
        case NLA_U32:
+       case NLA_BE32:
                range->max = U32_MAX;
                break;
        case NLA_U64:
@@ -159,31 +162,6 @@ void nla_get_range_unsigned(const struct nla_policy *pt,
        }
 }
 
-static u64 nla_get_attr_bo(const struct nla_policy *pt,
-                          const struct nlattr *nla)
-{
-       switch (pt->type) {
-       case NLA_U16:
-               if (pt->network_byte_order)
-                       return ntohs(nla_get_be16(nla));
-
-               return nla_get_u16(nla);
-       case NLA_U32:
-               if (pt->network_byte_order)
-                       return ntohl(nla_get_be32(nla));
-
-               return nla_get_u32(nla);
-       case NLA_U64:
-               if (pt->network_byte_order)
-                       return be64_to_cpu(nla_get_be64(nla));
-
-               return nla_get_u64(nla);
-       }
-
-       WARN_ON_ONCE(1);
-       return 0;
-}
-
 static int nla_validate_range_unsigned(const struct nla_policy *pt,
                                       const struct nlattr *nla,
                                       struct netlink_ext_ack *extack,
@@ -197,9 +175,13 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
                value = nla_get_u8(nla);
                break;
        case NLA_U16:
+               value = nla_get_u16(nla);
+               break;
        case NLA_U32:
+               value = nla_get_u32(nla);
+               break;
        case NLA_U64:
-               value = nla_get_attr_bo(pt, nla);
+               value = nla_get_u64(nla);
                break;
        case NLA_MSECS:
                value = nla_get_u64(nla);
@@ -207,6 +189,12 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
        case NLA_BINARY:
                value = nla_len(nla);
                break;
+       case NLA_BE16:
+               value = ntohs(nla_get_be16(nla));
+               break;
+       case NLA_BE32:
+               value = ntohl(nla_get_be32(nla));
+               break;
        default:
                return -EINVAL;
        }
@@ -334,6 +322,8 @@ static int nla_validate_int_range(const struct nla_policy *pt,
        case NLA_U64:
        case NLA_MSECS:
        case NLA_BINARY:
+       case NLA_BE16:
+       case NLA_BE32:
                return nla_validate_range_unsigned(pt, nla, extack, validate);
        case NLA_S8:
        case NLA_S16:
@@ -392,6 +382,7 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
        if (type <= 0 || type > maxtype)
                return 0;
 
+       type = array_index_nospec(type, maxtype + 1);
        pt = &policy[type];
 
        BUG_ON(pt->type > NLA_TYPE_MAX);
@@ -607,6 +598,7 @@ static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
                        }
                        continue;
                }
+               type = array_index_nospec(type, maxtype + 1);
                if (policy) {
                        int err = validate_nla(nla, maxtype, policy,
                                               validate, extack, depth);