summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/fs.h10
-rw-r--r--mm/rmap.c6
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
481static inline void i_mmap_lock_read(struct address_space *mapping)
482{
483 down_read(&mapping->i_mmap_rwsem);
484}
485
486static 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 */
diff --git a/mm/rmap.c b/mm/rmap.c
index 18247f89f1a8..14ad2b3b0f54 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -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
1715done: 1715done:
1716 i_mmap_unlock_write(mapping); 1716 i_mmap_unlock_read(mapping);
1717 return ret; 1717 return ret;
1718} 1718}
1719 1719