summaryrefslogtreecommitdiff
path: root/fs/bcachefs/util.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-23 05:10:32 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-01 19:47:43 +0300
commit806ebf2aa01749ca4c510fbb42cd146bdfdbe5a4 (patch)
tree6ec98ac3db9b93961293a412efabe0d783096a78 /fs/bcachefs/util.c
parent0c0ba8e9c5a9f06a6a57acfc34a5526f9fdd41c4 (diff)
downloadlinux-806ebf2aa01749ca4c510fbb42cd146bdfdbe5a4.tar.xz
bcachefs: Convert split_devs() to darray
Bit of cleanup & modernization: also moving this code to util.c, it'll be used by userspace as well. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/util.c')
-rw-r--r--fs/bcachefs/util.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/fs/bcachefs/util.c b/fs/bcachefs/util.c
index d530277f9017..2e4c5d9606de 100644
--- a/fs/bcachefs/util.c
+++ b/fs/bcachefs/util.c
@@ -1174,3 +1174,37 @@ u64 *bch2_acc_percpu_u64s(u64 __percpu *p, unsigned nr)
return ret;
}
+
+void bch2_darray_str_exit(darray_str *d)
+{
+ darray_for_each(*d, i)
+ kfree(*i);
+ darray_exit(d);
+}
+
+int bch2_split_devs(const char *_dev_name, darray_str *ret)
+{
+ darray_init(ret);
+
+ char *dev_name = kstrdup(_dev_name, GFP_KERNEL), *s = dev_name;
+ if (!dev_name)
+ return -ENOMEM;
+
+ while ((s = strsep(&dev_name, ":"))) {
+ char *p = kstrdup(s, GFP_KERNEL);
+ if (!p)
+ goto err;
+
+ if (darray_push(ret, p)) {
+ kfree(p);
+ goto err;
+ }
+ }
+
+ kfree(dev_name);
+ return 0;
+err:
+ bch2_darray_str_exit(ret);
+ kfree(dev_name);
+ return -ENOMEM;
+}