/*ARGSUSED*/ void raw_write_data(t10_cmd_t *cmd, emul_handle_t id, size_t offset, char *data, size_t data_len) { raw_io_t *io = (raw_io_t *)id; raw_params_t *r = T10_PARAMS_AREA(cmd); if (r == NULL) return; if (r->r_dtype == DTYPE_SEQUENTIAL) { raw_write_tape_data(cmd, id, offset, data, data_len); return; } trans_aiowrite(cmd, data, data_len, (io->r_lba * 512) + (off_t)io->r_offset, &io->r_aio); }
/*ARGSUSED*/ void sbc_write_data(t10_cmd_t *cmd, emul_handle_t id, size_t offset, char *data, size_t data_len) { disk_io_t *io = (disk_io_t *)id; disk_params_t *d; if (cmd->c_lu->l_common->l_mmap == MAP_FAILED) { trans_aiowrite(cmd, data, data_len, (io->da_lba * 512) + (off_t)io->da_offset, (aio_result_t *)io); } else { if ((d = (disk_params_t *)T10_PARAMS_AREA(cmd)) == NULL) return; if (d->d_fast_write == False) { /* * We only need to worry about sync'ing the blocks * in the mmap case because if the fast cache isn't * enabled for AIO the file will be opened with F_SYNC * which performs the correct action. */ if (fsync(cmd->c_lu->l_common->l_fd) == -1) { spc_sense_create(cmd, KEY_HARDWARE_ERROR, 0); trans_send_complete(cmd, STATUS_CHECK); return; } } /* * Since the data has already been transfered from the * transport to the mmap area we just need to call * the complete routine. */ sbc_write_cmplt(id); } }