summaryrefslogtreecommitdiff
path: root/fs/bcachefs/alloc_background.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-03 17:50:01 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:30 -0400
commitf0ac7df23d04f3c6d4cd82899aad7f06f6a0b1d4 (patch)
treee11cada7a81e2d1daab091b4552a498055bdce31 /fs/bcachefs/alloc_background.c
parentd1d7737fd9df0cc57cd276b0189faf8c92c1426f (diff)
bcachefs: Convert .key_invalid methods to printbufs
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/alloc_background.c')
-rw-r--r--fs/bcachefs/alloc_background.c75
1 files changed, 45 insertions, 30 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index b0f49044ea24..42ef752932eb 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -302,71 +302,86 @@ static unsigned bch_alloc_v1_val_u64s(const struct bch_alloc *a)
return DIV_ROUND_UP(bytes, sizeof(u64));
}
-const char *bch2_alloc_v1_invalid(const struct bch_fs *c, struct bkey_s_c k)
+int bch2_alloc_v1_invalid(const struct bch_fs *c, struct bkey_s_c k, struct printbuf *err)
{
struct bkey_s_c_alloc a = bkey_s_c_to_alloc(k);
- if (k.k->p.inode >= c->sb.nr_devices ||
- !c->devs[k.k->p.inode])
- return "invalid device";
+ if (!bch2_dev_exists2(c, k.k->p.inode)) {
+ pr_buf(err, "invalid device (%llu)", k.k->p.inode);
+ return -EINVAL;
+ }
/* allow for unknown fields */
- if (bkey_val_u64s(a.k) < bch_alloc_v1_val_u64s(a.v))
- return "incorrect value size";
+ if (bkey_val_u64s(a.k) < bch_alloc_v1_val_u64s(a.v)) {
+ pr_buf(err, "incorrect value size (%zu < %u)",
+ bkey_val_u64s(a.k), bch_alloc_v1_val_u64s(a.v));
+ return -EINVAL;
+ }
- return NULL;
+ return 0;
}
-const char *bch2_alloc_v2_invalid(const struct bch_fs *c, struct bkey_s_c k)
+int bch2_alloc_v2_invalid(const struct bch_fs *c, struct bkey_s_c k, struct printbuf *err)
{
struct bkey_alloc_unpacked u;
- if (k.k->p.inode >= c->sb.nr_devices ||
- !c->devs[k.k->p.inode])
- return "invalid device";
+ if (!bch2_dev_exists2(c, k.k->p.inode)) {
+ pr_buf(err, "invalid device (%llu)", k.k->p.inode);
+ return -EINVAL;
+ }
- if (bch2_alloc_unpack_v2(&u, k))
- return "unpack error";
+ if (bch2_alloc_unpack_v2(&u, k)) {
+ pr_buf(err, "unpack error");
+ return -EINVAL;
+ }
- return NULL;
+ return 0;
}
-const char *bch2_alloc_v3_invalid(const struct bch_fs *c, struct bkey_s_c k)
+int bch2_alloc_v3_invalid(const struct bch_fs *c, struct bkey_s_c k, struct printbuf *err)
{
struct bkey_alloc_unpacked u;
struct bch_dev *ca;
- if (k.k->p.inode >= c->sb.nr_devices ||
- !c->devs[k.k->p.inode])
- return "invalid device";
+ if (!bch2_dev_exists2(c, k.k->p.inode)) {
+ pr_buf(err, "invalid device (%llu)", k.k->p.inode);
+ return -EINVAL;
+ }
ca = bch_dev_bkey_exists(c, k.k->p.inode);
if (k.k->p.offset < ca->mi.first_bucket ||
- k.k->p.offset >= ca->mi.nbuckets)
- return "invalid bucket";
+ k.k->p.offset >= ca->mi.nbuckets) {
+ pr_buf(err, "invalid bucket");
+ return -EINVAL;
+ }
- if (bch2_alloc_unpack_v3(&u, k))
- return "unpack error";
+ if (bch2_alloc_unpack_v3(&u, k)) {
+ pr_buf(err, "unpack error");
+ return -EINVAL;
+ }
- return NULL;
+ return 0;
}
-const char *bch2_alloc_v4_invalid(const struct bch_fs *c, struct bkey_s_c k)
+int bch2_alloc_v4_invalid(const struct bch_fs *c, struct bkey_s_c k, struct printbuf *err)
{
struct bch_dev *ca;
- if (k.k->p.inode >= c->sb.nr_devices ||
- !c->devs[k.k->p.inode])
- return "invalid device";
+ if (!bch2_dev_exists2(c, k.k->p.inode)) {
+ pr_buf(err, "invalid device (%llu)", k.k->p.inode);
+ return -EINVAL;
+ }
ca = bch_dev_bkey_exists(c, k.k->p.inode);
if (k.k->p.offset < ca->mi.first_bucket ||
- k.k->p.offset >= ca->mi.nbuckets)
- return "invalid bucket";
+ k.k->p.offset >= ca->mi.nbuckets) {
+ pr_buf(err, "invalid bucket");
+ return -EINVAL;
+ }
- return NULL;
+ return 0;
}
void bch2_alloc_v4_swab(struct bkey_s k)