* @shared: Indicates if this alias pool is shared by multiple channels
*
* @lock: Lock protecting @aliases and @use_mask
- * @aliases: Array of aliases, must hold exactly @size elements
* @use_mask: Mask of used aliases
+ * @aliases: Array of aliases, must hold exactly @size elements
*/
struct i2c_atr_alias_pool {
size_t size;
/* Protects aliases and use_mask */
spinlock_t lock;
- u16 *aliases;
unsigned long *use_mask;
+ u16 aliases[] __counted_by(size);
};
/**
struct i2c_atr_alias_pool *alias_pool;
int ret;
- alias_pool = kzalloc_obj(*alias_pool);
+ alias_pool = kzalloc_flex(*alias_pool, aliases, num_aliases);
if (!alias_pool)
return ERR_PTR(-ENOMEM);
alias_pool->size = num_aliases;
- alias_pool->aliases = kcalloc(num_aliases, sizeof(*alias_pool->aliases), GFP_KERNEL);
- if (!alias_pool->aliases) {
- ret = -ENOMEM;
- goto err_free_alias_pool;
- }
-
alias_pool->use_mask = bitmap_zalloc(num_aliases, GFP_KERNEL);
if (!alias_pool->use_mask) {
ret = -ENOMEM;
- goto err_free_aliases;
+ goto err_free_alias_pool;
}
alias_pool->shared = shared;
return alias_pool;
-err_free_aliases:
- kfree(alias_pool->aliases);
err_free_alias_pool:
kfree(alias_pool);
return ERR_PTR(ret);
static void i2c_atr_free_alias_pool(struct i2c_atr_alias_pool *alias_pool)
{
bitmap_free(alias_pool->use_mask);
- kfree(alias_pool->aliases);
kfree(alias_pool);
}