Commit b4a1278c authored by Shaohua Li's avatar Shaohua Li Committed by Jens Axboe

badblocks: badblocks_set/clear update unacked_exist

When bandblocks_set acknowledges a range or badblocks_clear a range,
it's possible all badblocks are acknowledged. We should update
unacked_exist if this occurs.
Signed-off-by: default avatarShaohua Li <shli@fb.com>
Reviewed-by: default avatarTomasz Majchrzak <tomasz.majchrzak@intel.com>
Tested-by: default avatarTomasz Majchrzak <tomasz.majchrzak@intel.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent f660f606
...@@ -133,6 +133,26 @@ int badblocks_check(struct badblocks *bb, sector_t s, int sectors, ...@@ -133,6 +133,26 @@ int badblocks_check(struct badblocks *bb, sector_t s, int sectors,
} }
EXPORT_SYMBOL_GPL(badblocks_check); EXPORT_SYMBOL_GPL(badblocks_check);
static void badblocks_update_acked(struct badblocks *bb)
{
u64 *p = bb->page;
int i;
bool unacked = false;
if (!bb->unacked_exist)
return;
for (i = 0; i < bb->count ; i++) {
if (!BB_ACK(p[i])) {
unacked = true;
break;
}
}
if (!unacked)
bb->unacked_exist = 0;
}
/** /**
* badblocks_set() - Add a range of bad blocks to the table. * badblocks_set() - Add a range of bad blocks to the table.
* @bb: the badblocks structure that holds all badblock information * @bb: the badblocks structure that holds all badblock information
...@@ -294,6 +314,8 @@ int badblocks_set(struct badblocks *bb, sector_t s, int sectors, ...@@ -294,6 +314,8 @@ int badblocks_set(struct badblocks *bb, sector_t s, int sectors,
bb->changed = 1; bb->changed = 1;
if (!acknowledged) if (!acknowledged)
bb->unacked_exist = 1; bb->unacked_exist = 1;
else
badblocks_update_acked(bb);
write_sequnlock_irqrestore(&bb->lock, flags); write_sequnlock_irqrestore(&bb->lock, flags);
return rv; return rv;
...@@ -401,6 +423,7 @@ int badblocks_clear(struct badblocks *bb, sector_t s, int sectors) ...@@ -401,6 +423,7 @@ int badblocks_clear(struct badblocks *bb, sector_t s, int sectors)
} }
} }
badblocks_update_acked(bb);
bb->changed = 1; bb->changed = 1;
out: out:
write_sequnlock_irq(&bb->lock); write_sequnlock_irq(&bb->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment