}
 
        desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN]));
-       if (desc.klen == 0 || desc.klen > FIELD_SIZEOF(struct nft_data, data))
+       if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN)
                return -EINVAL;
 
        flags = 0;
                        if (nla[NFTA_SET_DATA_LEN] == NULL)
                                return -EINVAL;
                        desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN]));
-                       if (desc.dlen == 0 ||
-                           desc.dlen > FIELD_SIZEOF(struct nft_data, data))
+                       if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN)
                                return -EINVAL;
                } else
-                       desc.dlen = sizeof(struct nft_data);
+                       desc.dlen = sizeof(struct nft_verdict);
        } else if (flags & NFT_SET_MAP)
                return -EINVAL;
 
 
 const struct nft_set_ext_type nft_set_ext_types[] = {
        [NFT_SET_EXT_KEY]               = {
-               .len    = sizeof(struct nft_data),
-               .align  = __alignof__(struct nft_data),
+               .align  = __alignof__(u32),
        },
        [NFT_SET_EXT_DATA]              = {
-               .len    = sizeof(struct nft_data),
-               .align  = __alignof__(struct nft_data),
+               .align  = __alignof__(u32),
        },
        [NFT_SET_EXT_FLAGS]             = {
                .len    = sizeof(u8),
                timeout = set->timeout;
        }
 
-       err = nft_data_init(ctx, &elem.key, sizeof(elem.key), &d1,
+       err = nft_data_init(ctx, &elem.key.val, sizeof(elem.key), &d1,
                            nla[NFTA_SET_ELEM_KEY]);
        if (err < 0)
                goto err1;
        if (d1.type != NFT_DATA_VALUE || d1.len != set->klen)
                goto err2;
 
-       nft_set_ext_add(&tmpl, NFT_SET_EXT_KEY);
+       nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, d1.len);
        if (timeout > 0) {
                nft_set_ext_add(&tmpl, NFT_SET_EXT_EXPIRATION);
                if (timeout != set->timeout)
                                goto err3;
                }
 
-               nft_set_ext_add(&tmpl, NFT_SET_EXT_DATA);
+               nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, d2.len);
        }
 
        /* The full maximum length of userdata can exceed the maximum
        }
 
        err = -ENOMEM;
-       elem.priv = nft_set_elem_init(set, &tmpl, elem.key.data, data.data,
+       elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data, data.data,
                                      timeout, GFP_KERNEL);
        if (elem.priv == NULL)
                goto err3;
        if (nla[NFTA_SET_ELEM_DATA] != NULL)
                nft_data_uninit(&data, d2.type);
 err2:
-       nft_data_uninit(&elem.key, d1.type);
+       nft_data_uninit(&elem.key.val, d1.type);
 err1:
        return err;
 }
        if (nla[NFTA_SET_ELEM_KEY] == NULL)
                goto err1;
 
-       err = nft_data_init(ctx, &elem.key, sizeof(elem.key), &desc,
+       err = nft_data_init(ctx, &elem.key.val, sizeof(elem.key), &desc,
                            nla[NFTA_SET_ELEM_KEY]);
        if (err < 0)
                goto err1;
 err3:
        kfree(trans);
 err2:
-       nft_data_uninit(&elem.key, desc.type);
+       nft_data_uninit(&elem.key.val, desc.type);
 err1:
        return err;
 }