- /* origin == LLAP_ORIGIN_WRITEPAGE */
- LL_CDEBUG_PAGE(D_ERROR, page, "old cksum %x != new "
- "%x!\n", llap->llap_checksum, csum);
- }
- }
-
- llap->llap_origin = origin;
- RETURN(llap);
-}
-
-static int queue_or_sync_write(struct obd_export *exp, struct inode *inode,
- struct ll_async_page *llap,
- unsigned to, obd_flag async_flags)
-{
- unsigned long size_index = i_size_read(inode) >> CFS_PAGE_SHIFT;
- struct obd_io_group *oig;
- struct ll_sb_info *sbi = ll_i2sbi(inode);
- int rc, noquot = llap->llap_ignore_quota ? OBD_BRW_NOQUOTA : 0;
- ENTRY;
-
- /* _make_ready only sees llap once we've unlocked the page */
- llap->llap_write_queued = 1;
- rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL,
- llap->llap_cookie, OBD_BRW_WRITE | noquot,
- 0, 0, 0, async_flags);
- if (rc == 0) {
- LL_CDEBUG_PAGE(D_PAGE, llap->llap_page, "write queued\n");
- GOTO(out, 0);
- }
-
- llap->llap_write_queued = 0;
- /* Do not pass llap here as it is sync write. */
- llap_write_pending(inode, NULL);
-
- rc = oig_init(&oig);
- if (rc)
- GOTO(out, rc);
-
- /* make full-page requests if we are not at EOF (bug 4410) */
- if (to != CFS_PAGE_SIZE && llap->llap_page->index < size_index) {
- LL_CDEBUG_PAGE(D_PAGE, llap->llap_page,
- "sync write before EOF: size_index %lu, to %d\n",
- size_index, to);
- to = CFS_PAGE_SIZE;
- } else if (to != CFS_PAGE_SIZE && llap->llap_page->index == size_index) {
- int size_to = i_size_read(inode) & ~CFS_PAGE_MASK;
- LL_CDEBUG_PAGE(D_PAGE, llap->llap_page,
- "sync write at EOF: size_index %lu, to %d/%d\n",
- size_index, to, size_to);
- if (to < size_to)
- to = size_to;
- }
-
- /* compare the checksum once before the page leaves llite */
- if (unlikely((sbi->ll_flags & LL_SBI_CHECKSUM) &&
- llap->llap_checksum != 0)) {
- __u32 csum;
- struct page *page = llap->llap_page;
- char *kaddr = kmap_atomic(page, KM_USER0);
- csum = init_checksum(OSC_DEFAULT_CKSUM);
- csum = compute_checksum(csum, kaddr, CFS_PAGE_SIZE,
- OSC_DEFAULT_CKSUM);
- kunmap_atomic(kaddr, KM_USER0);
- if (llap->llap_checksum == csum) {
- CDEBUG(D_PAGE, "page %p cksum %x confirmed\n",
- page, csum);
- } else {
- CERROR("page %p old cksum %x != new cksum %x!\n",
- page, llap->llap_checksum, csum);
- }
- }
-
- rc = obd_queue_group_io(exp, ll_i2info(inode)->lli_smd, NULL, oig,
- llap->llap_cookie, OBD_BRW_WRITE | noquot,
- 0, to, 0, ASYNC_READY | ASYNC_URGENT |
- ASYNC_COUNT_STABLE | ASYNC_GROUP_SYNC);
- if (rc)
- GOTO(free_oig, rc);
-
- rc = obd_trigger_group_io(exp, ll_i2info(inode)->lli_smd, NULL, oig);
- if (rc)
- GOTO(free_oig, rc);
-
- rc = oig_wait(oig);
-
- if (!rc && async_flags & ASYNC_READY) {
- unlock_page(llap->llap_page);
- if (PageWriteback(llap->llap_page)) {
- end_page_writeback(llap->llap_page);