Lines Matching full:req
122 u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts) in blk_to_nvme_status() argument
137 req->error_loc = offsetof(struct nvme_rw_command, length); in blk_to_nvme_status()
141 req->error_loc = offsetof(struct nvme_rw_command, slba); in blk_to_nvme_status()
144 req->error_loc = offsetof(struct nvme_common_command, opcode); in blk_to_nvme_status()
145 switch (req->cmd->common.opcode) { in blk_to_nvme_status()
156 req->error_loc = offsetof(struct nvme_rw_command, nsid); in blk_to_nvme_status()
161 req->error_loc = offsetof(struct nvme_common_command, opcode); in blk_to_nvme_status()
164 switch (req->cmd->common.opcode) { in blk_to_nvme_status()
167 req->error_slba = le64_to_cpu(req->cmd->rw.slba); in blk_to_nvme_status()
170 req->error_slba = in blk_to_nvme_status()
171 le64_to_cpu(req->cmd->write_zeroes.slba); in blk_to_nvme_status()
174 req->error_slba = 0; in blk_to_nvme_status()
181 struct nvmet_req *req = bio->bi_private; in nvmet_bio_done() local
183 nvmet_req_complete(req, blk_to_nvme_status(req, bio->bi_status)); in nvmet_bio_done()
184 nvmet_req_bio_put(req, bio); in nvmet_bio_done()
188 static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio, in nvmet_bdev_alloc_bip() argument
196 bi = bdev_get_integrity(req->ns->bdev); in nvmet_bdev_alloc_bip()
203 bio_max_segs(req->metadata_sg_cnt)); in nvmet_bdev_alloc_bip()
233 static int nvmet_bdev_alloc_bip(struct nvmet_req *req, struct bio *bio, in nvmet_bdev_alloc_bip() argument
240 static void nvmet_bdev_execute_rw(struct nvmet_req *req) in nvmet_bdev_execute_rw() argument
242 unsigned int sg_cnt = req->sg_cnt; in nvmet_bdev_execute_rw()
251 unsigned int total_len = nvmet_rw_data_len(req) + req->metadata_len; in nvmet_bdev_execute_rw()
253 if (!nvmet_check_transfer_len(req, total_len)) in nvmet_bdev_execute_rw()
256 if (!req->sg_cnt) { in nvmet_bdev_execute_rw()
257 nvmet_req_complete(req, 0); in nvmet_bdev_execute_rw()
261 if (req->cmd->rw.opcode == nvme_cmd_write) { in nvmet_bdev_execute_rw()
263 if (req->cmd->rw.control & cpu_to_le16(NVME_RW_FUA)) in nvmet_bdev_execute_rw()
271 if (is_pci_p2pdma_page(sg_page(req->sg))) in nvmet_bdev_execute_rw()
274 sector = nvmet_lba_to_sect(req->ns, req->cmd->rw.slba); in nvmet_bdev_execute_rw()
276 if (nvmet_use_inline_bvec(req)) { in nvmet_bdev_execute_rw()
277 bio = &req->b.inline_bio; in nvmet_bdev_execute_rw()
278 bio_init(bio, req->ns->bdev, req->inline_bvec, in nvmet_bdev_execute_rw()
279 ARRAY_SIZE(req->inline_bvec), opf); in nvmet_bdev_execute_rw()
281 bio = bio_alloc(req->ns->bdev, bio_max_segs(sg_cnt), opf, in nvmet_bdev_execute_rw()
285 bio->bi_private = req; in nvmet_bdev_execute_rw()
289 if (req->metadata_len) in nvmet_bdev_execute_rw()
290 sg_miter_start(&prot_miter, req->metadata_sg, in nvmet_bdev_execute_rw()
291 req->metadata_sg_cnt, iter_flags); in nvmet_bdev_execute_rw()
293 for_each_sg(req->sg, sg, req->sg_cnt, i) { in nvmet_bdev_execute_rw()
298 if (req->metadata_len) { in nvmet_bdev_execute_rw()
299 rc = nvmet_bdev_alloc_bip(req, bio, in nvmet_bdev_execute_rw()
307 bio = bio_alloc(req->ns->bdev, bio_max_segs(sg_cnt), in nvmet_bdev_execute_rw()
319 if (req->metadata_len) { in nvmet_bdev_execute_rw()
320 rc = nvmet_bdev_alloc_bip(req, bio, &prot_miter); in nvmet_bdev_execute_rw()
331 static void nvmet_bdev_execute_flush(struct nvmet_req *req) in nvmet_bdev_execute_flush() argument
333 struct bio *bio = &req->b.inline_bio; in nvmet_bdev_execute_flush()
335 if (!bdev_write_cache(req->ns->bdev)) { in nvmet_bdev_execute_flush()
336 nvmet_req_complete(req, NVME_SC_SUCCESS); in nvmet_bdev_execute_flush()
340 if (!nvmet_check_transfer_len(req, 0)) in nvmet_bdev_execute_flush()
343 bio_init(bio, req->ns->bdev, req->inline_bvec, in nvmet_bdev_execute_flush()
344 ARRAY_SIZE(req->inline_bvec), REQ_OP_WRITE | REQ_PREFLUSH); in nvmet_bdev_execute_flush()
345 bio->bi_private = req; in nvmet_bdev_execute_flush()
351 u16 nvmet_bdev_flush(struct nvmet_req *req) in nvmet_bdev_flush() argument
353 if (!bdev_write_cache(req->ns->bdev)) in nvmet_bdev_flush()
356 if (blkdev_issue_flush(req->ns->bdev)) in nvmet_bdev_flush()
361 static u16 nvmet_bdev_discard_range(struct nvmet_req *req, in nvmet_bdev_discard_range() argument
364 struct nvmet_ns *ns = req->ns; in nvmet_bdev_discard_range()
372 req->error_slba = le64_to_cpu(range->slba); in nvmet_bdev_discard_range()
373 return errno_to_nvme_status(req, ret); in nvmet_bdev_discard_range()
378 static void nvmet_bdev_execute_discard(struct nvmet_req *req) in nvmet_bdev_execute_discard() argument
385 for (i = 0; i <= le32_to_cpu(req->cmd->dsm.nr); i++) { in nvmet_bdev_execute_discard()
386 status = nvmet_copy_from_sgl(req, i * sizeof(range), &range, in nvmet_bdev_execute_discard()
391 status = nvmet_bdev_discard_range(req, &range, &bio); in nvmet_bdev_execute_discard()
397 bio->bi_private = req; in nvmet_bdev_execute_discard()
404 nvmet_req_complete(req, status); in nvmet_bdev_execute_discard()
408 static void nvmet_bdev_execute_dsm(struct nvmet_req *req) in nvmet_bdev_execute_dsm() argument
410 if (!nvmet_check_data_len_lte(req, nvmet_dsm_len(req))) in nvmet_bdev_execute_dsm()
413 switch (le32_to_cpu(req->cmd->dsm.attributes)) { in nvmet_bdev_execute_dsm()
415 nvmet_bdev_execute_discard(req); in nvmet_bdev_execute_dsm()
421 nvmet_req_complete(req, 0); in nvmet_bdev_execute_dsm()
426 static void nvmet_bdev_execute_write_zeroes(struct nvmet_req *req) in nvmet_bdev_execute_write_zeroes() argument
428 struct nvme_write_zeroes_cmd *write_zeroes = &req->cmd->write_zeroes; in nvmet_bdev_execute_write_zeroes()
434 if (!nvmet_check_transfer_len(req, 0)) in nvmet_bdev_execute_write_zeroes()
437 sector = nvmet_lba_to_sect(req->ns, write_zeroes->slba); in nvmet_bdev_execute_write_zeroes()
439 (req->ns->blksize_shift - 9)); in nvmet_bdev_execute_write_zeroes()
441 ret = __blkdev_issue_zeroout(req->ns->bdev, sector, nr_sector, in nvmet_bdev_execute_write_zeroes()
444 bio->bi_private = req; in nvmet_bdev_execute_write_zeroes()
448 nvmet_req_complete(req, errno_to_nvme_status(req, ret)); in nvmet_bdev_execute_write_zeroes()
452 u16 nvmet_bdev_parse_io_cmd(struct nvmet_req *req) in nvmet_bdev_parse_io_cmd() argument
454 switch (req->cmd->common.opcode) { in nvmet_bdev_parse_io_cmd()
457 req->execute = nvmet_bdev_execute_rw; in nvmet_bdev_parse_io_cmd()
458 if (req->sq->ctrl->pi_support && nvmet_ns_has_pi(req->ns)) in nvmet_bdev_parse_io_cmd()
459 req->metadata_len = nvmet_rw_metadata_len(req); in nvmet_bdev_parse_io_cmd()
462 req->execute = nvmet_bdev_execute_flush; in nvmet_bdev_parse_io_cmd()
465 req->execute = nvmet_bdev_execute_dsm; in nvmet_bdev_parse_io_cmd()
468 req->execute = nvmet_bdev_execute_write_zeroes; in nvmet_bdev_parse_io_cmd()
471 return nvmet_report_invalid_opcode(req); in nvmet_bdev_parse_io_cmd()