Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 2594
b: refs/heads/master
c: 3d310eb
h: refs/heads/master
v: v3
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jun 22, 2005
1 parent df639e4 commit cb8e3ce
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 40 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: 41158c7eb22312cfaa256744e1553bb4042ff085
refs/heads/master: 3d310eb7b3df1252e8595d059d982b0a9825a137
45 changes: 16 additions & 29 deletions trunk/drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ static mddev_t * mddev_find(dev_t unit)
INIT_LIST_HEAD(&new->all_mddevs);
init_timer(&new->safemode_timer);
atomic_set(&new->active, 1);
bio_list_init(&new->write_list);
spin_lock_init(&new->write_lock);
init_waitqueue_head(&new->sb_wait);

new->queue = blk_alloc_queue(GFP_KERNEL);
if (!new->queue) {
Expand Down Expand Up @@ -1307,6 +1307,7 @@ static void md_update_sb(mddev_t * mddev)
if (!mddev->persistent) {
mddev->sb_dirty = 0;
spin_unlock(&mddev->write_lock);
wake_up(&mddev->sb_wait);
return;
}
spin_unlock(&mddev->write_lock);
Expand Down Expand Up @@ -1348,6 +1349,7 @@ static void md_update_sb(mddev_t * mddev)
}
mddev->sb_dirty = 0;
spin_unlock(&mddev->write_lock);
wake_up(&mddev->sb_wait);

}

Expand Down Expand Up @@ -3368,29 +3370,26 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)

/* md_write_start(mddev, bi)
* If we need to update some array metadata (e.g. 'active' flag
* in superblock) before writing, queue bi for later writing
* and return 0, else return 1 and it will be written now
* in superblock) before writing, schedule a superblock update
* and wait for it to complete.
*/
int md_write_start(mddev_t *mddev, struct bio *bi)
void md_write_start(mddev_t *mddev, struct bio *bi)
{
DEFINE_WAIT(w);
if (bio_data_dir(bi) != WRITE)
return 1;
return;

atomic_inc(&mddev->writes_pending);
spin_lock(&mddev->write_lock);
if (mddev->in_sync == 0 && mddev->sb_dirty == 0) {
spin_unlock(&mddev->write_lock);
return 1;
}
bio_list_add(&mddev->write_list, bi);

if (mddev->in_sync) {
mddev->in_sync = 0;
mddev->sb_dirty = 1;
spin_lock(&mddev->write_lock);
if (mddev->in_sync) {
mddev->in_sync = 0;
mddev->sb_dirty = 1;
md_wakeup_thread(mddev->thread);
}
spin_unlock(&mddev->write_lock);
}
spin_unlock(&mddev->write_lock);
md_wakeup_thread(mddev->thread);
return 0;
wait_event(mddev->sb_wait, mddev->sb_dirty==0);
}

void md_write_end(mddev_t *mddev)
Expand Down Expand Up @@ -3685,7 +3684,6 @@ void md_check_recovery(mddev_t *mddev)
mddev->sb_dirty ||
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
mddev->write_list.head ||
(mddev->safemode == 1) ||
(mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)
&& !mddev->in_sync && mddev->recovery_cp == MaxSector)
Expand All @@ -3694,7 +3692,6 @@ void md_check_recovery(mddev_t *mddev)

if (mddev_trylock(mddev)==0) {
int spares =0;
struct bio *blist;

spin_lock(&mddev->write_lock);
if (mddev->safemode && !atomic_read(&mddev->writes_pending) &&
Expand All @@ -3704,21 +3701,11 @@ void md_check_recovery(mddev_t *mddev)
}
if (mddev->safemode == 1)
mddev->safemode = 0;
blist = bio_list_get(&mddev->write_list);
spin_unlock(&mddev->write_lock);

if (mddev->sb_dirty)
md_update_sb(mddev);

while (blist) {
struct bio *b = blist;
blist = blist->bi_next;
b->bi_next = NULL;
generic_make_request(b);
/* we already counted this, so need to un-count */
md_write_end(mddev);
}


if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
!test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/md/raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,8 +561,8 @@ static int make_request(request_queue_t *q, struct bio * bio)
* thread has put up a bar for new requests.
* Continue immediately if no resync is active currently.
*/
if (md_write_start(mddev, bio)==0)
return 0;
md_write_start(mddev, bio); /* wait on superblock update early */

spin_lock_irq(&conf->resync_lock);
wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock, );
conf->nr_pending++;
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,8 +700,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
return 0;
}

if (md_write_start(mddev, bio) == 0)
return 0;
md_write_start(mddev, bio);

/*
* Register the new request and wait if the reconstruction
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -1411,8 +1411,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
sector_t logical_sector, last_sector;
struct stripe_head *sh;

if (md_write_start(mddev, bi)==0)
return 0;
md_write_start(mddev, bi);

if (bio_data_dir(bi)==WRITE) {
disk_stat_inc(mddev->gendisk, writes);
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/md/raid6main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1570,8 +1570,7 @@ static int make_request (request_queue_t *q, struct bio * bi)
sector_t logical_sector, last_sector;
struct stripe_head *sh;

if (md_write_start(mddev, bi)==0)
return 0;
md_write_start(mddev, bi);

if (bio_data_dir(bi)==WRITE) {
disk_stat_inc(mddev->gendisk, writes);
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/raid/md.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ extern mdk_thread_t * md_register_thread (void (*run) (mddev_t *mddev),
extern void md_unregister_thread (mdk_thread_t *thread);
extern void md_wakeup_thread(mdk_thread_t *thread);
extern void md_check_recovery(mddev_t *mddev);
extern int md_write_start(mddev_t *mddev, struct bio *bi);
extern void md_write_start(mddev_t *mddev, struct bio *bi);
extern void md_write_end(mddev_t *mddev);
extern void md_handle_safemode(mddev_t *mddev);
extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/raid/md_k.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ struct mddev_s
sector_t recovery_cp;

spinlock_t write_lock;
struct bio_list write_list;
wait_queue_head_t sb_wait; /* for waiting on superblock updates */

unsigned int safemode; /* if set, update "clean" superblock
* when no writes pending.
Expand Down

0 comments on commit cb8e3ce

Please sign in to comment.