@@ -222,6 +222,9 @@ static void mddev_put(mddev_t *mddev)
222
222
list_del (& mddev -> all_mddevs );
223
223
spin_unlock (& all_mddevs_lock );
224
224
blk_cleanup_queue (mddev -> queue );
225
+ if (mddev -> sysfs_state )
226
+ sysfs_put (mddev -> sysfs_state );
227
+ mddev -> sysfs_state = NULL ;
225
228
kobject_put (& mddev -> kobj );
226
229
} else
227
230
spin_unlock (& all_mddevs_lock );
@@ -2770,7 +2773,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
2770
2773
if (err )
2771
2774
return err ;
2772
2775
else {
2773
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
2776
+ sysfs_notify_dirent ( mddev -> sysfs_state );
2774
2777
return len ;
2775
2778
}
2776
2779
}
@@ -3465,8 +3468,10 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
3465
3468
if (error )
3466
3469
printk (KERN_WARNING "md: cannot register %s/md - name in use\n" ,
3467
3470
disk -> disk_name );
3468
- else
3471
+ else {
3469
3472
kobject_uevent (& mddev -> kobj , KOBJ_ADD );
3473
+ mddev -> sysfs_state = sysfs_get_dirent (mddev -> kobj .sd , "array_state" );
3474
+ }
3470
3475
return NULL ;
3471
3476
}
3472
3477
@@ -3477,7 +3482,7 @@ static void md_safemode_timeout(unsigned long data)
3477
3482
if (!atomic_read (& mddev -> writes_pending )) {
3478
3483
mddev -> safemode = 1 ;
3479
3484
if (mddev -> external )
3480
- set_bit ( MD_NOTIFY_ARRAY_STATE , & mddev -> flags );
3485
+ sysfs_notify_dirent ( mddev -> sysfs_state );
3481
3486
}
3482
3487
md_wakeup_thread (mddev -> thread );
3483
3488
}
@@ -3740,7 +3745,7 @@ static int do_md_run(mddev_t * mddev)
3740
3745
3741
3746
mddev -> changed = 1 ;
3742
3747
md_new_event (mddev );
3743
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3748
+ sysfs_notify_dirent ( mddev -> sysfs_state );
3744
3749
sysfs_notify (& mddev -> kobj , NULL , "sync_action" );
3745
3750
sysfs_notify (& mddev -> kobj , NULL , "degraded" );
3746
3751
kobject_uevent (& disk_to_dev (mddev -> gendisk )-> kobj , KOBJ_CHANGE );
@@ -3767,7 +3772,7 @@ static int restart_array(mddev_t *mddev)
3767
3772
set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
3768
3773
md_wakeup_thread (mddev -> thread );
3769
3774
md_wakeup_thread (mddev -> sync_thread );
3770
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3775
+ sysfs_notify_dirent ( mddev -> sysfs_state );
3771
3776
return 0 ;
3772
3777
}
3773
3778
@@ -3847,7 +3852,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
3847
3852
module_put (mddev -> pers -> owner );
3848
3853
mddev -> pers = NULL ;
3849
3854
/* tell userspace to handle 'inactive' */
3850
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3855
+ sysfs_notify_dirent ( mddev -> sysfs_state );
3851
3856
3852
3857
set_capacity (disk , 0 );
3853
3858
mddev -> changed = 1 ;
@@ -3933,7 +3938,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
3933
3938
mdname (mddev ));
3934
3939
err = 0 ;
3935
3940
md_new_event (mddev );
3936
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3941
+ sysfs_notify_dirent ( mddev -> sysfs_state );
3937
3942
out :
3938
3943
return err ;
3939
3944
}
@@ -4938,7 +4943,7 @@ static int md_ioctl(struct inode *inode, struct file *file,
4938
4943
if (_IOC_TYPE (cmd ) == MD_MAJOR && mddev -> ro && mddev -> pers ) {
4939
4944
if (mddev -> ro == 2 ) {
4940
4945
mddev -> ro = 0 ;
4941
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
4946
+ sysfs_notify_dirent ( mddev -> sysfs_state );
4942
4947
set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
4943
4948
md_wakeup_thread (mddev -> thread );
4944
4949
} else {
@@ -5612,7 +5617,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
5612
5617
spin_unlock_irq (& mddev -> write_lock );
5613
5618
}
5614
5619
if (did_change )
5615
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
5620
+ sysfs_notify_dirent ( mddev -> sysfs_state );
5616
5621
wait_event (mddev -> sb_wait ,
5617
5622
!test_bit (MD_CHANGE_CLEAN , & mddev -> flags ) &&
5618
5623
!test_bit (MD_CHANGE_PENDING , & mddev -> flags ));
@@ -5655,7 +5660,7 @@ int md_allow_write(mddev_t *mddev)
5655
5660
mddev -> safemode = 1 ;
5656
5661
spin_unlock_irq (& mddev -> write_lock );
5657
5662
md_update_sb (mddev , 0 );
5658
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
5663
+ sysfs_notify_dirent ( mddev -> sysfs_state );
5659
5664
} else
5660
5665
spin_unlock_irq (& mddev -> write_lock );
5661
5666
@@ -6048,9 +6053,6 @@ void md_check_recovery(mddev_t *mddev)
6048
6053
if (mddev -> bitmap )
6049
6054
bitmap_daemon_work (mddev -> bitmap );
6050
6055
6051
- if (test_and_clear_bit (MD_NOTIFY_ARRAY_STATE , & mddev -> flags ))
6052
- sysfs_notify (& mddev -> kobj , NULL , "array_state" );
6053
-
6054
6056
if (mddev -> ro )
6055
6057
return ;
6056
6058
@@ -6103,7 +6105,7 @@ void md_check_recovery(mddev_t *mddev)
6103
6105
mddev -> safemode = 0 ;
6104
6106
spin_unlock_irq (& mddev -> write_lock );
6105
6107
if (did_change )
6106
- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
6108
+ sysfs_notify_dirent ( mddev -> sysfs_state );
6107
6109
}
6108
6110
6109
6111
if (mddev -> flags )
0 commit comments