md: use sysfs_notify_dirent to notify changes to md/array_state

Now that we have sysfs_notify_dirent, use it to notify changes
to md/array_state.
As sysfs_notify_dirent can be called in atomic context, we can
remove the delayed notify and the MD_NOTIFY_ARRAY_STATE flag.

Signed-off-by: NeilBrown <neilb@suse.de>

NeilBrown b62b7590 0cfd8103

+20 -15
+16 -14
drivers/md/md.c
··· 222 list_del(&mddev->all_mddevs); 223 spin_unlock(&all_mddevs_lock); 224 blk_cleanup_queue(mddev->queue); 225 kobject_put(&mddev->kobj); 226 } else 227 spin_unlock(&all_mddevs_lock); ··· 2773 if (err) 2774 return err; 2775 else { 2776 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 2777 return len; 2778 } 2779 } ··· 3468 if (error) 3469 printk(KERN_WARNING "md: cannot register %s/md - name in use\n", 3470 disk->disk_name); 3471 - else 3472 kobject_uevent(&mddev->kobj, KOBJ_ADD); 3473 return NULL; 3474 } 3475 ··· 3482 if (!atomic_read(&mddev->writes_pending)) { 3483 mddev->safemode = 1; 3484 if (mddev->external) 3485 - set_bit(MD_NOTIFY_ARRAY_STATE, &mddev->flags); 3486 } 3487 md_wakeup_thread(mddev->thread); 3488 } ··· 3745 3746 mddev->changed = 1; 3747 md_new_event(mddev); 3748 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 3749 sysfs_notify(&mddev->kobj, NULL, "sync_action"); 3750 sysfs_notify(&mddev->kobj, NULL, "degraded"); 3751 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); ··· 3772 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 3773 md_wakeup_thread(mddev->thread); 3774 md_wakeup_thread(mddev->sync_thread); 3775 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 3776 return 0; 3777 } 3778 ··· 3852 module_put(mddev->pers->owner); 3853 mddev->pers = NULL; 3854 /* tell userspace to handle 'inactive' */ 3855 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 3856 3857 set_capacity(disk, 0); 3858 mddev->changed = 1; ··· 3938 mdname(mddev)); 3939 err = 0; 3940 md_new_event(mddev); 3941 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 3942 out: 3943 return err; 3944 } ··· 4943 if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) { 4944 if (mddev->ro == 2) { 4945 mddev->ro = 0; 4946 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 4947 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4948 md_wakeup_thread(mddev->thread); 4949 } else { ··· 5617 spin_unlock_irq(&mddev->write_lock); 5618 } 5619 if (did_change) 5620 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 5621 wait_event(mddev->sb_wait, 5622 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && 5623 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); ··· 5660 mddev->safemode = 1; 5661 spin_unlock_irq(&mddev->write_lock); 5662 md_update_sb(mddev, 0); 5663 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 5664 } else 5665 spin_unlock_irq(&mddev->write_lock); 5666 ··· 6053 if (mddev->bitmap) 6054 bitmap_daemon_work(mddev->bitmap); 6055 6056 - if (test_and_clear_bit(MD_NOTIFY_ARRAY_STATE, &mddev->flags)) 6057 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 6058 - 6059 if (mddev->ro) 6060 return; 6061 ··· 6105 mddev->safemode = 0; 6106 spin_unlock_irq(&mddev->write_lock); 6107 if (did_change) 6108 - sysfs_notify(&mddev->kobj, NULL, "array_state"); 6109 } 6110 6111 if (mddev->flags)
··· 222 list_del(&mddev->all_mddevs); 223 spin_unlock(&all_mddevs_lock); 224 blk_cleanup_queue(mddev->queue); 225 + if (mddev->sysfs_state) 226 + sysfs_put(mddev->sysfs_state); 227 + mddev->sysfs_state = NULL; 228 kobject_put(&mddev->kobj); 229 } else 230 spin_unlock(&all_mddevs_lock); ··· 2770 if (err) 2771 return err; 2772 else { 2773 + sysfs_notify_dirent(mddev->sysfs_state); 2774 return len; 2775 } 2776 } ··· 3465 if (error) 3466 printk(KERN_WARNING "md: cannot register %s/md - name in use\n", 3467 disk->disk_name); 3468 + else { 3469 kobject_uevent(&mddev->kobj, KOBJ_ADD); 3470 + mddev->sysfs_state = sysfs_get_dirent(mddev->kobj.sd, "array_state"); 3471 + } 3472 return NULL; 3473 } 3474 ··· 3477 if (!atomic_read(&mddev->writes_pending)) { 3478 mddev->safemode = 1; 3479 if (mddev->external) 3480 + sysfs_notify_dirent(mddev->sysfs_state); 3481 } 3482 md_wakeup_thread(mddev->thread); 3483 } ··· 3740 3741 mddev->changed = 1; 3742 md_new_event(mddev); 3743 + sysfs_notify_dirent(mddev->sysfs_state); 3744 sysfs_notify(&mddev->kobj, NULL, "sync_action"); 3745 sysfs_notify(&mddev->kobj, NULL, "degraded"); 3746 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); ··· 3767 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 3768 md_wakeup_thread(mddev->thread); 3769 md_wakeup_thread(mddev->sync_thread); 3770 + sysfs_notify_dirent(mddev->sysfs_state); 3771 return 0; 3772 } 3773 ··· 3847 module_put(mddev->pers->owner); 3848 mddev->pers = NULL; 3849 /* tell userspace to handle 'inactive' */ 3850 + sysfs_notify_dirent(mddev->sysfs_state); 3851 3852 set_capacity(disk, 0); 3853 mddev->changed = 1; ··· 3933 mdname(mddev)); 3934 err = 0; 3935 md_new_event(mddev); 3936 + sysfs_notify_dirent(mddev->sysfs_state); 3937 out: 3938 return err; 3939 } ··· 4938 if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) { 4939 if (mddev->ro == 2) { 4940 mddev->ro = 0; 4941 + sysfs_notify_dirent(mddev->sysfs_state); 4942 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4943 md_wakeup_thread(mddev->thread); 4944 } else { ··· 5612 spin_unlock_irq(&mddev->write_lock); 5613 } 5614 if (did_change) 5615 + sysfs_notify_dirent(mddev->sysfs_state); 5616 wait_event(mddev->sb_wait, 5617 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && 5618 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); ··· 5655 mddev->safemode = 1; 5656 spin_unlock_irq(&mddev->write_lock); 5657 md_update_sb(mddev, 0); 5658 + sysfs_notify_dirent(mddev->sysfs_state); 5659 } else 5660 spin_unlock_irq(&mddev->write_lock); 5661 ··· 6048 if (mddev->bitmap) 6049 bitmap_daemon_work(mddev->bitmap); 6050 6051 if (mddev->ro) 6052 return; 6053 ··· 6103 mddev->safemode = 0; 6104 spin_unlock_irq(&mddev->write_lock); 6105 if (did_change) 6106 + sysfs_notify_dirent(mddev->sysfs_state); 6107 } 6108 6109 if (mddev->flags)
+4 -1
include/linux/raid/md_k.h
··· 128 #define MD_CHANGE_DEVS 0 /* Some device status has changed */ 129 #define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */ 130 #define MD_CHANGE_PENDING 2 /* superblock update in progress */ 131 - #define MD_NOTIFY_ARRAY_STATE 3 /* atomic context wants to notify userspace */ 132 133 int ro; 134 ··· 237 * starts here */ 238 sector_t resync_max; /* resync should pause 239 * when it gets here */ 240 241 spinlock_t write_lock; 242 wait_queue_head_t sb_wait; /* for waiting on superblock updates */
··· 128 #define MD_CHANGE_DEVS 0 /* Some device status has changed */ 129 #define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */ 130 #define MD_CHANGE_PENDING 2 /* superblock update in progress */ 131 132 int ro; 133 ··· 238 * starts here */ 239 sector_t resync_max; /* resync should pause 240 * when it gets here */ 241 + 242 + struct sysfs_dirent *sysfs_state; /* handle for 'array_state' 243 + * file in sysfs. 244 + */ 245 246 spinlock_t write_lock; 247 wait_queue_head_t sb_wait; /* for waiting on superblock updates */