Skip to content

Commit

Permalink
lib/string_helpers: Introduce managed variant of kasprintf_strarray()
Browse files Browse the repository at this point in the history
Some of the users want to have easy way to allocate array of strings
that will be automatically cleaned when associated device is gone.

Introduce managed variant of kasprintf_strarray() for such use cases.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  • Loading branch information
Andy Shevchenko committed Nov 18, 2021
1 parent 418e0a3 commit acdb89b
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
3 changes: 3 additions & 0 deletions include/linux/string_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <linux/string.h>
#include <linux/types.h>

struct device;
struct file;
struct task_struct;

Expand Down Expand Up @@ -103,4 +104,6 @@ char *kstrdup_quotable_file(struct file *file, gfp_t gfp);
char **kasprintf_strarray(gfp_t gfp, const char *prefix, size_t n);
void kfree_strarray(char **array, size_t n);

char **devm_kasprintf_strarray(struct device *dev, const char *prefix, size_t n);

#endif
31 changes: 31 additions & 0 deletions lib/string_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <linux/math64.h>
#include <linux/export.h>
#include <linux/ctype.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/limits.h>
Expand Down Expand Up @@ -730,6 +731,36 @@ void kfree_strarray(char **array, size_t n)
}
EXPORT_SYMBOL_GPL(kfree_strarray);

struct strarray {
char **array;
size_t n;
};

static void devm_kfree_strarray(struct device *dev, void *res)
{
struct strarray *array = res;

kfree_strarray(array->array, array->n);
}

char **devm_kasprintf_strarray(struct device *dev, const char *prefix, size_t n)
{
struct strarray *ptr;

ptr = devres_alloc(devm_kfree_strarray, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return ERR_PTR(-ENOMEM);

ptr->array = kasprintf_strarray(GFP_KERNEL, prefix, n);
if (!ptr->array) {
devres_free(ptr);
return ERR_PTR(-ENOMEM);
}

return ptr->array;
}
EXPORT_SYMBOL_GPL(devm_kasprintf_strarray);

/**
* strscpy_pad() - Copy a C-string into a sized buffer
* @dest: Where to copy the string to
Expand Down

0 comments on commit acdb89b

Please sign in to comment.