Skip to content

Commit b62b759

Browse files
committed
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 <[email protected]>
1 parent 0cfd810 commit b62b759

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

drivers/md/md.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
39373942
out:
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)

include/linux/raid/md_k.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ struct mddev_s
128128
#define MD_CHANGE_DEVS 0 /* Some device status has changed */
129129
#define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */
130130
#define MD_CHANGE_PENDING 2 /* superblock update in progress */
131-
#define MD_NOTIFY_ARRAY_STATE 3 /* atomic context wants to notify userspace */
132131

133132
int ro;
134133

@@ -239,6 +238,10 @@ struct mddev_s
239238
sector_t resync_max; /* resync should pause
240239
* when it gets here */
241240

241+
struct sysfs_dirent *sysfs_state; /* handle for 'array_state'
242+
* file in sysfs.
243+
*/
244+
242245
spinlock_t write_lock;
243246
wait_queue_head_t sb_wait; /* for waiting on superblock updates */
244247
atomic_t pending_writes; /* number of active superblock writes */

0 commit comments

Comments
 (0)