Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43844
b: refs/heads/master
c: f3ee6b2
h: refs/heads/master
v: v3
  • Loading branch information
Jonathan E Brassow authored and Linus Torvalds committed Dec 8, 2006
1 parent c01f3dd commit 7dba876
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 31c93a0c29bf96efd806ccf4ee81cacf04f255de
refs/heads/master: f3ee6b2f621fec7bc8bfe43fb465e938c37c8d20
15 changes: 9 additions & 6 deletions trunk/drivers/md/dm-log.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,16 +549,19 @@ static int core_get_resync_work(struct dirty_log *log, region_t *region)
return 1;
}

static void core_complete_resync_work(struct dirty_log *log, region_t region,
int success)
static void core_set_region_sync(struct dirty_log *log, region_t region,
int in_sync)
{
struct log_c *lc = (struct log_c *) log->context;

log_clear_bit(lc, lc->recovering_bits, region);
if (success) {
if (in_sync) {
log_set_bit(lc, lc->sync_bits, region);
lc->sync_count++;
}
} else if (log_test_bit(lc->sync_bits, region)) {
lc->sync_count--;
log_clear_bit(lc, lc->sync_bits, region);
}
}

static region_t core_get_sync_count(struct dirty_log *log)
Expand Down Expand Up @@ -625,7 +628,7 @@ static struct dirty_log_type _core_type = {
.mark_region = core_mark_region,
.clear_region = core_clear_region,
.get_resync_work = core_get_resync_work,
.complete_resync_work = core_complete_resync_work,
.set_region_sync = core_set_region_sync,
.get_sync_count = core_get_sync_count,
.status = core_status,
};
Expand All @@ -644,7 +647,7 @@ static struct dirty_log_type _disk_type = {
.mark_region = core_mark_region,
.clear_region = core_clear_region,
.get_resync_work = core_get_resync_work,
.complete_resync_work = core_complete_resync_work,
.set_region_sync = core_set_region_sync,
.get_sync_count = core_get_sync_count,
.status = disk_status,
};
Expand Down
10 changes: 5 additions & 5 deletions trunk/drivers/md/dm-log.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,12 @@ struct dirty_log_type {
int (*get_resync_work)(struct dirty_log *log, region_t *region);

/*
* This notifies the log that the resync of an area has
* been completed. The log should then mark this region
* as CLEAN.
* This notifies the log that the resync status of a region
* has changed. It also clears the region from the recovering
* list (if present).
*/
void (*complete_resync_work)(struct dirty_log *log,
region_t region, int success);
void (*set_region_sync)(struct dirty_log *log,
region_t region, int in_sync);

/*
* Returns the number of regions that are in sync.
Expand Down
17 changes: 12 additions & 5 deletions trunk/drivers/md/dm-raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,17 @@ static void dispatch_bios(struct mirror_set *ms, struct bio_list *bio_list)
}
}

static void complete_resync_work(struct region *reg, int success)
{
struct region_hash *rh = reg->rh;

rh->log->type->set_region_sync(rh->log, reg->key, success);
dispatch_bios(rh->ms, &reg->delayed_bios);
if (atomic_dec_and_test(&rh->recovery_in_flight))
wake_up_all(&_kmirrord_recovery_stopped);
up(&rh->recovery_count);
}

static void rh_update_states(struct region_hash *rh)
{
struct region *reg, *next;
Expand Down Expand Up @@ -383,11 +394,7 @@ static void rh_update_states(struct region_hash *rh)
*/
list_for_each_entry_safe (reg, next, &recovered, list) {
rh->log->type->clear_region(rh->log, reg->key);
rh->log->type->complete_resync_work(rh->log, reg->key, 1);
dispatch_bios(rh->ms, &reg->delayed_bios);
if (atomic_dec_and_test(&rh->recovery_in_flight))
wake_up_all(&_kmirrord_recovery_stopped);
up(&rh->recovery_count);
complete_resync_work(reg, 1);
mempool_free(reg, rh->region_pool);
}

Expand Down

0 comments on commit 7dba876

Please sign in to comment.