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>
This commit is contained in:
Родитель
039934b895
Коммит
11ea8eda06
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче