Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
  md raid-1/10 Fix bio_rw bit manipulations again
  md: provide appropriate return value for spare_active functions.
  md: Notify sysfs when RAID1/5/10 disk is In_sync.
  Update recovery_offset even when external metadata is used.
This commit is contained in:
Linus Torvalds 2010-08-18 09:26:42 -07:00
Родитель 86ea51d4a2 2c7d46ec19
Коммит d9f5d41569
4 изменённых файлов: 48 добавлений и 47 удалений

Просмотреть файл

@ -2136,16 +2136,6 @@ static void sync_sbs(mddev_t * mddev, int nospares)
* with the rest of the array) * with the rest of the array)
*/ */
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
/* First make sure individual recovery_offsets are correct */
list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->raid_disk >= 0 &&
mddev->delta_disks >= 0 &&
!test_bit(In_sync, &rdev->flags) &&
mddev->curr_resync_completed > rdev->recovery_offset)
rdev->recovery_offset = mddev->curr_resync_completed;
}
list_for_each_entry(rdev, &mddev->disks, same_set) { list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->sb_events == mddev->events || if (rdev->sb_events == mddev->events ||
(nospares && (nospares &&
@ -2167,12 +2157,27 @@ static void md_update_sb(mddev_t * mddev, int force_change)
int sync_req; int sync_req;
int nospares = 0; int nospares = 0;
mddev->utime = get_seconds();
if (mddev->external)
return;
repeat: repeat:
/* First make sure individual recovery_offsets are correct */
list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->raid_disk >= 0 &&
mddev->delta_disks >= 0 &&
!test_bit(In_sync, &rdev->flags) &&
mddev->curr_resync_completed > rdev->recovery_offset)
rdev->recovery_offset = mddev->curr_resync_completed;
}
if (mddev->external || !mddev->persistent) {
clear_bit(MD_CHANGE_DEVS, &mddev->flags);
clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
wake_up(&mddev->sb_wait);
return;
}
spin_lock_irq(&mddev->write_lock); spin_lock_irq(&mddev->write_lock);
mddev->utime = get_seconds();
set_bit(MD_CHANGE_PENDING, &mddev->flags); set_bit(MD_CHANGE_PENDING, &mddev->flags);
if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
force_change = 1; force_change = 1;
@ -2221,19 +2226,6 @@ repeat:
MD_BUG(); MD_BUG();
mddev->events --; mddev->events --;
} }
/*
* do not write anything to disk if using
* nonpersistent superblocks
*/
if (!mddev->persistent) {
if (!mddev->external)
clear_bit(MD_CHANGE_PENDING, &mddev->flags);
spin_unlock_irq(&mddev->write_lock);
wake_up(&mddev->sb_wait);
return;
}
sync_sbs(mddev, nospares); sync_sbs(mddev, nospares);
spin_unlock_irq(&mddev->write_lock); spin_unlock_irq(&mddev->write_lock);

Просмотреть файл

@ -787,8 +787,8 @@ static int make_request(mddev_t *mddev, struct bio * bio)
struct bio_list bl; struct bio_list bl;
struct page **behind_pages = NULL; struct page **behind_pages = NULL;
const int rw = bio_data_dir(bio); const int rw = bio_data_dir(bio);
const bool do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
bool do_barriers; unsigned long do_barriers;
mdk_rdev_t *blocked_rdev; mdk_rdev_t *blocked_rdev;
/* /*
@ -1120,6 +1120,8 @@ static int raid1_spare_active(mddev_t *mddev)
{ {
int i; int i;
conf_t *conf = mddev->private; conf_t *conf = mddev->private;
int count = 0;
unsigned long flags;
/* /*
* Find all failed disks within the RAID1 configuration * Find all failed disks within the RAID1 configuration
@ -1131,15 +1133,16 @@ static int raid1_spare_active(mddev_t *mddev)
if (rdev if (rdev
&& !test_bit(Faulty, &rdev->flags) && !test_bit(Faulty, &rdev->flags)
&& !test_and_set_bit(In_sync, &rdev->flags)) { && !test_and_set_bit(In_sync, &rdev->flags)) {
unsigned long flags; count++;
spin_lock_irqsave(&conf->device_lock, flags); sysfs_notify_dirent(rdev->sysfs_state);
mddev->degraded--;
spin_unlock_irqrestore(&conf->device_lock, flags);
} }
} }
spin_lock_irqsave(&conf->device_lock, flags);
mddev->degraded -= count;
spin_unlock_irqrestore(&conf->device_lock, flags);
print_conf(conf); print_conf(conf);
return 0; return count;
} }
@ -1640,7 +1643,7 @@ static void raid1d(mddev_t *mddev)
* We already have a nr_pending reference on these rdevs. * We already have a nr_pending reference on these rdevs.
*/ */
int i; int i;
const bool do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC); const unsigned long do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC);
clear_bit(R1BIO_BarrierRetry, &r1_bio->state); clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
clear_bit(R1BIO_Barrier, &r1_bio->state); clear_bit(R1BIO_Barrier, &r1_bio->state);
for (i=0; i < conf->raid_disks; i++) for (i=0; i < conf->raid_disks; i++)
@ -1696,7 +1699,7 @@ static void raid1d(mddev_t *mddev)
(unsigned long long)r1_bio->sector); (unsigned long long)r1_bio->sector);
raid_end_bio_io(r1_bio); raid_end_bio_io(r1_bio);
} else { } else {
const bool do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC; const unsigned long do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC;
r1_bio->bios[r1_bio->read_disk] = r1_bio->bios[r1_bio->read_disk] =
mddev->ro ? IO_BLOCKED : NULL; mddev->ro ? IO_BLOCKED : NULL;
r1_bio->read_disk = disk; r1_bio->read_disk = disk;

Просмотреть файл

@ -799,7 +799,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
int i; int i;
int chunk_sects = conf->chunk_mask + 1; int chunk_sects = conf->chunk_mask + 1;
const int rw = bio_data_dir(bio); const int rw = bio_data_dir(bio);
const bool do_sync = (bio->bi_rw & REQ_SYNC); const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
struct bio_list bl; struct bio_list bl;
unsigned long flags; unsigned long flags;
mdk_rdev_t *blocked_rdev; mdk_rdev_t *blocked_rdev;
@ -1116,6 +1116,8 @@ static int raid10_spare_active(mddev_t *mddev)
int i; int i;
conf_t *conf = mddev->private; conf_t *conf = mddev->private;
mirror_info_t *tmp; mirror_info_t *tmp;
int count = 0;
unsigned long flags;
/* /*
* Find all non-in_sync disks within the RAID10 configuration * Find all non-in_sync disks within the RAID10 configuration
@ -1126,15 +1128,16 @@ static int raid10_spare_active(mddev_t *mddev)
if (tmp->rdev if (tmp->rdev
&& !test_bit(Faulty, &tmp->rdev->flags) && !test_bit(Faulty, &tmp->rdev->flags)
&& !test_and_set_bit(In_sync, &tmp->rdev->flags)) { && !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
unsigned long flags; count++;
spin_lock_irqsave(&conf->device_lock, flags); sysfs_notify_dirent(tmp->rdev->sysfs_state);
mddev->degraded--;
spin_unlock_irqrestore(&conf->device_lock, flags);
} }
} }
spin_lock_irqsave(&conf->device_lock, flags);
mddev->degraded -= count;
spin_unlock_irqrestore(&conf->device_lock, flags);
print_conf(conf); print_conf(conf);
return 0; return count;
} }
@ -1734,7 +1737,7 @@ static void raid10d(mddev_t *mddev)
raid_end_bio_io(r10_bio); raid_end_bio_io(r10_bio);
bio_put(bio); bio_put(bio);
} else { } else {
const bool do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); const unsigned long do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC);
bio_put(bio); bio_put(bio);
rdev = conf->mirrors[mirror].rdev; rdev = conf->mirrors[mirror].rdev;
if (printk_ratelimit()) if (printk_ratelimit())

Просмотреть файл

@ -5330,6 +5330,8 @@ static int raid5_spare_active(mddev_t *mddev)
int i; int i;
raid5_conf_t *conf = mddev->private; raid5_conf_t *conf = mddev->private;
struct disk_info *tmp; struct disk_info *tmp;
int count = 0;
unsigned long flags;
for (i = 0; i < conf->raid_disks; i++) { for (i = 0; i < conf->raid_disks; i++) {
tmp = conf->disks + i; tmp = conf->disks + i;
@ -5337,14 +5339,15 @@ static int raid5_spare_active(mddev_t *mddev)
&& tmp->rdev->recovery_offset == MaxSector && tmp->rdev->recovery_offset == MaxSector
&& !test_bit(Faulty, &tmp->rdev->flags) && !test_bit(Faulty, &tmp->rdev->flags)
&& !test_and_set_bit(In_sync, &tmp->rdev->flags)) { && !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
unsigned long flags; count++;
spin_lock_irqsave(&conf->device_lock, flags); sysfs_notify_dirent(tmp->rdev->sysfs_state);
mddev->degraded--;
spin_unlock_irqrestore(&conf->device_lock, flags);
} }
} }
spin_lock_irqsave(&conf->device_lock, flags);
mddev->degraded -= count;
spin_unlock_irqrestore(&conf->device_lock, flags);
print_raid5_conf(conf); print_raid5_conf(conf);
return 0; return count;
} }
static int raid5_remove_disk(mddev_t *mddev, int number) static int raid5_remove_disk(mddev_t *mddev, int number)