From b9110635c1e797aef57a51ed68fb67a1685ab0ba Mon Sep 17 00:00:00 2001 From: Gal Hammer Date: Wed, 25 May 2022 10:30:49 +0300 Subject: [PATCH] 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 Signed-off-by: Shai Fultheim Signed-off-by: Robert Baldyga --- modules/cas_cache/volume/vol_block_dev_bottom.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/cas_cache/volume/vol_block_dev_bottom.c b/modules/cas_cache/volume/vol_block_dev_bottom.c index 31927ba..6495e83 100644 --- a/modules/cas_cache/volume/vol_block_dev_bottom.c +++ b/modules/cas_cache/volume/vol_block_dev_bottom.c @@ -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 */