Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 312551 Details for
Bug 455471
[NEC/Stratus 5.3 bug] various crashes in md - rdev removed in the middle of ITERATE_RDEV
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
455471.patch
455471.patch (text/plain), 4.93 KB, created by
nate.dailey
on 2008-07-24 12:47:51 UTC
(
hide
)
Description:
455471.patch
Filename:
MIME Type:
Creator:
nate.dailey
Created:
2008-07-24 12:47:51 UTC
Size:
4.93 KB
patch
obsolete
>diff -Nupr a/drivers/md/bitmap.c b/drivers/md/bitmap.c >--- a/drivers/md/bitmap.c 2008-07-15 10:27:38.000000000 -0400 >+++ b/drivers/md/bitmap.c 2008-07-15 10:45:28.000000000 -0400 >@@ -258,9 +258,9 @@ static struct page *read_sb_page(mddev_t > static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait) > { > mdk_rdev_t *rdev; >- struct list_head *tmp; > >- ITERATE_RDEV(mddev, rdev, tmp) >+ rcu_read_lock(); >+ rdev_for_each_rcu(rdev, mddev) > if (test_bit(In_sync, &rdev->flags) > && !test_bit(Faulty, &rdev->flags)) > md_super_write(mddev, rdev, >@@ -268,6 +268,7 @@ static int write_sb_page(mddev_t *mddev, > + page->index * (PAGE_SIZE/512), > PAGE_SIZE, > page); >+ rcu_read_unlock(); > > if (wait) > md_super_wait(mddev); >diff -Nupr a/drivers/md/md.c b/drivers/md/md.c >--- a/drivers/md/md.c 2008-07-15 10:27:38.000000000 -0400 >+++ b/drivers/md/md.c 2008-07-22 10:38:49.000000000 -0400 >@@ -1306,13 +1306,17 @@ static mdk_rdev_t * match_dev_unit(mddev > > static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2) > { >- struct list_head *tmp; >- mdk_rdev_t *rdev; >- >- ITERATE_RDEV(mddev1,rdev,tmp) >- if (match_dev_unit(mddev2, rdev)) >- return 1; >+ mdk_rdev_t *rdev, *rdev2; > >+ rcu_read_lock(); >+ rdev_for_each_rcu(rdev, mddev1) >+ rdev_for_each_rcu(rdev2, mddev2) >+ if (rdev->bdev->bd_contains == >+ rdev2->bdev->bd_contains) { >+ rcu_read_unlock(); >+ return 1; >+ } >+ rcu_read_unlock(); > return 0; > } > >@@ -1366,7 +1370,7 @@ static int bind_rdev_to_array(mdk_rdev_t > while ( (s=strchr(rdev->kobj.k_name, '/')) != NULL) > *s = '!'; > >- list_add(&rdev->same_set, &mddev->disks); >+ list_add_rcu(&rdev->same_set, &mddev->disks); > rdev->mddev = mddev; > printk(KERN_INFO "md: bind<%s>\n", b); > >@@ -1390,10 +1394,14 @@ static void unbind_rdev_from_array(mdk_r > return; > } > bd_release_from_disk(rdev->bdev, rdev->mddev->gendisk); >- list_del_init(&rdev->same_set); >+ list_del_rcu(&rdev->same_set); > printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); > rdev->mddev = NULL; > sysfs_remove_link(&rdev->kobj, "block"); >+ >+ /* Delay due to rcu usage. >+ */ >+ synchronize_rcu(); > kobject_del(&rdev->kobj); > } > >@@ -1445,7 +1453,6 @@ static void export_rdev(mdk_rdev_t * rde > if (rdev->mddev) > MD_BUG(); > free_disk_sb(rdev); >- list_del_init(&rdev->same_set); > #ifndef MODULE > md_autodetect_dev(rdev->bdev->bd_dev); > #endif >@@ -1924,10 +1931,21 @@ rdev_attr_show(struct kobject *kobj, str > { > struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); > mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); >+ mddev_t *mddev = rdev->mddev; >+ ssize_t rv; > > if (!entry->show) > return -EIO; >- return entry->show(rdev, page); >+ >+ rv = mddev ? mddev_lock(mddev) : -EBUSY; >+ if (!rv) { >+ if (rdev->mddev == NULL) >+ rv = -EBUSY; >+ else >+ rv = entry->show(rdev, page); >+ mddev_unlock(mddev); >+ } >+ return rv; > } > > static ssize_t >@@ -1936,12 +1954,22 @@ rdev_attr_store(struct kobject *kobj, st > { > struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); > mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); >+ ssize_t rv; >+ mddev_t *mddev = rdev->mddev; > > if (!entry->store) > return -EIO; > if (!capable(CAP_SYS_ADMIN)) > return -EACCES; >- return entry->store(rdev, page, length); >+ rv = mddev ? mddev_lock(mddev): -EBUSY; >+ if (!rv) { >+ if (rdev->mddev == NULL) >+ rv = -EBUSY; >+ else >+ rv = entry->store(rdev, page, length); >+ mddev_unlock(mddev); >+ } >+ return rv; > } > > static void rdev_free(struct kobject *ko) >@@ -3434,8 +3462,10 @@ static void autorun_devices(int part) > /* on success, candidates will be empty, on error > * it won't... > */ >- ITERATE_RDEV_GENERIC(candidates,rdev,tmp) >+ ITERATE_RDEV_GENERIC(candidates,rdev,tmp) { >+ list_del_init(&rdev->same_set); > export_rdev(rdev); >+ } > mddev_put(mddev); > } > printk(KERN_INFO "md: ... autorun DONE.\n"); >@@ -4978,12 +5008,12 @@ int unregister_md_personality(struct mdk > static int is_mddev_idle(mddev_t *mddev) > { > mdk_rdev_t * rdev; >- struct list_head *tmp; > int idle; > unsigned long curr_events; > > idle = 1; >- ITERATE_RDEV(mddev,rdev,tmp) { >+ rcu_read_lock(); >+ rdev_for_each_rcu(rdev, mddev) { > struct gendisk *disk = rdev->bdev->bd_contains->bd_disk; > curr_events = disk_stat_read(disk, sectors[0]) + > disk_stat_read(disk, sectors[1]) - >@@ -5006,6 +5036,7 @@ static int is_mddev_idle(mddev_t *mddev) > idle = 0; > } > } >+ rcu_read_unlock(); > return idle; > } > >diff -Nupr a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h >--- a/include/linux/raid/md_k.h 2008-07-15 10:27:55.000000000 -0400 >+++ b/include/linux/raid/md_k.h 2008-07-22 10:35:06.000000000 -0400 >@@ -314,6 +314,9 @@ static inline char * mdname (mddev_t * m > #define ITERATE_RDEV(mddev,rdev,tmp) \ > ITERATE_RDEV_GENERIC((mddev)->disks,rdev,tmp) > >+#define rdev_for_each_rcu(rdev, mddev) \ >+ list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set) >+ > /* > * Iterates through 'pending RAID disks' > */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 455471
: 312551