Эх сурвалжийг харах

ceph: fix page invalidation deadlock

We occasionally want to make a best-effort attempt to invalidate cache
pages without fear of blocking.  If this fails, we fall back to an async
invalidate in another thread.

Use invalidate_mapping_pages instead of invalidate_inode_page2, as that
will skip locked pages, and not deadlock.

Signed-off-by: Sage Weil <sage@newdream.net>
Sage Weil 15 жил өмнө
parent
commit
11ea8eda06
1 өөрчлөгдсөн 2 нэмэгдсэн , 2 устгасан
  1. 2 2
      fs/ceph/caps.c

+ 2 - 2
fs/ceph/caps.c

@@ -1440,7 +1440,7 @@ retry_locked:
 
 
 		dout("check_caps trying to invalidate on %p\n", inode);
 		dout("check_caps trying to invalidate on %p\n", inode);
 		spin_unlock(&inode->i_lock);
 		spin_unlock(&inode->i_lock);
-		ret = invalidate_inode_pages2(&inode->i_data);
+		ret = invalidate_mapping_pages(&inode->i_data, 0, -1);
 		spin_lock(&inode->i_lock);
 		spin_lock(&inode->i_lock);
 		if (ret == 0 && invalidating_gen == ci->i_rdcache_gen) {
 		if (ret == 0 && invalidating_gen == ci->i_rdcache_gen) {
 			/* success. */
 			/* success. */
@@ -2180,7 +2180,7 @@ restart:
 		spin_unlock(&inode->i_lock);
 		spin_unlock(&inode->i_lock);
 		tried_invalidate = 1;
 		tried_invalidate = 1;
 
 
-		ret = invalidate_inode_pages2(&inode->i_data);
+		ret = invalidate_mapping_pages(&inode->i_data, 0, -1);
 		spin_lock(&inode->i_lock);
 		spin_lock(&inode->i_lock);
 		if (ret < 0) {
 		if (ret < 0) {
 			/* there were locked pages.. invalidate later
 			/* there were locked pages.. invalidate later