Skip to content

Commit

Permalink
raid1: Add a field array_frozen to indicate whether raid in freeze st…
Browse files Browse the repository at this point in the history
…ate.

Because the following patch will rewrite the content between normal IO
and resync IO. So we used a parameter to indicate whether raid is in freeze
array.

Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
majianpeng authored and NeilBrown committed Nov 19, 2013
1 parent 82592c3 commit b364e3d
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
15 changes: 7 additions & 8 deletions drivers/md/raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,7 @@ static void raise_barrier(struct r1conf *conf)

/* Now wait for all pending IO to complete */
wait_event_lock_irq(conf->wait_barrier,
!conf->array_frozen &&
!conf->nr_pending && conf->barrier < RESYNC_DEPTH,
conf->resync_lock);

Expand Down Expand Up @@ -860,10 +861,11 @@ static void wait_barrier(struct r1conf *conf)
* count down.
*/
wait_event_lock_irq(conf->wait_barrier,
!conf->barrier ||
!conf->array_frozen &&
(!conf->barrier ||
(conf->nr_pending &&
current->bio_list &&
!bio_list_empty(current->bio_list)),
!bio_list_empty(current->bio_list))),
conf->resync_lock);
conf->nr_waiting--;
}
Expand All @@ -884,8 +886,7 @@ static void freeze_array(struct r1conf *conf, int extra)
{
/* stop syncio and normal IO and wait for everything to
* go quite.
* We increment barrier and nr_waiting, and then
* wait until nr_pending match nr_queued+extra
* We wait until nr_pending match nr_queued+extra
* This is called in the context of one normal IO request
* that has failed. Thus any sync request that might be pending
* will be blocked by nr_pending, and we need to wait for
Expand All @@ -895,8 +896,7 @@ static void freeze_array(struct r1conf *conf, int extra)
* we continue.
*/
spin_lock_irq(&conf->resync_lock);
conf->barrier++;
conf->nr_waiting++;
conf->array_frozen = 1;
wait_event_lock_irq_cmd(conf->wait_barrier,
conf->nr_pending == conf->nr_queued+extra,
conf->resync_lock,
Expand All @@ -907,8 +907,7 @@ static void unfreeze_array(struct r1conf *conf)
{
/* reverse the effect of the freeze */
spin_lock_irq(&conf->resync_lock);
conf->barrier--;
conf->nr_waiting--;
conf->array_frozen = 0;
wake_up(&conf->wait_barrier);
spin_unlock_irq(&conf->resync_lock);
}
Expand Down
1 change: 1 addition & 0 deletions drivers/md/raid1.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ struct r1conf {
int nr_waiting;
int nr_queued;
int barrier;
int array_frozen;

/* Set to 1 if a full sync is needed, (fresh device added).
* Cleared when a sync completes.
Expand Down

0 comments on commit b364e3d

Please sign in to comment.