>> - bio = iomap_dio_alloc_bio(iter, dio, 1, REQ_OP_WRITE | REQ_SYNC | REQ_IDLE); >> + WARN_ON_ONCE(len > (BIO_MAX_VECS * PAGE_SIZE)); > > How can that happen here? Max fsb size will be 64kB for the > foreseeable future, the bio can hold 256 pages so it will have a > minimum size capability of 1MB. > I just added it as a pathological check. This will not trigger anytime in the near future. > FWIW, as a general observation, I think this is the wrong place to > be checking that a filesystem block is larger than can be fit in a > single bio. There's going to be problems all over the place if we > can't do fsb sized IO in a single bio. i.e. I think this sort of > validation should be performed during filesystem mount, not > sporadically checked with WARN_ON() checks in random places in the > IO path... > I agree that it should be a check at a higher level. As iomap can be used by any filesystem, the check on FSB limitation should be a part iomap right? I don't see any explicit document/comment that states the iomap limitations on FSB, etc. >> >> - __bio_add_page(bio, page, len, 0); >> + while (len) { >> + unsigned int io_len = min_t(unsigned int, len, PAGE_SIZE); >> + >> + __bio_add_page(bio, page, io_len, 0); >> + len -= io_len; >> + } >> iomap_dio_submit_bio(iter, dio, bio, pos); > > /me wonders if we should have a set of ZERO_FOLIO()s that contain a > folio of each possible size. Then we just pull the ZERO_FOLIO of the > correct size and use __bio_add_folio(). i.e. no need for > looping over the bio to repeatedly add the ZERO_PAGE, etc, and the > code is then identical for all cases of page size vs FSB size. > I was exactly looking for ZERO_FOLIOs. Instead of having a ZERO_PAGE, can we reserve a ZERO_HUGE_PAGE so that it can be used directly by bio_add_folio_nofail()?