badblocks
static int front_splitting_clear(struct badblocks *bb, int prev,
static bool _badblocks_clear(struct badblocks *bb, sector_t s, sector_t sectors)
static int _badblocks_check(struct badblocks *bb, sector_t s, sector_t sectors,
int badblocks_check(struct badblocks *bb, sector_t s, sector_t sectors,
bool badblocks_set(struct badblocks *bb, sector_t s, sector_t sectors,
bool badblocks_clear(struct badblocks *bb, sector_t s, sector_t sectors)
void ack_all_badblocks(struct badblocks *bb)
ssize_t badblocks_show(struct badblocks *bb, char *page, int unack)
ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len,
static int __badblocks_init(struct device *dev, struct badblocks *bb,
int badblocks_init(struct badblocks *bb, int enable)
int devm_init_badblocks(struct device *dev, struct badblocks *bb)
void badblocks_exit(struct badblocks *bb)
static int prev_by_hint(struct badblocks *bb, sector_t s, int hint)
static int prev_badblocks(struct badblocks *bb, struct badblocks_context *bad,
static bool can_merge_front(struct badblocks *bb, int prev,
static int front_merge(struct badblocks *bb, int prev, struct badblocks_context *bad)
static bool can_combine_front(struct badblocks *bb, int prev,
static void front_combine(struct badblocks *bb, int prev)
static bool overlap_front(struct badblocks *bb, int front,
static bool overlap_behind(struct badblocks *bb, struct badblocks_context *bad,
static bool can_front_overwrite(struct badblocks *bb, int prev,
static int front_overwrite(struct badblocks *bb, int prev,
static int insert_at(struct badblocks *bb, int at, struct badblocks_context *bad)
static void badblocks_update_acked(struct badblocks *bb)
static bool try_adjacent_combine(struct badblocks *bb, int prev)
static bool _badblocks_set(struct badblocks *bb, sector_t s, sector_t sectors,
static int front_clear(struct badblocks *bb, int prev,
static DEVICE_ATTR(badblocks, 0644, disk_badblocks_show, disk_badblocks_store);
struct badblocks *bb = &cmd->nq->dev->badblocks;
if (dev->badblocks.shift != -1)
return badblocks_show(&t_dev->badblocks, page, 0);
cmpxchg(&t_dev->badblocks.shift, -1, 0);
if (badblocks_set(&t_dev->badblocks, start,
} else if (badblocks_clear(&t_dev->badblocks, start,
CONFIGFS_ATTR(nullb_device_, badblocks);
if (badblocks_init(&dev->badblocks, 0)) {
badblocks_exit(&dev->badblocks);
struct badblocks badblocks;
if (dev->badblocks.shift != -1) {
if (!badblocks_set(&rdev->badblocks, s, sectors, 0)) {
if (!badblocks_clear(&rdev->badblocks, s, sectors))
badblocks_exit(&rdev->badblocks);
rdev->badblocks.shift = -1;
rdev->badblocks.count == 0) {
rdev->badblocks.shift = sb->bblog_shift;
if (!badblocks_set(&rdev->badblocks, sector, count, 1))
rdev->badblocks.shift = 0;
if (rdev->badblocks.count == 0)
struct badblocks *bb = &rdev->badblocks;
if (rdev->badblocks.sector + rdev->badblocks.size > new_offset)
rdev->badblocks.count = 0;
if (rdev->badblocks.changed) {
rdev->badblocks.changed = 0;
ack_all_badblocks(&rdev->badblocks);
if (rdev->badblocks.changed)
if (rdev->badblocks.size) {
rdev->badblocks.sector,
rdev->badblocks.size << 9,
rdev->badblocks.size = 0;
ack_all_badblocks(&rdev->badblocks);
rdev->badblocks.unacked_exist))
(rdev->badblocks.unacked_exist
rdev->badblocks.unacked_exist) {
rdev->badblocks.shift = 0;
return badblocks_show(&rdev->badblocks, page, 0);
int rv = badblocks_store(&rdev->badblocks, page, len, 0);
return badblocks_show(&rdev->badblocks, page, 1);
return badblocks_store(&rdev->badblocks, page, len, 1);
return badblocks_init(&rdev->badblocks, 0);
struct badblocks badblocks;
if (unlikely(rdev->badblocks.count)) {
int rv = badblocks_check(&rdev->badblocks, rdev->data_offset + s,
if (rdev->badblocks.shift < 0)
block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
if (rdev->badblocks.shift < 0)
block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
mtd->ecc_stats.badblocks++;
concat->mtd.ecc_stats.badblocks = subdev[0]->ecc_stats.badblocks;
concat->mtd.ecc_stats.badblocks +=
subdev[i]->ecc_stats.badblocks;
mtd->ecc_stats.badblocks++;
return sysfs_emit(buf, "%u\n", ecc_stats->badblocks);
child->ecc_stats.badblocks++;
mtd->ecc_stats.badblocks++;
mtd->ecc_stats.badblocks++;
mtd->ecc_stats.badblocks++;
mtd->ecc_stats.badblocks++;
mtd->ecc_stats.badblocks++;
module_param(badblocks, charp, 0400);
MODULE_PARM_DESC(badblocks, "Erase blocks that are initially marked bad, separated by commas");
if (!badblocks)
w = badblocks;
static char *badblocks = NULL;
static void set_badblock(struct badblocks *bb, sector_t s, int num)
static void __add_badblock_range(struct badblocks *bb, u64 ns_offset, u64 len)
struct badblocks *bb, const struct range *range)
struct badblocks *bb, const struct range *range)
struct badblocks;
struct badblocks *phys_bb;
struct badblocks bb;
struct badblocks *bb, const struct range *range);
static inline bool is_bad_pmem(struct badblocks *bb, sector_t sector,
struct badblocks *bb = &pmem->bb;
struct badblocks *bb;
struct badblocks bb;
static DEVICE_ATTR(badblocks, 0444, region_badblocks_show, NULL);
__le32 badblocks; /* bad block list */
int badblocks_check(struct badblocks *bb, sector_t s, sector_t sectors,
bool badblocks_set(struct badblocks *bb, sector_t s, sector_t sectors,
bool badblocks_clear(struct badblocks *bb, sector_t s, sector_t sectors);
void ack_all_badblocks(struct badblocks *bb);
ssize_t badblocks_show(struct badblocks *bb, char *page, int unack);
ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len,
int badblocks_init(struct badblocks *bb, int enable);
void badblocks_exit(struct badblocks *bb);
int devm_init_badblocks(struct device *dev, struct badblocks *bb);
static inline void devm_exit_badblocks(struct device *dev, struct badblocks *bb)
static inline int badblocks_full(struct badblocks *bb)
static inline int badblocks_empty(struct badblocks *bb)
static inline void set_changed(struct badblocks *bb)
static inline void clear_changed(struct badblocks *bb)
struct badblocks;
struct badblocks *bb;
struct badblocks bb;
__u32 badblocks;