diff options
-rw-r--r-- | include/linux/fs.h | 10 | ||||
-rw-r--r-- | mm/rmap.c | 6 |
2 files changed, 13 insertions, 3 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 6abcd0b72ae0..1d1838de6882 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -478,6 +478,16 @@ static inline void i_mmap_unlock_write(struct address_space *mapping) | |||
478 | up_write(&mapping->i_mmap_rwsem); | 478 | up_write(&mapping->i_mmap_rwsem); |
479 | } | 479 | } |
480 | 480 | ||
481 | static inline void i_mmap_lock_read(struct address_space *mapping) | ||
482 | { | ||
483 | down_read(&mapping->i_mmap_rwsem); | ||
484 | } | ||
485 | |||
486 | static inline void i_mmap_unlock_read(struct address_space *mapping) | ||
487 | { | ||
488 | up_read(&mapping->i_mmap_rwsem); | ||
489 | } | ||
490 | |||
481 | /* | 491 | /* |
482 | * Might pages of this file be mapped into userspace? | 492 | * Might pages of this file be mapped into userspace? |
483 | */ | 493 | */ |
@@ -1690,7 +1690,8 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) | |||
1690 | 1690 | ||
1691 | if (!mapping) | 1691 | if (!mapping) |
1692 | return ret; | 1692 | return ret; |
1693 | i_mmap_lock_write(mapping); | 1693 | |
1694 | i_mmap_lock_read(mapping); | ||
1694 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { | 1695 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
1695 | unsigned long address = vma_address(page, vma); | 1696 | unsigned long address = vma_address(page, vma); |
1696 | 1697 | ||
@@ -1711,9 +1712,8 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) | |||
1711 | goto done; | 1712 | goto done; |
1712 | 1713 | ||
1713 | ret = rwc->file_nonlinear(page, mapping, rwc->arg); | 1714 | ret = rwc->file_nonlinear(page, mapping, rwc->arg); |
1714 | |||
1715 | done: | 1715 | done: |
1716 | i_mmap_unlock_write(mapping); | 1716 | i_mmap_unlock_read(mapping); |
1717 | return ret; | 1717 | return ret; |
1718 | } | 1718 | } |
1719 | 1719 | ||