|
@@ -2615,6 +2615,8 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
|
|
|
if (atomic_read(&mddev->writes_pending) == 0) {
|
|
|
if (mddev->in_sync == 0) {
|
|
|
mddev->in_sync = 1;
|
|
|
+ if (mddev->safemode == 1)
|
|
|
+ mddev->safemode = 0;
|
|
|
if (mddev->persistent)
|
|
|
set_bit(MD_CHANGE_CLEAN,
|
|
|
&mddev->flags);
|
|
@@ -5392,6 +5394,8 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
|
|
|
md_wakeup_thread(mddev->sync_thread);
|
|
|
}
|
|
|
atomic_inc(&mddev->writes_pending);
|
|
|
+ if (mddev->safemode == 1)
|
|
|
+ mddev->safemode = 0;
|
|
|
if (mddev->in_sync) {
|
|
|
spin_lock_irq(&mddev->write_lock);
|
|
|
if (mddev->in_sync) {
|
|
@@ -5816,7 +5820,7 @@ void md_check_recovery(mddev_t *mddev)
|
|
|
return;
|
|
|
|
|
|
if (signal_pending(current)) {
|
|
|
- if (mddev->pers->sync_request) {
|
|
|
+ if (mddev->pers->sync_request && !mddev->external) {
|
|
|
printk(KERN_INFO "md: %s in immediate safe mode\n",
|
|
|
mdname(mddev));
|
|
|
mddev->safemode = 2;
|
|
@@ -5828,7 +5832,7 @@ void md_check_recovery(mddev_t *mddev)
|
|
|
(mddev->flags && !mddev->external) ||
|
|
|
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
|
|
|
test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
|
|
|
- (mddev->safemode == 1) ||
|
|
|
+ (mddev->external == 0 && mddev->safemode == 1) ||
|
|
|
(mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)
|
|
|
&& !mddev->in_sync && mddev->recovery_cp == MaxSector)
|
|
|
))
|
|
@@ -5837,16 +5841,20 @@ void md_check_recovery(mddev_t *mddev)
|
|
|
if (mddev_trylock(mddev)) {
|
|
|
int spares = 0;
|
|
|
|
|
|
- spin_lock_irq(&mddev->write_lock);
|
|
|
- if (mddev->safemode && !atomic_read(&mddev->writes_pending) &&
|
|
|
- !mddev->in_sync && mddev->recovery_cp == MaxSector) {
|
|
|
- mddev->in_sync = 1;
|
|
|
- if (mddev->persistent)
|
|
|
- set_bit(MD_CHANGE_CLEAN, &mddev->flags);
|
|
|
+ if (!mddev->external) {
|
|
|
+ spin_lock_irq(&mddev->write_lock);
|
|
|
+ if (mddev->safemode &&
|
|
|
+ !atomic_read(&mddev->writes_pending) &&
|
|
|
+ !mddev->in_sync &&
|
|
|
+ mddev->recovery_cp == MaxSector) {
|
|
|
+ mddev->in_sync = 1;
|
|
|
+ if (mddev->persistent)
|
|
|
+ set_bit(MD_CHANGE_CLEAN, &mddev->flags);
|
|
|
+ }
|
|
|
+ if (mddev->safemode == 1)
|
|
|
+ mddev->safemode = 0;
|
|
|
+ spin_unlock_irq(&mddev->write_lock);
|
|
|
}
|
|
|
- if (mddev->safemode == 1)
|
|
|
- mddev->safemode = 0;
|
|
|
- spin_unlock_irq(&mddev->write_lock);
|
|
|
|
|
|
if (mddev->flags)
|
|
|
md_update_sb(mddev, 0);
|