On Tue, Oct 29, 2019 at 09:46:56AM +0000, Heming Zhao wrote: > Add another comment. > > The key of commit 2938b4dcc & 6b0d969b is function _invalidate_fd(). > But from my analysis, it looks your codes do not fix this issue. > > _invalidate_fd calls bcache_invalidate_fd & bcache_abort_fd. > bcache_invalidate_fd work as before, only return true or false to indicate there is or isn't fd in cache->errored. > Then bcache_abort_fd calls _abort_v, _abort_v calls _unlink_block & _free_block. > These two functions only delist block from currently cache->errored & cache->free list. > The data still in radix tree with flags BF_DIRTY. In _abort_v(): 1402│ // We can't remove the block from the radix tree yet because 1│ // we're in the middle of an iteration. and then after the iteration: 1416│ radix_tree_remove_prefix(cache->rtree, k.bytes, k.bytes + sizeof(k.parts.fd)); I've added a unit test to demonstrate it does indeed work: 840│static void test_abort_forces_reread(void *context) 1│{ 2│ struct fixture *f = context; 3│ struct mock_engine *me = f->me; 4│ struct bcache *cache = f->cache; 5│ struct block *b; 6│ int fd = 17; 7│ 8│ _expect_read(me, fd, 0); 9│ _expect(me, E_WAIT); 10│ T_ASSERT(bcache_get(cache, fd, 0, GF_DIRTY, &b)); 11│ bcache_put(b); 12│ 13│ bcache_abort_fd(cache, fd); 14│ T_ASSERT(bcache_flush(cache)); 15│ 16│ // Check the block is re-read 17│ _expect_read(me, fd, 0); 18│ _expect(me, E_WAIT); 19│ T_ASSERT(bcache_get(cache, fd, 0, 0, &b)); 20│ bcache_put(b); 21│} - Joe _______________________________________________ linux-lvm mailing list linux-lvm@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/linux-lvm read the LVM HOW-TO at http://tldp.org/HOWTO/LVM-HOWTO/