The 10/21/2020 14:44, Matthew Wilcox wrote: > On Wed, Oct 21, 2020 at 09:21:36AM +0000, Damien Le Moal wrote: > > > + * submit_bio_direct - submit a bio to the block device layer for I/O > > > + * bypass filter. > > > + * @bio: The bio describing the location in memory and on the device. > > > * > > > + * Description: > > You don't need this line. > > > > + * This is a version of submit_bio() that shall only be used for I/O > > > + * that cannot be intercepted by block layer filters. > > > + * All file systems and other upper level users of the block layer > > > + * should use submit_bio() instead. > > > + * Use this function to access the swap partition and directly access > > > + * the block device file. > > I don't understand why O_DIRECT gets to bypass the block filter. Nor do > I understand why anybody would place a block filter on the swap device. > But if somebody did place a filter on the swap device, why should swap > be able to bypass the filter? > I am very happy to hear such a question. You are really trying to understand the algorithm. Yes, intercepting the swap partition is absurd. But we can't guarantee that the filter won't intercept swap. Swap operation is related to the memory allocation logic. If a swap on the block device are accessed during memory allocation from filter, a deadlock occurs. We can allow filters to occasionally shoot off their feet, especially under high load. But I think it's better not to do it. "directly access" - it is not O_DIRECT. This means (I think) direct reading from the device file, like "dd if=/dev/sda1". As for intercepting direct reading, I don't know how to do the right thing. The problem here is that in fs/block_dev.c in function __blkdev_direct_IO() uses the qc - value returned by the submit_bio() function. This value is used below when calling blk_poll(bdev_get_queue(dev), qc, true). The filter cannot return a meaningful value of the blk_qc_t type when intercepting a request, because at that time it does not know which queue the request will fall into. If function submit_bio() will always return BLK_QC_T_NONE - I think the algorithm of the __blk dev_direct_IO() will not work correctly. If we need to intercept direct access to a block device, we need to at least redo the __blkdev_direct_IO function, getting rid of blk_pool. I'm not sure it's necessary yet. -- Sergei Shtepa Veeam Software developer.