You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
ceph: don't use truncate_pagecache() to invalidate read cache
truncate_pagecache() drops dirty pages, it's dangerous to use it to invalidate read cache. Besides, we shouldn't start invalidating read cache while there are buffer writers. Because buffer writers may add dirty pages later. Signed-off-by: Yan, Zheng <zyan@redhat.com>
This commit is contained in:
+4
-4
@@ -1656,7 +1656,7 @@ retry_locked:
|
||||
*/
|
||||
if ((!is_delayed || mdsc->stopping) &&
|
||||
!S_ISDIR(inode->i_mode) && /* ignore readdir cache */
|
||||
ci->i_wrbuffer_ref == 0 && /* no dirty pages... */
|
||||
!(ci->i_wb_ref || ci->i_wrbuffer_ref) && /* no dirty pages... */
|
||||
inode->i_data.nrpages && /* have cached pages */
|
||||
(revoking & (CEPH_CAP_FILE_CACHE|
|
||||
CEPH_CAP_FILE_LAZYIO)) && /* or revoking cache */
|
||||
@@ -1698,8 +1698,8 @@ retry_locked:
|
||||
|
||||
revoking = cap->implemented & ~cap->issued;
|
||||
dout(" mds%d cap %p used %s issued %s implemented %s revoking %s\n",
|
||||
cap->mds, cap, ceph_cap_string(cap->issued),
|
||||
ceph_cap_string(cap_used),
|
||||
cap->mds, cap, ceph_cap_string(cap_used),
|
||||
ceph_cap_string(cap->issued),
|
||||
ceph_cap_string(cap->implemented),
|
||||
ceph_cap_string(revoking));
|
||||
|
||||
@@ -2828,7 +2828,7 @@ static void handle_cap_grant(struct ceph_mds_client *mdsc,
|
||||
if (!S_ISDIR(inode->i_mode) && /* don't invalidate readdir cache */
|
||||
((cap->issued & ~newcaps) & CEPH_CAP_FILE_CACHE) &&
|
||||
(newcaps & CEPH_CAP_FILE_LAZYIO) == 0 &&
|
||||
!ci->i_wrbuffer_ref) {
|
||||
!(ci->i_wrbuffer_ref || ci->i_wb_ref)) {
|
||||
if (try_nonblocking_invalidate(inode)) {
|
||||
/* there were locked pages.. invalidate later
|
||||
in a separate thread. */
|
||||
|
||||
+3
-1
@@ -1728,7 +1728,9 @@ static void ceph_invalidate_work(struct work_struct *work)
|
||||
orig_gen = ci->i_rdcache_gen;
|
||||
spin_unlock(&ci->i_ceph_lock);
|
||||
|
||||
truncate_pagecache(inode, 0);
|
||||
if (invalidate_inode_pages2(inode->i_mapping) < 0) {
|
||||
pr_err("invalidate_pages %p fails\n", inode);
|
||||
}
|
||||
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
if (orig_gen == ci->i_rdcache_gen &&
|
||||
|
||||
Reference in New Issue
Block a user