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:
Коммит
d9f5d41569
|
@ -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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче