#define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE)
 
 struct nf_conn_labels {
-       u8 words;
-       unsigned long bits[];
+       unsigned long bits[NF_CT_LABELS_MAX_SIZE / sizeof(long)];
 };
 
 static inline struct nf_conn_labels *nf_ct_labels_find(const struct nf_conn *ct)
 static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct)
 {
 #ifdef CONFIG_NF_CONNTRACK_LABELS
-       struct nf_conn_labels *cl_ext;
        struct net *net = nf_ct_net(ct);
-       u8 words;
 
-       words = ACCESS_ONCE(net->ct.label_words);
-       if (words == 0)
+       if (net->ct.labels_used == 0)
                return NULL;
 
-       cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS,
-                                     words * sizeof(long), GFP_ATOMIC);
-       if (cl_ext != NULL)
-               cl_ext->words = words;
-
-       return cl_ext;
+       return nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS,
+                                   sizeof(struct nf_conn_labels), GFP_ATOMIC);
 #else
        return NULL;
 #endif
 
 {
        struct nf_conn_labels *labels = nf_ct_labels_find(ct);
 
-       if (!labels || BIT_WORD(bit) >= labels->words)
+       if (!labels)
                return -ENOSPC;
 
        if (test_bit(bit, labels->bits))
        if (!labels)
                return -ENOSPC;
 
-       size = labels->words * sizeof(long);
+       size = sizeof(labels->bits);
        if (size < (words32 * sizeof(u32)))
                words32 = size / sizeof(u32);
 
 
 int nf_connlabels_get(struct net *net, unsigned int bits)
 {
-       size_t words;
-
-       words = BIT_WORD(bits) + 1;
-       if (words > NF_CT_LABELS_MAX_SIZE / sizeof(long))
+       if (BIT_WORD(bits) >= NF_CT_LABELS_MAX_SIZE / sizeof(long))
                return -ERANGE;
 
        spin_lock(&nf_connlabels_lock);
        net->ct.labels_used++;
-       if (words > net->ct.label_words)
-               net->ct.label_words = words;
        spin_unlock(&nf_connlabels_lock);
 
        return 0;
 {
        spin_lock(&nf_connlabels_lock);
        net->ct.labels_used--;
-       if (net->ct.labels_used == 0)
-               net->ct.label_words = 0;
        spin_unlock(&nf_connlabels_lock);
 }
 EXPORT_SYMBOL_GPL(nf_connlabels_put);
 
 
        if (!labels)
                return 0;
-       return nla_total_size(labels->words * sizeof(long));
+       return nla_total_size(sizeof(labels->bits));
 }
 
 static int
 ctnetlink_dump_labels(struct sk_buff *skb, const struct nf_conn *ct)
 {
        struct nf_conn_labels *labels = nf_ct_labels_find(ct);
-       unsigned int len, i;
+       unsigned int i;
 
        if (!labels)
                return 0;
 
-       len = labels->words * sizeof(long);
        i = 0;
        do {
                if (labels->bits[i] != 0)
-                       return nla_put(skb, CTA_LABELS, len, labels->bits);
+                       return nla_put(skb, CTA_LABELS, sizeof(labels->bits),
+                                      labels->bits);
                i++;
-       } while (i < labels->words);
+       } while (i < ARRAY_SIZE(labels->bits));
 
        return 0;
 }
 
 #ifdef CONFIG_NF_CONNTRACK_LABELS
        case NFT_CT_LABELS: {
                struct nf_conn_labels *labels = nf_ct_labels_find(ct);
-               unsigned int size;
 
-               if (!labels) {
+               if (labels)
+                       memcpy(dest, labels->bits, NF_CT_LABELS_MAX_SIZE);
+               else
                        memset(dest, 0, NF_CT_LABELS_MAX_SIZE);
-                       return;
-               }
-
-               size = labels->words * sizeof(long);
-               memcpy(dest, labels->bits, size);
-               if (size < NF_CT_LABELS_MAX_SIZE)
-                       memset(((char *) dest) + size, 0,
-                              NF_CT_LABELS_MAX_SIZE - size);
                return;
        }
 #endif
 
        if (!labels)
                return false;
 
-       return BIT_WORD(bit) < labels->words && test_bit(bit, labels->bits);
+       return test_bit(bit, labels->bits);
 }
 
 static bool
 
        struct nf_conn_labels *cl = ct ? nf_ct_labels_find(ct) : NULL;
 
        if (cl) {
-               size_t len = cl->words * sizeof(long);
+               size_t len = sizeof(cl->bits);
 
                if (len > OVS_CT_LABELS_LEN)
                        len = OVS_CT_LABELS_LEN;
                nf_ct_labels_ext_add(ct);
                cl = nf_ct_labels_find(ct);
        }
-       if (!cl || cl->words * sizeof(long) < OVS_CT_LABELS_LEN)
+       if (!cl || sizeof(cl->bits) < OVS_CT_LABELS_LEN)
                return -ENOSPC;
 
        err = nf_connlabels_replace(ct, (u32 *)labels, (u32 *)mask,