@@ -222,6 +222,9 @@ static void mddev_put(mddev_t *mddev)
222222 list_del (& mddev -> all_mddevs );
223223 spin_unlock (& all_mddevs_lock );
224224 blk_cleanup_queue (mddev -> queue );
225+ if (mddev -> sysfs_state )
226+ sysfs_put (mddev -> sysfs_state );
227+ mddev -> sysfs_state = NULL ;
225228 kobject_put (& mddev -> kobj );
226229 } else
227230 spin_unlock (& all_mddevs_lock );
@@ -2770,7 +2773,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
27702773 if (err )
27712774 return err ;
27722775 else {
2773- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
2776+ sysfs_notify_dirent ( mddev -> sysfs_state );
27742777 return len ;
27752778 }
27762779}
@@ -3465,8 +3468,10 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
34653468 if (error )
34663469 printk (KERN_WARNING "md: cannot register %s/md - name in use\n" ,
34673470 disk -> disk_name );
3468- else
3471+ else {
34693472 kobject_uevent (& mddev -> kobj , KOBJ_ADD );
3473+ mddev -> sysfs_state = sysfs_get_dirent (mddev -> kobj .sd , "array_state" );
3474+ }
34703475 return NULL ;
34713476}
34723477
@@ -3477,7 +3482,7 @@ static void md_safemode_timeout(unsigned long data)
34773482 if (!atomic_read (& mddev -> writes_pending )) {
34783483 mddev -> safemode = 1 ;
34793484 if (mddev -> external )
3480- set_bit ( MD_NOTIFY_ARRAY_STATE , & mddev -> flags );
3485+ sysfs_notify_dirent ( mddev -> sysfs_state );
34813486 }
34823487 md_wakeup_thread (mddev -> thread );
34833488}
@@ -3740,7 +3745,7 @@ static int do_md_run(mddev_t * mddev)
37403745
37413746 mddev -> changed = 1 ;
37423747 md_new_event (mddev );
3743- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3748+ sysfs_notify_dirent ( mddev -> sysfs_state );
37443749 sysfs_notify (& mddev -> kobj , NULL , "sync_action" );
37453750 sysfs_notify (& mddev -> kobj , NULL , "degraded" );
37463751 kobject_uevent (& disk_to_dev (mddev -> gendisk )-> kobj , KOBJ_CHANGE );
@@ -3767,7 +3772,7 @@ static int restart_array(mddev_t *mddev)
37673772 set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
37683773 md_wakeup_thread (mddev -> thread );
37693774 md_wakeup_thread (mddev -> sync_thread );
3770- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3775+ sysfs_notify_dirent ( mddev -> sysfs_state );
37713776 return 0 ;
37723777}
37733778
@@ -3847,7 +3852,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
38473852 module_put (mddev -> pers -> owner );
38483853 mddev -> pers = NULL ;
38493854 /* tell userspace to handle 'inactive' */
3850- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3855+ sysfs_notify_dirent ( mddev -> sysfs_state );
38513856
38523857 set_capacity (disk , 0 );
38533858 mddev -> changed = 1 ;
@@ -3933,7 +3938,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
39333938 mdname (mddev ));
39343939 err = 0 ;
39353940 md_new_event (mddev );
3936- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
3941+ sysfs_notify_dirent ( mddev -> sysfs_state );
39373942out :
39383943 return err ;
39393944}
@@ -4938,7 +4943,7 @@ static int md_ioctl(struct inode *inode, struct file *file,
49384943 if (_IOC_TYPE (cmd ) == MD_MAJOR && mddev -> ro && mddev -> pers ) {
49394944 if (mddev -> ro == 2 ) {
49404945 mddev -> ro = 0 ;
4941- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
4946+ sysfs_notify_dirent ( mddev -> sysfs_state );
49424947 set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
49434948 md_wakeup_thread (mddev -> thread );
49444949 } else {
@@ -5612,7 +5617,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
56125617 spin_unlock_irq (& mddev -> write_lock );
56135618 }
56145619 if (did_change )
5615- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
5620+ sysfs_notify_dirent ( mddev -> sysfs_state );
56165621 wait_event (mddev -> sb_wait ,
56175622 !test_bit (MD_CHANGE_CLEAN , & mddev -> flags ) &&
56185623 !test_bit (MD_CHANGE_PENDING , & mddev -> flags ));
@@ -5655,7 +5660,7 @@ int md_allow_write(mddev_t *mddev)
56555660 mddev -> safemode = 1 ;
56565661 spin_unlock_irq (& mddev -> write_lock );
56575662 md_update_sb (mddev , 0 );
5658- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
5663+ sysfs_notify_dirent ( mddev -> sysfs_state );
56595664 } else
56605665 spin_unlock_irq (& mddev -> write_lock );
56615666
@@ -6048,9 +6053,6 @@ void md_check_recovery(mddev_t *mddev)
60486053 if (mddev -> bitmap )
60496054 bitmap_daemon_work (mddev -> bitmap );
60506055
6051- if (test_and_clear_bit (MD_NOTIFY_ARRAY_STATE , & mddev -> flags ))
6052- sysfs_notify (& mddev -> kobj , NULL , "array_state" );
6053-
60546056 if (mddev -> ro )
60556057 return ;
60566058
@@ -6103,7 +6105,7 @@ void md_check_recovery(mddev_t *mddev)
61036105 mddev -> safemode = 0 ;
61046106 spin_unlock_irq (& mddev -> write_lock );
61056107 if (did_change )
6106- sysfs_notify ( & mddev -> kobj , NULL , "array_state" );
6108+ sysfs_notify_dirent ( mddev -> sysfs_state );
61076109 }
61086110
61096111 if (mddev -> flags )
0 commit comments