cas_cache: fix "blk_update_request: operation not supported" error

A write request with the REQ_RAHEAD flag enabled cause the nvme driver
to send a write command with access frequency value that is reserved
(at least on specification version 1.4c). NVME devices might fail this
write command with an unsupported error. So we now clear the request's
flag based on its direction.

Signed-off-by: Gal Hammer <gal.hammer@huawei.com>
Signed-off-by: Shai Fultheim <shai.fultheim@huawei.com>
Signed-off-by: Robert Baldyga <robert.baldyga@huawei.com>
This commit is contained in:
Gal Hammer 2022-05-25 10:30:49 +03:00 committed by Robert Baldyga
parent de16763bec
commit b9110635c1

View File

@ -310,6 +310,21 @@ static inline bool cas_bd_io_prepare(int *dir, struct ocf_io *io)
return true;
}
/*
* Returns only flags that are relevant to request's direction.
*/
static inline uint64_t filter_req_flags(int dir, uint64_t flags)
{
/* Remove REQ_RAHEAD flag from write request to cache which are a
result of a missed read-head request. This flag caused the nvme
driver to send write command with access frequency value that is
reserved */
if (dir == WRITE)
flags &= ~REQ_RAHEAD;
return flags;
}
/*
*
*/
@ -359,7 +374,7 @@ static void block_dev_submit_io(struct ocf_io *io)
CAS_BIO_BISECTOR(bio) = addr / SECTOR_SIZE;
bio->bi_next = NULL;
bio->bi_private = io;
CAS_BIO_OP_FLAGS(bio) |= io->flags;
CAS_BIO_OP_FLAGS(bio) |= filter_req_flags(dir, io->flags);
bio->bi_end_io = CAS_REFER_BLOCK_CALLBACK(cas_bd_io_end);
/* Add pages */