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); fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, GFP_KERNEL); (or even better the folio version)