Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp437206ybl; Tue, 28 Jan 2020 06:01:20 -0800 (PST) X-Google-Smtp-Source: APXvYqxM/LwoDYeDc61x3lAns5QMOSc69BO3VqvZ2MI3TPVPbbWiyuFJS+osoPDJpuaEoysmeGQh X-Received: by 2002:a9d:7757:: with SMTP id t23mr16988510otl.315.1580220079525; Tue, 28 Jan 2020 06:01:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580220079; cv=none; d=google.com; s=arc-20160816; b=Y+DKFmViHSDdoFYToe+PKm31OmUoIH+T/JkFeKoNEWxbSxwzDq1BUsPPHwNqBIs69R aPpc6ZJMulk/nJQEzKIn8e5kFoQm7Cz1ET/jSF3tq4KK5E622M23zqRgo5RhoavKojqw EQjChrvG6cllvy+I4J0TMO4guklxF2tinohl8Fv5TbgeRJOF9q9KCKixT8ThOwGgnChK 4M4BCRjQr/lWqrg21uSXwyNEZ5npu4Rd0ji+OkKfHr8YMKyUJy7edi059iSSkD0NkWeG w3O1LPXAuKzb8c76EZB2f9mUOtuGinezbg4c8gmCE+wKyRiQmVKU80R6o9/HDYXFCCmw WmKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Ol9W28bdEi7/MS4ZcDzDH+gyY6YMadJkkWNbQV2SzPc=; b=0y+6acNGsh8uztSSTv348YNrp6xAuSBcXAERXhokilFj+wWbxEY6rxiDhvdS9xS3xc 5VIlNltoP72uuJMlo0OicxEwN3Erz6RdEmYfre45ORsrhcUzFi2QIhz4/Ng2QnzUKmy/ jB0Q2f+T9QmfPdXMWGMDjwiGv7/y6PNzUZTK+kG8YnBubnVQKOkuNuEY2XM7mbXIdPVz eak9iaqYMCyM0nkUlBWA+TIAXlR3r6Mf/r/N7i1DZw6ACY5p+SfJPNgAwIV9KIVveLfg jlFPgHJVk7kQ3OmqJPctUFhBEeYVIllcovd8dfJgEy5xmre/gHhG6SKoRDNryeRC0V0t afxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="s2b3l/az"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d20si9163027oti.311.2020.01.28.06.01.07; Tue, 28 Jan 2020 06:01:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="s2b3l/az"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727069AbgA1N7l (ORCPT + 99 others); Tue, 28 Jan 2020 08:59:41 -0500 Received: from mail.kernel.org ([198.145.29.99]:45082 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727024AbgA1N7i (ORCPT ); Tue, 28 Jan 2020 08:59:38 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4BBBB2173E; Tue, 28 Jan 2020 13:59:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580219977; bh=hEAUIpxUOVjreXovR7iHITQ4p9Qc0eBRwWEAJz+fPqQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s2b3l/azqfpLk0xf/QM8IxhCrAfGCHpPSatP5QBq8mS87iIeeU9p7QtVxHuSsLQIS iBZJPZFXyqi6c7XMyR8W0mobb+Gg5QtR6nZfLgynngLn021Bto43+BABxcPGXpZS1Z nG76H3zQWkVIQaRP4o7Fn2Wyv+zYSU/eth4WjSUM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Damien Le Moal , Masato Suzuki , "Martin K. Petersen" Subject: [PATCH 4.14 37/46] sd: Fix REQ_OP_ZONE_REPORT completion handling Date: Tue, 28 Jan 2020 14:58:11 +0100 Message-Id: <20200128135754.683895075@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135749.822297911@linuxfoundation.org> References: <20200128135749.822297911@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masato Suzuki ZBC/ZAC report zones command may return less bytes than requested if the number of matching zones for the report request is small. However, unlike read or write commands, the remainder of incomplete report zones commands cannot be automatically requested by the block layer: the start sector of the next report cannot be known, and the report reply may not be 512B aligned for SAS drives (a report zone reply size is always a multiple of 64B). The regular request completion code executing bio_advance() and restart of the command remainder part currently causes invalid zone descriptor data to be reported to the caller if the report zone size is smaller than 512B (a case that can happen easily for a report of the last zones of a SAS drive for example). Since blkdev_report_zones() handles report zone command processing in a loop until completion (no more zones are being reported), we can safely avoid that the block layer performs an incorrect bio_advance() call and restart of the remainder of incomplete report zone BIOs. To do so, always indicate a full completion of REQ_OP_ZONE_REPORT by setting good_bytes to the request buffer size and by setting the command resid to 0. This does not affect the post processing of the report zone reply done by sd_zbc_complete() since the reply header indicates the number of zones reported. Fixes: 89d947561077 ("sd: Implement support for ZBC devices") Cc: # 4.19 Cc: # 4.14 Signed-off-by: Masato Suzuki Reviewed-by: Damien Le Moal Acked-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/sd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1981,9 +1981,13 @@ static int sd_done(struct scsi_cmnd *SCp } break; case REQ_OP_ZONE_REPORT: + /* To avoid that the block layer performs an incorrect + * bio_advance() call and restart of the remainder of + * incomplete report zone BIOs, always indicate a full + * completion of REQ_OP_ZONE_REPORT. + */ if (!result) { - good_bytes = scsi_bufflen(SCpnt) - - scsi_get_resid(SCpnt); + good_bytes = scsi_bufflen(SCpnt); scsi_set_resid(SCpnt, 0); } else { good_bytes = 0;