Message ID | 20220718063410.338626-8-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/10] md: fix mddev->kobj lifetime | expand |
On 7/18/22 08:34, Christoph Hellwig wrote: > Just do a simple list_for_each_entry_safe on all_mddevs, and only grab a > reference when we drop the lock. > > Reviewed-by: Christoph Hellwig <hch@lst.de> > --- > drivers/md/md.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 687f320c7ec4a..44e4071b43148 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -9587,11 +9587,13 @@ EXPORT_SYMBOL_GPL(rdev_clear_badblocks); > static int md_notify_reboot(struct notifier_block *this, > unsigned long code, void *x) > { > - struct list_head *tmp; > - struct mddev *mddev; > + struct mddev *mddev, *n; > int need_delay = 0; > > - for_each_mddev(mddev, tmp) { > + spin_lock(&all_mddevs_lock); > + list_for_each_entry_safe(mddev, n, &all_mddevs, all_mddevs) { > + mddev_get(mddev); > + spin_unlock(&all_mddevs_lock); > if (mddev_trylock(mddev)) { > if (mddev->pers) > __md_stop_writes(mddev); > @@ -9600,7 +9602,11 @@ static int md_notify_reboot(struct notifier_block *this, > mddev_unlock(mddev); > } > need_delay = 1; > + mddev_put(mddev); > + spin_lock(&all_mddevs_lock); > } > + spin_unlock(&all_mddevs_lock); > + > /* > * certain more exotic SCSI devices are known to be > * volatile wrt too early system reboots. While the I wish 'mddev_get()' could fail if 'mddev->active' is zero when we call it ... but maybe for another time. Reviewed-by: Hannes Reinecke <hare@suse.de> Cheers, Hannes
On 2022-07-18 00:34, Christoph Hellwig wrote: > Just do a simple list_for_each_entry_safe on all_mddevs, and only grab a > reference when we drop the lock. > > Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Logan Gunthorpe <logang@deltatee.com> Logan
diff --git a/drivers/md/md.c b/drivers/md/md.c index 687f320c7ec4a..44e4071b43148 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9587,11 +9587,13 @@ EXPORT_SYMBOL_GPL(rdev_clear_badblocks); static int md_notify_reboot(struct notifier_block *this, unsigned long code, void *x) { - struct list_head *tmp; - struct mddev *mddev; + struct mddev *mddev, *n; int need_delay = 0; - for_each_mddev(mddev, tmp) { + spin_lock(&all_mddevs_lock); + list_for_each_entry_safe(mddev, n, &all_mddevs, all_mddevs) { + mddev_get(mddev); + spin_unlock(&all_mddevs_lock); if (mddev_trylock(mddev)) { if (mddev->pers) __md_stop_writes(mddev); @@ -9600,7 +9602,11 @@ static int md_notify_reboot(struct notifier_block *this, mddev_unlock(mddev); } need_delay = 1; + mddev_put(mddev); + spin_lock(&all_mddevs_lock); } + spin_unlock(&all_mddevs_lock); + /* * certain more exotic SCSI devices are known to be * volatile wrt too early system reboots. While the
Just do a simple list_for_each_entry_safe on all_mddevs, and only grab a reference when we drop the lock. Reviewed-by: Christoph Hellwig <hch@lst.de> --- drivers/md/md.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)