Commit 076010e2 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Alasdair G Kergon

dm log: use flush callback fn

Call the flush callback from the log.

If flush failed, we have no alternative but to mark the whole log as dirty.
Also we set the variable flush_failed to prevent any bits ever being marked as
clean again.
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 87a8f240
...@@ -677,13 +677,26 @@ static int core_flush(struct dm_dirty_log *log) ...@@ -677,13 +677,26 @@ static int core_flush(struct dm_dirty_log *log)
static int disk_flush(struct dm_dirty_log *log) static int disk_flush(struct dm_dirty_log *log)
{ {
int r; int r, i;
struct log_c *lc = (struct log_c *) log->context; struct log_c *lc = log->context;
/* only write if the log has changed */ /* only write if the log has changed */
if (!lc->touched_cleaned && !lc->touched_dirtied) if (!lc->touched_cleaned && !lc->touched_dirtied)
return 0; return 0;
if (lc->touched_cleaned && log->flush_callback_fn &&
log->flush_callback_fn(lc->ti)) {
/*
* At this point it is impossible to determine which
* regions are clean and which are dirty (without
* re-reading the log off disk). So mark all of them
* dirty.
*/
lc->flush_failed = 1;
for (i = 0; i < lc->region_count; i++)
log_clear_bit(lc, lc->clean_bits, i);
}
r = rw_header(lc, WRITE); r = rw_header(lc, WRITE);
if (r) if (r)
fail_log_device(lc); fail_log_device(lc);
......
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