static void _usebuf_endio(struct generic_callback *cb) { struct usebuf_mref_aspect *mref_a = cb->cb_private; struct mref_object *mref; struct usebuf_mref_aspect *sub_mref_a; struct mref_object *sub_mref; LAST_CALLBACK(cb); CHECK_PTR(mref_a, done); mref = mref_a->object; CHECK_PTR(mref, done); sub_mref_a = mref_a->sub_mref_a; CHECK_PTR(sub_mref_a, done); sub_mref = sub_mref_a->object; CHECK_PTR(sub_mref, done); //MARS_INF("HALLO %p %p len = %d may_write = %d rw = %d flags = %d\n", mref, sub_mref, sub_mref->ref_len, sub_mref->ref_may_write, sub_mref->ref_rw, sub_mref->ref_flags); if (mref->ref_data != sub_mref->ref_data && cb->cb_error >= 0) { if (sub_mref->ref_may_write == 0) { if (sub_mref->ref_flags & MREF_UPTODATE) { _usebuf_copy(mref, sub_mref, 0); mref->ref_flags |= MREF_UPTODATE; } #ifndef FAKE_ALL } else if (sub_mref->ref_rw == 0) { MARS_IO("re-kick %p\n", sub_mref); sub_mref->ref_rw = 1; _usebuf_copy(mref, sub_mref, 1); mref->ref_flags |= MREF_UPTODATE; GENERIC_INPUT_CALL(mref_a->input, mref_io, sub_mref); return; #endif } } #if 1 if (mref_a->yyy++ > 0) MARS_ERR("yyy = %d\n", mref_a->yyy - 1); if (cb->cb_error < 0) MARS_ERR("error = %d\n", cb->cb_error); #endif CHECKED_CALLBACK(mref, cb->cb_error, done); if (!_mref_put(mref)) return; #if 1 _mref_put(sub_mref); #endif usebuf_free_mref(mref); done:; }
static void _complete(struct aio_output *output, struct aio_mref_aspect *mref_a, int err) { struct mref_object *mref; CHECK_PTR(mref_a, fatal); mref = mref_a->object; CHECK_PTR(mref, fatal); mars_trace(mref, "aio_endio"); if (err < 0) { MARS_ERR("IO error %d at pos=%lld len=%d (mref=%p ref_data=%p)\n", err, mref->ref_pos, mref->ref_len, mref, mref->ref_data); } else { mref_checksum(mref); mref->ref_flags |= MREF_UPTODATE; } CHECKED_CALLBACK(mref, err, err_found); done: if (mref->ref_rw) { atomic_dec(&output->write_count); } else { atomic_dec(&output->read_count); } mf_remove_dirty(output->mf, &mref_a->di); aio_ref_put(output, mref); atomic_dec(&output->work_count); atomic_dec(&mars_global_io_flying); return; err_found: MARS_FAT("giving up...\n"); goto done; fatal: MARS_FAT("bad pointer, giving up...\n"); }