From: Greg Kroah-Hartman Date: Tue, 24 Apr 2012 16:09:07 +0000 (-0700) Subject: 3.3-stable patches X-Git-Tag: v3.0.30~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=59cd8bf3875f37670a5bef2fbc8a62270f5e8875;p=thirdparty%2Fkernel%2Fstable-queue.git 3.3-stable patches added patches: md-don-t-call-add_disk-unless-there-is-good-reason.patch md-fix-possible-corruption-of-array-metadata-on-shutdown.patch mm-fix-s390-bug-by-__set_page_dirty_no_writeback-on-swap.patch --- diff --git a/queue-3.3/md-don-t-call-add_disk-unless-there-is-good-reason.patch b/queue-3.3/md-don-t-call-add_disk-unless-there-is-good-reason.patch new file mode 100644 index 00000000000..fe2138a442c --- /dev/null +++ b/queue-3.3/md-don-t-call-add_disk-unless-there-is-good-reason.patch @@ -0,0 +1,52 @@ +From ed209584c38fb74b7eecc03e5b1bfe674e591bd8 Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Tue, 24 Apr 2012 10:23:14 +1000 +Subject: md: don't call ->add_disk unless there is good reason. + +From: NeilBrown + +commit ed209584c38fb74b7eecc03e5b1bfe674e591bd8 upstream. + +Commit 7bfec5f35c68121e7b18 + + md/raid5: If there is a spare and a want_replacement device, start replacement. + +cause md_check_recovery to call ->add_disk much more often. +Instead of only when the array is degraded, it is now called whenever +md_check_recovery finds anything useful to do, which includes +updating the metadata for clean<->dirty transition. +This causes unnecessary work, and causes info messages from ->add_disk +to be reported much too often. + +So refine md_check_recovery to only do any actual recovery checking +(including ->add_disk) if MD_RECOVERY_NEEDED is set. + +This fix is suitable for 3.3.y: + +Reported-by: Jan Ceuleers +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/md.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -7580,14 +7580,14 @@ void md_check_recovery(struct mddev *mdd + * any transients in the value of "sync_action". + */ + set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); +- clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + /* Clear some bits that don't mean anything, but + * might be left set + */ + clear_bit(MD_RECOVERY_INTR, &mddev->recovery); + clear_bit(MD_RECOVERY_DONE, &mddev->recovery); + +- if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) ++ if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || ++ test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) + goto unlock; + /* no recovery is running. + * remove any failed drives, then diff --git a/queue-3.3/md-fix-possible-corruption-of-array-metadata-on-shutdown.patch b/queue-3.3/md-fix-possible-corruption-of-array-metadata-on-shutdown.patch new file mode 100644 index 00000000000..6faaef7be98 --- /dev/null +++ b/queue-3.3/md-fix-possible-corruption-of-array-metadata-on-shutdown.patch @@ -0,0 +1,48 @@ +From 30b8aa9172dfeaac6d77897c67ee9f9fc574cdbb Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Tue, 24 Apr 2012 10:23:16 +1000 +Subject: md: fix possible corruption of array metadata on shutdown. + +From: NeilBrown + +commit 30b8aa9172dfeaac6d77897c67ee9f9fc574cdbb upstream. + +commit c744a65c1e2d59acc54333ce8 + md: don't set md arrays to readonly on shutdown. + +removed the possibility of a 'BUG' when data is written to an array +that has just been switched to read-only, but also introduced the +possibility that the array metadata could be corrupted. + +If, when md_notify_reboot gets the mddev lock, the array is +in a state where it is assembled but hasn't been started (as can +happen if the personality module is not available, or in other unusual +situations), then incorrect metadata will be written out making it +impossible to re-assemble the array. + +So only call __md_stop_writes() if the array has actually been +activated. + +This patch is needed for any stable kernel which has had the above +commit applied. + +Reported-by: Christoph Nelles +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/md.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -8160,7 +8160,8 @@ static int md_notify_reboot(struct notif + + for_each_mddev(mddev, tmp) { + if (mddev_trylock(mddev)) { +- __md_stop_writes(mddev); ++ if (mddev->pers) ++ __md_stop_writes(mddev); + mddev->safemode = 2; + mddev_unlock(mddev); + } diff --git a/queue-3.3/mm-fix-s390-bug-by-__set_page_dirty_no_writeback-on-swap.patch b/queue-3.3/mm-fix-s390-bug-by-__set_page_dirty_no_writeback-on-swap.patch new file mode 100644 index 00000000000..050d0646e69 --- /dev/null +++ b/queue-3.3/mm-fix-s390-bug-by-__set_page_dirty_no_writeback-on-swap.patch @@ -0,0 +1,57 @@ +From aca50bd3b4c4bb5528a1878158ba7abce41de534 Mon Sep 17 00:00:00 2001 +From: Hugh Dickins +Date: Mon, 23 Apr 2012 11:14:50 -0700 +Subject: mm: fix s390 BUG by __set_page_dirty_no_writeback on swap + +From: Hugh Dickins + +commit aca50bd3b4c4bb5528a1878158ba7abce41de534 upstream. + +Mel reports a BUG_ON(slot == NULL) in radix_tree_tag_set() on s390 +3.0.13: called from __set_page_dirty_nobuffers() when page_remove_rmap() +tries to transfer dirty flag from s390 storage key to struct page and +radix_tree. + +That would be because of reclaim's shrink_page_list() calling +add_to_swap() on this page at the same time: first PageSwapCache is set +(causing page_mapping(page) to appear as &swapper_space), then +page->private set, then tree_lock taken, then page inserted into +radix_tree - so there's an interval before taking the lock when the +radix_tree slot is empty. + +We could fix this by moving __add_to_swap_cache()'s spin_lock_irq up +before the SetPageSwapCache. But a better fix is simply to do what's +five years overdue: Ken Chen introduced __set_page_dirty_no_writeback() +(if !PageDirty TestSetPageDirty) for tmpfs to skip all the radix_tree +overhead, and swap is just the same - it ignores the radix_tree tag, and +does not participate in dirty page accounting, so should be using +__set_page_dirty_no_writeback() too. + +s390 testing now confirms that this does indeed fix the problem. + +Reported-by: Mel Gorman +Signed-off-by: Hugh Dickins +Acked-by: Mel Gorman +Cc: Andrew Morton +Cc: Martin Schwidefsky +Cc: Heiko Carstens +Cc: Rik van Riel +Cc: Ken Chen +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/swap_state.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/mm/swap_state.c ++++ b/mm/swap_state.c +@@ -26,7 +26,7 @@ + */ + static const struct address_space_operations swap_aops = { + .writepage = swap_writepage, +- .set_page_dirty = __set_page_dirty_nobuffers, ++ .set_page_dirty = __set_page_dirty_no_writeback, + .migratepage = migrate_page, + }; + diff --git a/queue-3.3/series b/queue-3.3/series index 8a52da2e5f4..d5ec8d6ed18 100644 --- a/queue-3.3/series +++ b/queue-3.3/series @@ -28,3 +28,6 @@ media-dvb_frontend-fix-a-regression-when-switching-back-to-dvb-s.patch cfg80211-fix-interface-combinations-check.patch staging-r8712u-fix-regression-caused-by-commit-8c213fa.patch fix-modpost-failures-in-fedora-17.patch +mm-fix-s390-bug-by-__set_page_dirty_no_writeback-on-swap.patch +md-don-t-call-add_disk-unless-there-is-good-reason.patch +md-fix-possible-corruption-of-array-metadata-on-shutdown.patch