• Minwoo Im's avatar
    nvmet: fix data_len to 0 for bdev-backed write_zeroes · 3562f5d9
    Minwoo Im authored
    The WRITE ZEROES command has no data transfer so that we need to
    initialize the struct (nvmet_req *req)->data_len to 0x0.  While
    (nvmet_req *req)->transfer_len is initialized in nvmet_req_init(),
    data_len will be initialized by nowhere which might cause the failure
    with status code NVME_SC_SGL_INVALID_DATA | NVME_SC_DNR randomly.  It's
    because nvmet_req_execute() checks like:
    
    	if (unlikely(req->data_len != req->transfer_len)) {
    		req->error_loc = offsetof(struct nvme_common_command, dptr);
    		nvmet_req_complete(req, NVME_SC_SGL_INVALID_DATA | NVME_SC_DNR);
    	} else
    		req->execute(req);
    
    This patch fixes req->data_len not to be a randomly assigned by
    initializing it to 0x0 when preparing the command in
    nvmet_bdev_parse_io_cmd().
    
    nvmet_file_parse_io_cmd() which is for file-backed I/O has already
    initialized the data_len field to 0x0, though.
    
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Sagi Grimberg <sagi@grimberg.me>
    Cc: Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>
    Signed-off-by: default avatarMinwoo Im <minwoo.im.dev@gmail.com>
    Reviewed-by: default avatarChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    3562f5d9
io-cmd-bdev.c 7.36 KB