Lines Matching refs:req
114 u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts) in blk_to_nvme_status() argument
129 req->error_loc = offsetof(struct nvme_rw_command, length); in blk_to_nvme_status()
133 req->error_loc = offsetof(struct nvme_rw_command, slba); in blk_to_nvme_status()
136 req->error_loc = offsetof(struct nvme_common_command, opcode); in blk_to_nvme_status()
137 switch (req->cmd->common.opcode) { in blk_to_nvme_status()
148 req->error_loc = offsetof(struct nvme_rw_command, nsid); in blk_to_nvme_status()
153 req->error_loc = offsetof(struct nvme_common_command, opcode); in blk_to_nvme_status()
156 switch (req->cmd->common.opcode) { in blk_to_nvme_status()
159 req->error_slba = le64_to_cpu(req->cmd->rw.slba); in blk_to_nvme_status()
162 req->error_slba = in blk_to_nvme_status()
163 le64_to_cpu(req->cmd->write_zeroes.slba); in blk_to_nvme_status()
166 req->error_slba = 0; in blk_to_nvme_status()
173 struct nvmet_req *req = bio->bi_private; in nvmet_bio_done() local
175 nvmet_req_complete(req, blk_to_nvme_status(req, bio->bi_status)); in nvmet_bio_done()
176 nvmet_req_bio_put(req, bio); in nvmet_bio_done()
180 static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio, in nvmet_bdev_alloc_bip() argument
188 bi = bdev_get_integrity(req->ns->bdev); in nvmet_bdev_alloc_bip()
195 bio_max_segs(req->metadata_sg_cnt)); in nvmet_bdev_alloc_bip()
226 static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio, in nvmet_bdev_alloc_bip() argument
233 static void nvmet_bdev_execute_rw(struct nvmet_req *req) in nvmet_bdev_execute_rw() argument
235 unsigned int sg_cnt = req->sg_cnt; in nvmet_bdev_execute_rw()
243 unsigned int total_len = nvmet_rw_data_len(req) + req->metadata_len; in nvmet_bdev_execute_rw()
245 if (!nvmet_check_transfer_len(req, total_len)) in nvmet_bdev_execute_rw()
248 if (!req->sg_cnt) { in nvmet_bdev_execute_rw()
249 nvmet_req_complete(req, 0); in nvmet_bdev_execute_rw()
253 if (req->cmd->rw.opcode == nvme_cmd_write) { in nvmet_bdev_execute_rw()
255 if (req->cmd->rw.control & cpu_to_le16(NVME_RW_FUA)) in nvmet_bdev_execute_rw()
263 if (is_pci_p2pdma_page(sg_page(req->sg))) in nvmet_bdev_execute_rw()
266 sector = nvmet_lba_to_sect(req->ns, req->cmd->rw.slba); in nvmet_bdev_execute_rw()
268 if (nvmet_use_inline_bvec(req)) { in nvmet_bdev_execute_rw()
269 bio = &req->b.inline_bio; in nvmet_bdev_execute_rw()
270 bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); in nvmet_bdev_execute_rw()
274 bio_set_dev(bio, req->ns->bdev); in nvmet_bdev_execute_rw()
276 bio->bi_private = req; in nvmet_bdev_execute_rw()
281 if (req->metadata_len) in nvmet_bdev_execute_rw()
282 sg_miter_start(&prot_miter, req->metadata_sg, in nvmet_bdev_execute_rw()
283 req->metadata_sg_cnt, iter_flags); in nvmet_bdev_execute_rw()
285 for_each_sg(req->sg, sg, req->sg_cnt, i) { in nvmet_bdev_execute_rw()
290 if (req->metadata_len) { in nvmet_bdev_execute_rw()
291 rc = nvmet_bdev_alloc_bip(req, bio, in nvmet_bdev_execute_rw()
300 bio_set_dev(bio, req->ns->bdev); in nvmet_bdev_execute_rw()
312 if (req->metadata_len) { in nvmet_bdev_execute_rw()
313 rc = nvmet_bdev_alloc_bip(req, bio, &prot_miter); in nvmet_bdev_execute_rw()
324 static void nvmet_bdev_execute_flush(struct nvmet_req *req) in nvmet_bdev_execute_flush() argument
326 struct bio *bio = &req->b.inline_bio; in nvmet_bdev_execute_flush()
328 if (!nvmet_check_transfer_len(req, 0)) in nvmet_bdev_execute_flush()
331 bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); in nvmet_bdev_execute_flush()
332 bio_set_dev(bio, req->ns->bdev); in nvmet_bdev_execute_flush()
333 bio->bi_private = req; in nvmet_bdev_execute_flush()
340 u16 nvmet_bdev_flush(struct nvmet_req *req) in nvmet_bdev_flush() argument
342 if (blkdev_issue_flush(req->ns->bdev)) in nvmet_bdev_flush()
347 static u16 nvmet_bdev_discard_range(struct nvmet_req *req, in nvmet_bdev_discard_range() argument
350 struct nvmet_ns *ns = req->ns; in nvmet_bdev_discard_range()
358 req->error_slba = le64_to_cpu(range->slba); in nvmet_bdev_discard_range()
359 return errno_to_nvme_status(req, ret); in nvmet_bdev_discard_range()
364 static void nvmet_bdev_execute_discard(struct nvmet_req *req) in nvmet_bdev_execute_discard() argument
371 for (i = 0; i <= le32_to_cpu(req->cmd->dsm.nr); i++) { in nvmet_bdev_execute_discard()
372 status = nvmet_copy_from_sgl(req, i * sizeof(range), &range, in nvmet_bdev_execute_discard()
377 status = nvmet_bdev_discard_range(req, &range, &bio); in nvmet_bdev_execute_discard()
383 bio->bi_private = req; in nvmet_bdev_execute_discard()
390 nvmet_req_complete(req, status); in nvmet_bdev_execute_discard()
394 static void nvmet_bdev_execute_dsm(struct nvmet_req *req) in nvmet_bdev_execute_dsm() argument
396 if (!nvmet_check_data_len_lte(req, nvmet_dsm_len(req))) in nvmet_bdev_execute_dsm()
399 switch (le32_to_cpu(req->cmd->dsm.attributes)) { in nvmet_bdev_execute_dsm()
401 nvmet_bdev_execute_discard(req); in nvmet_bdev_execute_dsm()
407 nvmet_req_complete(req, 0); in nvmet_bdev_execute_dsm()
412 static void nvmet_bdev_execute_write_zeroes(struct nvmet_req *req) in nvmet_bdev_execute_write_zeroes() argument
414 struct nvme_write_zeroes_cmd *write_zeroes = &req->cmd->write_zeroes; in nvmet_bdev_execute_write_zeroes()
420 if (!nvmet_check_transfer_len(req, 0)) in nvmet_bdev_execute_write_zeroes()
423 sector = nvmet_lba_to_sect(req->ns, write_zeroes->slba); in nvmet_bdev_execute_write_zeroes()
425 (req->ns->blksize_shift - 9)); in nvmet_bdev_execute_write_zeroes()
427 ret = __blkdev_issue_zeroout(req->ns->bdev, sector, nr_sector, in nvmet_bdev_execute_write_zeroes()
430 bio->bi_private = req; in nvmet_bdev_execute_write_zeroes()
434 nvmet_req_complete(req, errno_to_nvme_status(req, ret)); in nvmet_bdev_execute_write_zeroes()
438 u16 nvmet_bdev_parse_io_cmd(struct nvmet_req *req) in nvmet_bdev_parse_io_cmd() argument
440 switch (req->cmd->common.opcode) { in nvmet_bdev_parse_io_cmd()
443 req->execute = nvmet_bdev_execute_rw; in nvmet_bdev_parse_io_cmd()
444 if (req->sq->ctrl->pi_support && nvmet_ns_has_pi(req->ns)) in nvmet_bdev_parse_io_cmd()
445 req->metadata_len = nvmet_rw_metadata_len(req); in nvmet_bdev_parse_io_cmd()
448 req->execute = nvmet_bdev_execute_flush; in nvmet_bdev_parse_io_cmd()
451 req->execute = nvmet_bdev_execute_dsm; in nvmet_bdev_parse_io_cmd()
454 req->execute = nvmet_bdev_execute_write_zeroes; in nvmet_bdev_parse_io_cmd()
457 return nvmet_report_invalid_opcode(req); in nvmet_bdev_parse_io_cmd()