diff options
-rw-r--r-- | mm/rmap.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -103,6 +103,7 @@ static inline void anon_vma_free(struct anon_vma *anon_vma) | |||
103 | * LOCK should suffice since the actual taking of the lock must | 103 | * LOCK should suffice since the actual taking of the lock must |
104 | * happen _before_ what follows. | 104 | * happen _before_ what follows. |
105 | */ | 105 | */ |
106 | might_sleep(); | ||
106 | if (rwsem_is_locked(&anon_vma->root->rwsem)) { | 107 | if (rwsem_is_locked(&anon_vma->root->rwsem)) { |
107 | anon_vma_lock_write(anon_vma); | 108 | anon_vma_lock_write(anon_vma); |
108 | anon_vma_unlock_write(anon_vma); | 109 | anon_vma_unlock_write(anon_vma); |
@@ -426,8 +427,9 @@ struct anon_vma *page_get_anon_vma(struct page *page) | |||
426 | * above cannot corrupt). | 427 | * above cannot corrupt). |
427 | */ | 428 | */ |
428 | if (!page_mapped(page)) { | 429 | if (!page_mapped(page)) { |
430 | rcu_read_unlock(); | ||
429 | put_anon_vma(anon_vma); | 431 | put_anon_vma(anon_vma); |
430 | anon_vma = NULL; | 432 | return NULL; |
431 | } | 433 | } |
432 | out: | 434 | out: |
433 | rcu_read_unlock(); | 435 | rcu_read_unlock(); |
@@ -477,9 +479,9 @@ struct anon_vma *page_lock_anon_vma_read(struct page *page) | |||
477 | } | 479 | } |
478 | 480 | ||
479 | if (!page_mapped(page)) { | 481 | if (!page_mapped(page)) { |
482 | rcu_read_unlock(); | ||
480 | put_anon_vma(anon_vma); | 483 | put_anon_vma(anon_vma); |
481 | anon_vma = NULL; | 484 | return NULL; |
482 | goto out; | ||
483 | } | 485 | } |
484 | 486 | ||
485 | /* we pinned the anon_vma, its safe to sleep */ | 487 | /* we pinned the anon_vma, its safe to sleep */ |