summaryrefslogtreecommitdiff
path: root/fs/bcachefs/dirent.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-04 00:50:01 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:30 +0300
commitf0ac7df23d04f3c6d4cd82899aad7f06f6a0b1d4 (patch)
treee11cada7a81e2d1daab091b4552a498055bdce31 /fs/bcachefs/dirent.c
parentd1d7737fd9df0cc57cd276b0189faf8c92c1426f (diff)
downloadlinux-f0ac7df23d04f3c6d4cd82899aad7f06f6a0b1d4.tar.xz
bcachefs: Convert .key_invalid methods to printbufs
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/dirent.c')
-rw-r--r--fs/bcachefs/dirent.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c
index 760e4f74715f..e8a284a69be4 100644
--- a/fs/bcachefs/dirent.c
+++ b/fs/bcachefs/dirent.c
@@ -83,38 +83,58 @@ const struct bch_hash_desc bch2_dirent_hash_desc = {
.is_visible = dirent_is_visible,
};
-const char *bch2_dirent_invalid(const struct bch_fs *c, struct bkey_s_c k)
+int bch2_dirent_invalid(const struct bch_fs *c, struct bkey_s_c k,
+ struct printbuf *err)
{
struct bkey_s_c_dirent d = bkey_s_c_to_dirent(k);
unsigned len;
- if (bkey_val_bytes(k.k) < sizeof(struct bch_dirent))
- return "value too small";
+ if (bkey_val_bytes(k.k) < sizeof(struct bch_dirent)) {
+ pr_buf(err, "incorrect value size (%zu < %zu)",
+ bkey_val_bytes(k.k), sizeof(*d.v));
+ return -EINVAL;
+ }
len = bch2_dirent_name_bytes(d);
- if (!len)
- return "empty name";
+ if (!len) {
+ pr_buf(err, "empty name");
+ return -EINVAL;
+ }
- if (bkey_val_u64s(k.k) > dirent_val_u64s(len))
- return "value too big";
+ if (bkey_val_u64s(k.k) > dirent_val_u64s(len)) {
+ pr_buf(err, "value too big (%zu > %u)",
+ bkey_val_u64s(k.k),dirent_val_u64s(len));
+ return -EINVAL;
+ }
- if (len > BCH_NAME_MAX)
- return "dirent name too big";
+ if (len > BCH_NAME_MAX) {
+ pr_buf(err, "dirent name too big (%u > %lu)",
+ len, BCH_NAME_MAX);
+ return -EINVAL;
+ }
- if (len == 1 && !memcmp(d.v->d_name, ".", 1))
- return "invalid name";
+ if (len == 1 && !memcmp(d.v->d_name, ".", 1)) {
+ pr_buf(err, "invalid name");
+ return -EINVAL;
+ }
- if (len == 2 && !memcmp(d.v->d_name, "..", 2))
- return "invalid name";
+ if (len == 2 && !memcmp(d.v->d_name, "..", 2)) {
+ pr_buf(err, "invalid name");
+ return -EINVAL;
+ }
- if (memchr(d.v->d_name, '/', len))
- return "invalid name";
+ if (memchr(d.v->d_name, '/', len)) {
+ pr_buf(err, "invalid name");
+ return -EINVAL;
+ }
if (d.v->d_type != DT_SUBVOL &&
- le64_to_cpu(d.v->d_inum) == d.k->p.inode)
- return "dirent points to own directory";
+ le64_to_cpu(d.v->d_inum) == d.k->p.inode) {
+ pr_buf(err, "dirent points to own directory");
+ return -EINVAL;
+ }
- return NULL;
+ return 0;
}
void bch2_dirent_to_text(struct printbuf *out, struct bch_fs *c,