diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 2cff57e7116e..962cb62c621f 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -767,12 +767,12 @@ recheck_buffers: | |||
767 | } | 767 | } |
768 | bh = bh->b_this_page; | 768 | bh = bh->b_this_page; |
769 | } while (bh != head); | 769 | } while (bh != head); |
770 | spin_unlock(&mapping->private_lock); | ||
771 | if (busy) { | 770 | if (busy) { |
772 | if (invalidated) { | 771 | if (invalidated) { |
773 | rc = -EAGAIN; | 772 | rc = -EAGAIN; |
774 | goto unlock_buffers; | 773 | goto unlock_buffers; |
775 | } | 774 | } |
775 | spin_unlock(&mapping->private_lock); | ||
776 | invalidate_bh_lrus(); | 776 | invalidate_bh_lrus(); |
777 | invalidated = true; | 777 | invalidated = true; |
778 | goto recheck_buffers; | 778 | goto recheck_buffers; |
@@ -805,6 +805,8 @@ recheck_buffers: | |||
805 | 805 | ||
806 | rc = MIGRATEPAGE_SUCCESS; | 806 | rc = MIGRATEPAGE_SUCCESS; |
807 | unlock_buffers: | 807 | unlock_buffers: |
808 | if (check_refs) | ||
809 | spin_unlock(&mapping->private_lock); | ||
808 | bh = head; | 810 | bh = head; |
809 | do { | 811 | do { |
810 | unlock_buffer(bh); | 812 | unlock_buffer(bh); |
@@ -2328,16 +2330,13 @@ next: | |||
2328 | static void migrate_vma_collect(struct migrate_vma *migrate) | 2330 | static void migrate_vma_collect(struct migrate_vma *migrate) |
2329 | { | 2331 | { |
2330 | struct mmu_notifier_range range; | 2332 | struct mmu_notifier_range range; |
2331 | struct mm_walk mm_walk; | 2333 | struct mm_walk mm_walk = { |
2332 | 2334 | .pmd_entry = migrate_vma_collect_pmd, | |
2333 | mm_walk.pmd_entry = migrate_vma_collect_pmd; | 2335 | .pte_hole = migrate_vma_collect_hole, |
2334 | mm_walk.pte_entry = NULL; | 2336 | .vma = migrate->vma, |
2335 | mm_walk.pte_hole = migrate_vma_collect_hole; | 2337 | .mm = migrate->vma->vm_mm, |
2336 | mm_walk.hugetlb_entry = NULL; | 2338 | .private = migrate, |
2337 | mm_walk.test_walk = NULL; | 2339 | }; |
2338 | mm_walk.vma = migrate->vma; | ||
2339 | mm_walk.mm = migrate->vma->vm_mm; | ||
2340 | mm_walk.private = migrate; | ||
2341 | 2340 | ||
2342 | mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm, | 2341 | mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm, |
2343 | migrate->start, | 2342 | migrate->start, |