bcachefs: bucket_valid()
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 12 Apr 2024 01:18:35 +0000 (21:18 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:19 +0000 (17:29 -0400)
cut out a branch from doing it the obvious way

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.h
fs/bcachefs/bcachefs.h
fs/bcachefs/buckets.h
fs/bcachefs/extents.c
fs/bcachefs/sb-members.h
fs/bcachefs/sb-members_types.h [new file with mode: 0644]
fs/bcachefs/super_types.h

index 2790e516383d59dccf7a75f0782abe797e1f51bc..2bcc648081c381af525c49ae4a7618ae10ef64d6 100644 (file)
@@ -21,8 +21,7 @@ static inline bool bch2_dev_bucket_exists(struct bch_fs *c, struct bpos pos)
                return false;
 
        ca = bch_dev_bkey_exists(c, pos.inode);
-       return pos.offset >= ca->mi.first_bucket &&
-               pos.offset < ca->mi.nbuckets;
+       return bucket_valid(ca, pos.offset);
 }
 
 static inline u64 bucket_to_u64(struct bpos bucket)
index 6366a6a90944d2588802abbf31ca94175ca2c478..3dad47533491870207a459c0e0f188fb7e696042 100644 (file)
@@ -470,6 +470,7 @@ enum bch_time_stats {
 #include "quota_types.h"
 #include "rebalance_types.h"
 #include "replicas_types.h"
+#include "sb-members_types.h"
 #include "subvolume_types.h"
 #include "super_types.h"
 #include "thread_with_file_types.h"
index a84e14468276e77115e5e05cfb1a76075c465bd2..97b4bf8961e2bf25448132b986f035b37b3bd4a5 100644 (file)
@@ -12,7 +12,7 @@
 #include "extents.h"
 #include "sb-members.h"
 
-static inline size_t sector_to_bucket(const struct bch_dev *ca, sector_t s)
+static inline u64 sector_to_bucket(const struct bch_dev *ca, sector_t s)
 {
        return div_u64(s, ca->mi.bucket_size);
 }
@@ -30,12 +30,16 @@ static inline sector_t bucket_remainder(const struct bch_dev *ca, sector_t s)
        return remainder;
 }
 
-static inline size_t sector_to_bucket_and_offset(const struct bch_dev *ca, sector_t s,
-                                                u32 *offset)
+static inline u64 sector_to_bucket_and_offset(const struct bch_dev *ca, sector_t s, u32 *offset)
 {
        return div_u64_rem(s, ca->mi.bucket_size, offset);
 }
 
+static inline bool bucket_valid(const struct bch_dev *ca, u64 b)
+{
+       return b - ca->mi.first_bucket < ca->mi.nbuckets_minus_first;
+}
+
 #define for_each_bucket(_b, _buckets)                          \
        for (_b = (_buckets)->b + (_buckets)->first_bucket;     \
             _b < (_buckets)->b + (_buckets)->nbuckets; _b++)
@@ -94,7 +98,7 @@ static inline struct bucket *gc_bucket(struct bch_dev *ca, size_t b)
 {
        struct bucket_array *buckets = gc_bucket_array(ca);
 
-       BUG_ON(b < buckets->first_bucket || b >= buckets->nbuckets);
+       BUG_ON(!bucket_valid(ca, b));
        return buckets->b + b;
 }
 
@@ -111,7 +115,7 @@ static inline u8 *bucket_gen(struct bch_dev *ca, size_t b)
 {
        struct bucket_gens *gens = bucket_gens(ca);
 
-       BUG_ON(b < gens->first_bucket || b >= gens->nbuckets);
+       BUG_ON(!bucket_valid(ca, b));
        return gens->b + b;
 }
 
index 1a331e539204852d4db9e7620df0282abe262f1e..e9db8f6d6bc119cd3324b1244b3dcb11ace06e9b 100644 (file)
@@ -998,9 +998,7 @@ void bch2_extent_ptr_to_text(struct printbuf *out, struct bch_fs *c, const struc
                        prt_str(out, " cached");
                if (ptr->unwritten)
                        prt_str(out, " unwritten");
-               if (b >= ca->mi.first_bucket &&
-                   b <  ca->mi.nbuckets &&
-                   ptr_stale(ca, ptr))
+               if (bucket_valid(ca, b) && ptr_stale(ca, ptr))
                        prt_printf(out, " stale");
        }
 }
index 5bf27d30ca2969017c6d33edde8c99ce1a36cb7b..fa55b96662413791f41b6ec321d4529d50a01cef 100644 (file)
@@ -210,6 +210,8 @@ static inline struct bch_member_cpu bch2_mi_to_cpu(struct bch_member *mi)
 {
        return (struct bch_member_cpu) {
                .nbuckets       = le64_to_cpu(mi->nbuckets),
+               .nbuckets_minus_first = le64_to_cpu(mi->nbuckets) -
+                       le16_to_cpu(mi->first_bucket),
                .first_bucket   = le16_to_cpu(mi->first_bucket),
                .bucket_size    = le16_to_cpu(mi->bucket_size),
                .group          = BCH_MEMBER_GROUP(mi),
diff --git a/fs/bcachefs/sb-members_types.h b/fs/bcachefs/sb-members_types.h
new file mode 100644 (file)
index 0000000..c0eda88
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _BCACHEFS_SB_MEMBERS_TYPES_H
+#define _BCACHEFS_SB_MEMBERS_TYPES_H
+
+struct bch_member_cpu {
+       u64                     nbuckets;       /* device size */
+       u64                     nbuckets_minus_first;
+       u16                     first_bucket;   /* index of first bucket used */
+       u16                     bucket_size;    /* sectors */
+       u16                     group;
+       u8                      state;
+       u8                      discard;
+       u8                      data_allowed;
+       u8                      durability;
+       u8                      freespace_initialized;
+       u8                      valid;
+       u8                      btree_bitmap_shift;
+       u64                     btree_allocated_bitmap;
+};
+
+#endif /* _BCACHEFS_SB_MEMBERS_H */
index 11bcef170c2c22644108e9fbec9b24eaf478059c..368a63d938cfc910186fcf13ab9a7917868b269f 100644 (file)
@@ -26,19 +26,4 @@ struct bch_devs_list {
        u8                      data[BCH_BKEY_PTRS_MAX];
 };
 
-struct bch_member_cpu {
-       u64                     nbuckets;       /* device size */
-       u16                     first_bucket;   /* index of first bucket used */
-       u16                     bucket_size;    /* sectors */
-       u16                     group;
-       u8                      state;
-       u8                      discard;
-       u8                      data_allowed;
-       u8                      durability;
-       u8                      freespace_initialized;
-       u8                      valid;
-       u8                      btree_bitmap_shift;
-       u64                     btree_allocated_bitmap;
-};
-
 #endif /* _BCACHEFS_SUPER_TYPES_H */