On Tue, May 07, 2024 at 09:10:15AM -0700, Christoph Hellwig wrote: > On Tue, May 07, 2024 at 05:00:28PM +0100, Matthew Wilcox wrote: > > If the len is more than PAGE_SIZE * BIO_MAX_VECS, __bio_add_page() > > will fail silently. I hate this interface. > > No, it won't. You can pass an arbitray len to it. > > > > > You should be doing something like ... > > > > while (len) { > > unsigned int io_len = min_t(unsigned int, len, PAGE_SIZE); > > > > while (!bio || bio_add_page() < io_len) { > > if (bio) > > iomap_dio_submit_bio(iter, dio, bio, pos); > > bio = iomap_dio_alloc_bio(iter, dio, BIO_MAX_VECS, > > REQ_OP_WRITE | REQ_SYNC | REQ_IDLE); > > fscrypt_set_bio_crypt_ctx(bio, inode, > > pos >> inode->i_blkbits, GFP_KERNEL); > > } > > } > > Wee, no. The right way is: > > bio = iomap_dio_alloc_bio(iter, dio, 1, > REQ_OP_WRITE | REQ_SYNC | REQ_IDLE); > __bio_add_page(bio, page, len, 0); no? len can be > PAGE_SIZE. and that can be true in the folio version too, because we won't necessarily be able to allocate the THP. > fscrypt_set_bio_crypt_ctx(bio, inode, > pos >> inode->i_blkbits, GFP_KERNEL); > > (or even better the folio version)