diff options
author | Sage Weil <sage@newdream.net> | 2009-11-12 18:07:24 -0500 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-11-12 18:57:05 -0500 |
commit | 11ea8eda064aa4dc6e44a6dade1891b69ebd5255 (patch) | |
tree | e7def548d1d80e38710cc7d1fe30d4b2cd37d56f | |
parent | 039934b895c89c2bb40aa5132efe00e60b70efca (diff) |
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>
-rw-r--r-- | fs/ceph/caps.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index d8132b6e770d..9dd110602cda 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -1440,7 +1440,7 @@ retry_locked: | |||
1440 | 1440 | ||
1441 | dout("check_caps trying to invalidate on %p\n", inode); | 1441 | dout("check_caps trying to invalidate on %p\n", inode); |
1442 | spin_unlock(&inode->i_lock); | 1442 | spin_unlock(&inode->i_lock); |
1443 | ret = invalidate_inode_pages2(&inode->i_data); | 1443 | ret = invalidate_mapping_pages(&inode->i_data, 0, -1); |
1444 | spin_lock(&inode->i_lock); | 1444 | spin_lock(&inode->i_lock); |
1445 | if (ret == 0 && invalidating_gen == ci->i_rdcache_gen) { | 1445 | if (ret == 0 && invalidating_gen == ci->i_rdcache_gen) { |
1446 | /* success. */ | 1446 | /* success. */ |
@@ -2180,7 +2180,7 @@ restart: | |||
2180 | spin_unlock(&inode->i_lock); | 2180 | spin_unlock(&inode->i_lock); |
2181 | tried_invalidate = 1; | 2181 | tried_invalidate = 1; |
2182 | 2182 | ||
2183 | ret = invalidate_inode_pages2(&inode->i_data); | 2183 | ret = invalidate_mapping_pages(&inode->i_data, 0, -1); |
2184 | spin_lock(&inode->i_lock); | 2184 | spin_lock(&inode->i_lock); |
2185 | if (ret < 0) { | 2185 | if (ret < 0) { |
2186 | /* there were locked pages.. invalidate later | 2186 | /* there were locked pages.. invalidate later |