| From c4e51729faf30ebff49668222f2e90c497b07233 Mon Sep 17 00:00:00 2001 | |
| From: Sasha Levin <sashal@kernel.org> | |
| Date: Wed, 24 Jun 2026 20:59:25 +0200 | |
| Subject: misc: ibmvmc: release send buffer on write errors | |
| From: Yousef Alhouseen <alhouseenyousef@gmail.com> | |
| [ Upstream commit fd62c1f591372f7dc4c5bc041569c2f0a4a86be1 ] | |
| ibmvmc_get_valid_hmc_buffer() marks the selected send buffer busy before | |
| ibmvmc_write() validates the backing storage or copies data from user | |
| space. Error exits after that point leave the buffer permanently busy. | |
| Keep the buffer pointer until ownership is handed to the hypervisor, and | |
| mark it free again on local write failures. Also report an RDMA send | |
| failure instead of returning a successful byte count. | |
| Signed-off-by: Yousef Alhouseen <alhouseenyousef@gmail.com> | |
| Link: https://patch.msgid.link/20260624185925.2133-1-alhouseenyousef@gmail.com | |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
| Signed-off-by: Sasha Levin <sashal@kernel.org> | |
| --- | |
| drivers/misc/ibmvmc.c | 10 ++++++++-- | |
| 1 file changed, 8 insertions(+), 2 deletions(-) | |
| diff --git a/drivers/misc/ibmvmc.c b/drivers/misc/ibmvmc.c | |
| index cbaf6d35e854e..d7e6fcd1ecf92 100644 | |
| --- a/drivers/misc/ibmvmc.c | |
| +++ b/drivers/misc/ibmvmc.c | |
| @@ -1040,7 +1040,7 @@ static ssize_t ibmvmc_write(struct file *file, const char *buffer, | |
| size_t count, loff_t *ppos) | |
| { | |
| struct inode *inode; | |
| - struct ibmvmc_buffer *vmc_buffer; | |
| + struct ibmvmc_buffer *vmc_buffer = NULL; | |
| struct ibmvmc_file_session *session; | |
| struct crq_server_adapter *adapter; | |
| struct ibmvmc_hmc *hmc; | |
| @@ -1130,9 +1130,15 @@ static ssize_t ibmvmc_write(struct file *file, const char *buffer, | |
| dev_dbg(adapter->dev, "write: file = 0x%lx, count = 0x%lx\n", | |
| (unsigned long)file, (unsigned long)count); | |
| - ibmvmc_send_msg(adapter, vmc_buffer, hmc, count); | |
| + if (ibmvmc_send_msg(adapter, vmc_buffer, hmc, count)) { | |
| + ret = -EIO; | |
| + goto out; | |
| + } | |
| + vmc_buffer = NULL; | |
| ret = p - buffer; | |
| out: | |
| + if (vmc_buffer) | |
| + vmc_buffer->free = 1; | |
| spin_unlock_irqrestore(&hmc->lock, flags); | |
| return (ssize_t)(ret); | |
| } | |
| -- | |
| 2.53.0 | |