Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp1217325pxb; Thu, 16 Sep 2021 02:26:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJybyh+CFzZbn1X+ufqQlfuyBmC40ddrkATZqOLBmLJkMLGer8WsRK+yE4gNG429g+idK+O+ X-Received: by 2002:a05:6402:358c:: with SMTP id y12mr5312145edc.50.1631784407615; Thu, 16 Sep 2021 02:26:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631784407; cv=none; d=google.com; s=arc-20160816; b=wO6+CNZf9Mh6xf4nG+RJcW4ZD12LUb3AZRjiidD5IlTtRbSj1SUF3aFg49nLWy5i8X vF+/uL2A3JIOvciZUnRQEsq3KDe9Kqxy5pQ1O3Z/ujOvLb5sDp2ranSBD81tLg1aeh9z zRzWEuKkLSmg68mt85Cjmx7Z8y5BITmPpEE9b9w/NPxDAhzTtesGUgx1NVctdbPfQo/5 tGqR/DGwI96iTY3vzu84gc2W2FK4edXRow7UDcxSYCbncvVjFNRFtAWtrAk05D4/Zg/2 yx7gGKbZht1jw0UTv+DQ9IeAsoC+YGTNBnfNS0h8CyXWCxKbfoIOYyhtYqY4Y0SRMf85 rkwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=FiO/0y4unvfezFaJr2t12Tr7Bh9DQHqn/DRzPWM6fGQ=; b=WW1Hg3IYiuAGBxHP3Ou7HLtktyAAIF33ytIVjWJ7Erm9z9TeSLgFyqic8ZHfvaqbrL Y4nfJbB4zNncBaLGm/DhkQGLZaki1EBPAywNel7txpPqcg09jtdFtIZ/wZI1l4tnoJNn /IpodHwg4xBdTwAzmjmkLP6RsSMvuJdi2BaUok8mbc93p+qTDmX3VrIMMKRB9YrdkkRN ULrkJMP8gTkzblz3IYe8NRt7KXC7PrFlgRn9NRb4Y0oJINVljHyw+TizwLWqPz91kbEs kNPEmS/XYPbVjnGHfwB64kk11Y4LuHdP2pFEvfMdj5r+jn581Eh96xoWYEr/fW4PAslF CEFg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b27si3037141edj.49.2021.09.16.02.26.22; Thu, 16 Sep 2021 02:26:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235725AbhIPJZm (ORCPT + 99 others); Thu, 16 Sep 2021 05:25:42 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:15426 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235462AbhIPJZ1 (ORCPT ); Thu, 16 Sep 2021 05:25:27 -0400 Received: from dggemv703-chm.china.huawei.com (unknown [172.30.72.55]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4H9BPV1Fy7zRC9y; Thu, 16 Sep 2021 17:19:58 +0800 (CST) Received: from dggema762-chm.china.huawei.com (10.1.198.204) by dggemv703-chm.china.huawei.com (10.3.19.46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2308.8; Thu, 16 Sep 2021 17:24:02 +0800 Received: from huawei.com (10.175.127.227) by dggema762-chm.china.huawei.com (10.1.198.204) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.8; Thu, 16 Sep 2021 17:24:01 +0800 From: Yu Kuai To: , , , CC: , , , , Subject: [patch v8 1/7] nbd: don't handle response without a corresponding request message Date: Thu, 16 Sep 2021 17:33:44 +0800 Message-ID: <20210916093350.1410403-2-yukuai3@huawei.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210916093350.1410403-1-yukuai3@huawei.com> References: <20210916093350.1410403-1-yukuai3@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.127.227] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To dggema762-chm.china.huawei.com (10.1.198.204) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While handling a response message from server, nbd_read_stat() will try to get request by tag, and then complete the request. However, this is problematic if nbd haven't sent a corresponding request message: t1 t2 submit_bio nbd_queue_rq blk_mq_start_request recv_work nbd_read_stat blk_mq_tag_to_rq blk_mq_complete_request nbd_send_cmd Thus add a new cmd flag 'NBD_CMD_INFLIGHT', it will be set in nbd_send_cmd() and checked in nbd_read_stat(). Noted that this patch can't fix that blk_mq_tag_to_rq() might return a freed request, and this will be fixed in following patches. Signed-off-by: Yu Kuai Reviewed-by: Ming Lei --- drivers/block/nbd.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 5170a630778d..23ded569e8d3 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -126,6 +126,12 @@ struct nbd_device { }; #define NBD_CMD_REQUEUED 1 +/* + * This flag will be set if nbd_queue_rq() succeed, and will be checked and + * cleared in completion. Both setting and clearing of the flag are protected + * by cmd->lock. + */ +#define NBD_CMD_INFLIGHT 2 struct nbd_cmd { struct nbd_device *nbd; @@ -400,6 +406,7 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req, if (!mutex_trylock(&cmd->lock)) return BLK_EH_RESET_TIMER; + __clear_bit(NBD_CMD_INFLIGHT, &cmd->flags); if (!refcount_inc_not_zero(&nbd->config_refs)) { cmd->status = BLK_STS_TIMEOUT; mutex_unlock(&cmd->lock); @@ -729,6 +736,12 @@ static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index) cmd = blk_mq_rq_to_pdu(req); mutex_lock(&cmd->lock); + if (!__test_and_clear_bit(NBD_CMD_INFLIGHT, &cmd->flags)) { + dev_err(disk_to_dev(nbd->disk), "Suspicious reply %d (status %u flags %lu)", + tag, cmd->status, cmd->flags); + ret = -ENOENT; + goto out; + } if (cmd->cmd_cookie != nbd_handle_to_cookie(handle)) { dev_err(disk_to_dev(nbd->disk), "Double reply on req %p, cmd_cookie %u, handle cookie %u\n", req, cmd->cmd_cookie, nbd_handle_to_cookie(handle)); @@ -828,6 +841,7 @@ static bool nbd_clear_req(struct request *req, void *data, bool reserved) return true; mutex_lock(&cmd->lock); + __clear_bit(NBD_CMD_INFLIGHT, &cmd->flags); cmd->status = BLK_STS_IOERR; mutex_unlock(&cmd->lock); @@ -964,7 +978,13 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) * returns EAGAIN can be retried on a different socket. */ ret = nbd_send_cmd(nbd, cmd, index); - if (ret == -EAGAIN) { + /* + * Access to this flag is protected by cmd->lock, thus it's safe to set + * the flag after nbd_send_cmd() succeed to send request to server. + */ + if (!ret) + __set_bit(NBD_CMD_INFLIGHT, &cmd->flags); + else if (ret == -EAGAIN) { dev_err_ratelimited(disk_to_dev(nbd->disk), "Request send failed, requeueing\n"); nbd_mark_nsock_dead(nbd, nsock, 1); -- 2.31.1