Commit 11ea8eda authored by Sage Weil's avatar Sage Weil

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: default avatarSage Weil <sage@newdream.net>
parent 039934b8
...@@ -1440,7 +1440,7 @@ retry_locked: ...@@ -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: ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment