mirror of https://gitee.com/openkylin/linux.git
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:
commit
d9f5d41569
|
@ -2136,16 +2136,6 @@ static void sync_sbs(mddev_t * mddev, int nospares)
|
|||
* with the rest of the array)
|
||||
*/
|
||||
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) {
|
||||
if (rdev->sb_events == mddev->events ||
|
||||
(nospares &&
|
||||
|
@ -2167,12 +2157,27 @@ static void md_update_sb(mddev_t * mddev, int force_change)
|
|||
int sync_req;
|
||||
int nospares = 0;
|
||||
|
||||
mddev->utime = get_seconds();
|
||||
if (mddev->external)
|
||||
return;
|
||||
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);
|
||||
|
||||
mddev->utime = get_seconds();
|
||||
|
||||
set_bit(MD_CHANGE_PENDING, &mddev->flags);
|
||||
if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
|
||||
force_change = 1;
|
||||
|
@ -2221,19 +2226,6 @@ static void md_update_sb(mddev_t * mddev, int force_change)
|
|||
MD_BUG();
|
||||
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);
|
||||
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 page **behind_pages = NULL;
|
||||
const int rw = bio_data_dir(bio);
|
||||
const bool do_sync = (bio->bi_rw & REQ_SYNC);
|
||||
bool do_barriers;
|
||||
const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
|
||||
unsigned long do_barriers;
|
||||
mdk_rdev_t *blocked_rdev;
|
||||
|
||||
/*
|
||||
|
@ -1120,6 +1120,8 @@ static int raid1_spare_active(mddev_t *mddev)
|
|||
{
|
||||
int i;
|
||||
conf_t *conf = mddev->private;
|
||||
int count = 0;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Find all failed disks within the RAID1 configuration
|
||||
|
@ -1131,15 +1133,16 @@ static int raid1_spare_active(mddev_t *mddev)
|
|||
if (rdev
|
||||
&& !test_bit(Faulty, &rdev->flags)
|
||||
&& !test_and_set_bit(In_sync, &rdev->flags)) {
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded--;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
count++;
|
||||
sysfs_notify_dirent(rdev->sysfs_state);
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded -= count;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
|
||||
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.
|
||||
*/
|
||||
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_Barrier, &r1_bio->state);
|
||||
for (i=0; i < conf->raid_disks; i++)
|
||||
|
@ -1696,7 +1699,7 @@ static void raid1d(mddev_t *mddev)
|
|||
(unsigned long long)r1_bio->sector);
|
||||
raid_end_bio_io(r1_bio);
|
||||
} 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] =
|
||||
mddev->ro ? IO_BLOCKED : NULL;
|
||||
r1_bio->read_disk = disk;
|
||||
|
|
|
@ -799,7 +799,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
|
|||
int i;
|
||||
int chunk_sects = conf->chunk_mask + 1;
|
||||
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;
|
||||
unsigned long flags;
|
||||
mdk_rdev_t *blocked_rdev;
|
||||
|
@ -1116,6 +1116,8 @@ static int raid10_spare_active(mddev_t *mddev)
|
|||
int i;
|
||||
conf_t *conf = mddev->private;
|
||||
mirror_info_t *tmp;
|
||||
int count = 0;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* 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
|
||||
&& !test_bit(Faulty, &tmp->rdev->flags)
|
||||
&& !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded--;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
count++;
|
||||
sysfs_notify_dirent(tmp->rdev->sysfs_state);
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded -= count;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
|
||||
print_conf(conf);
|
||||
return 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1734,7 +1737,7 @@ static void raid10d(mddev_t *mddev)
|
|||
raid_end_bio_io(r10_bio);
|
||||
bio_put(bio);
|
||||
} 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);
|
||||
rdev = conf->mirrors[mirror].rdev;
|
||||
if (printk_ratelimit())
|
||||
|
|
|
@ -5330,6 +5330,8 @@ static int raid5_spare_active(mddev_t *mddev)
|
|||
int i;
|
||||
raid5_conf_t *conf = mddev->private;
|
||||
struct disk_info *tmp;
|
||||
int count = 0;
|
||||
unsigned long flags;
|
||||
|
||||
for (i = 0; i < conf->raid_disks; i++) {
|
||||
tmp = conf->disks + i;
|
||||
|
@ -5337,14 +5339,15 @@ static int raid5_spare_active(mddev_t *mddev)
|
|||
&& tmp->rdev->recovery_offset == MaxSector
|
||||
&& !test_bit(Faulty, &tmp->rdev->flags)
|
||||
&& !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded--;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
count++;
|
||||
sysfs_notify_dirent(tmp->rdev->sysfs_state);
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
mddev->degraded -= count;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
print_raid5_conf(conf);
|
||||
return 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
static int raid5_remove_disk(mddev_t *mddev, int number)
|
||||
|
|
Loading…
Reference in New Issue