]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
badblocks: add more helper structure and routines in badblocks.h
authorColy Li <colyli@suse.de>
Fri, 11 Aug 2023 17:05:07 +0000 (01:05 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 26 Sep 2023 06:44:33 +0000 (00:44 -0600)
This patch adds the following helper structure and routines into
badblocks.h,
- struct badblocks_context
  This structure is used in improved badblocks code for bad table
  iteration.
- BB_END()
  The macro to calculate end LBA of a bad range record from bad
  table.
- badblocks_full() and badblocks_empty()
  The inline routines to check whether bad table is full or empty.
- set_changed() and clear_changed()
  The inline routines to set and clear 'changed' tag from struct
  badblocks.

These new helper structure and routines can help to make the code more
clear, they will be used in the improved badblocks code in following
patches.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Xiao Ni <xni@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Geliang Tang <geliang.tang@suse.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: NeilBrown <neilb@suse.de>
Cc: Vishal L Verma <vishal.l.verma@intel.com>
Acked-by: Geliang Tang <geliang.tang@suse.com>
Link: https://lore.kernel.org/r/20230811170513.2300-2-colyli@suse.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/badblocks.h

index 2426276b9bd3c40a874dc958ad087f8337169926..670f2dae692fb20cab66a2781557b6b713a8c418 100644 (file)
@@ -15,6 +15,7 @@
 #define BB_OFFSET(x)   (((x) & BB_OFFSET_MASK) >> 9)
 #define BB_LEN(x)      (((x) & BB_LEN_MASK) + 1)
 #define BB_ACK(x)      (!!((x) & BB_ACK_MASK))
+#define BB_END(x)      (BB_OFFSET(x) + BB_LEN(x))
 #define BB_MAKE(a, l, ack) (((a)<<9) | ((l)-1) | ((u64)(!!(ack)) << 63))
 
 /* Bad block numbers are stored sorted in a single page.
@@ -41,6 +42,12 @@ struct badblocks {
        sector_t size;          /* in sectors */
 };
 
+struct badblocks_context {
+       sector_t        start;
+       sector_t        len;
+       int             ack;
+};
+
 int badblocks_check(struct badblocks *bb, sector_t s, int sectors,
                   sector_t *first_bad, int *bad_sectors);
 int badblocks_set(struct badblocks *bb, sector_t s, int sectors,
@@ -63,4 +70,27 @@ static inline void devm_exit_badblocks(struct device *dev, struct badblocks *bb)
        }
        badblocks_exit(bb);
 }
+
+static inline int badblocks_full(struct badblocks *bb)
+{
+       return (bb->count >= MAX_BADBLOCKS);
+}
+
+static inline int badblocks_empty(struct badblocks *bb)
+{
+       return (bb->count == 0);
+}
+
+static inline void set_changed(struct badblocks *bb)
+{
+       if (bb->changed != 1)
+               bb->changed = 1;
+}
+
+static inline void clear_changed(struct badblocks *bb)
+{
+       if (bb->changed != 0)
+               bb->changed = 0;
+}
+
 #endif