From patchwork Wed Apr 4 17:53:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bart Van Assche X-Patchwork-Id: 10322985 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 48C156032A for ; Wed, 4 Apr 2018 17:53:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 38C1E28F7C for ; Wed, 4 Apr 2018 17:53:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2C9D028F8F; Wed, 4 Apr 2018 17:53:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 89AF928F7C for ; Wed, 4 Apr 2018 17:53:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751307AbeDDRx4 (ORCPT ); Wed, 4 Apr 2018 13:53:56 -0400 Received: from esa4.hgst.iphmx.com ([216.71.154.42]:8943 "EHLO esa4.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750890AbeDDRx4 (ORCPT ); Wed, 4 Apr 2018 13:53:56 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1522864437; x=1554400437; h=from:to:cc:subject:date:message-id; bh=SnrP0sHTE1ZF6q8ydVg3FnqH2bObvOmXvDCUFTwpo9c=; b=fHPx4XZ/DaSngtzwH+KJOkvOdk0OOFm8plrkFkrHJy5DOgP6YaRGZwKt W5Pv8ET1hJDYcoVllGimr6sFSIKA6p7W1gOdgQS9LW7cN0tTZ75qo7zQ+ 1tF+TaOUxqUqyS4COfzIAdZ5EcLIYY6sEOlgJBMVIVKHrF/uVXeC7+JcC ASMLqTmqTbmj7a2GTr4wnK6ReBwq5EldS3dwpvhrwzdKQS8VNGOoM2ynS /LfGTCvCKRgt6PDneF5+tyThe/oItASiC7HDCAAEmyeuBEV2fxiujeeVR kTh+A+S0EncrZHtd3E49ryY4QZWJxyoGY29iZGPeUOAY2ZSebxhJOAA0+ A==; X-IronPort-AV: E=Sophos;i="5.48,407,1517846400"; d="scan'208";a="75118565" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 05 Apr 2018 01:53:56 +0800 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP; 04 Apr 2018 10:46:50 -0700 Received: from thinkpad-bart.sdcorp.global.sandisk.com (HELO thinkpad-bart.int.fusionio.com) ([10.11.171.236]) by uls-op-cesaip02.wdc.com with ESMTP; 04 Apr 2018 10:53:56 -0700 From: Bart Van Assche To: "Martin K . Petersen" , "James E . J . Bottomley" Cc: linux-scsi@vger.kernel.org, Bart Van Assche , Hannes Reinecke , Douglas Gilbert , Damien Le Moal , Christoph Hellwig , stable@vger.kernel.org Subject: [PATCH v2] Fix DID_OK handling in __scsi_error_from_host_byte() Date: Wed, 4 Apr 2018 10:53:55 -0700 Message-Id: <20180404175355.15982-1-bart.vanassche@wdc.com> X-Mailer: git-send-email 2.16.2 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Commit e39a97353e53 modified __scsi_error_from_host_byte() such that that function translates DID_OK into BLK_STS_OK. However, the description of that commit is wrong: it mentions that commit 2a842acab109 introduced a bug in __scsi_error_from_host_byte() although that commit did not change the behavior of that function. Additionally, commit e39a97353e53 introduced a severe bug: it causes commands that fail with hostbyte=DID_OK and driverbyte=DRIVER_SENSE to be completed with BLK_STS_OK. Fix __scsi_error_from_host_byte() by only translating good status values into BLK_STS_OK. Fixes: e39a97353e53 ("scsi: core: return BLK_STS_OK for DID_OK in __scsi_error_from_host_byte()") Reported-by: Damien Le Moal Signed-off-by: Bart Van Assche Cc: Hannes Reinecke Cc: Douglas Gilbert Cc: Damien Le Moal Cc: Christoph Hellwig Cc: stable@vger.kernel.org Reviewed-by: Douglas Gilbert Reviewed-by: Lee Duncan Tested-by: Damien Le Moal --- Changes compared to v1: - Modified __scsi_error_from_host_byte() such that it again returns BLK_STS_OK for CONDITION MET and other result codes that represent success. drivers/scsi/scsi_lib.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 74a39db57d49..1496b34af409 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -736,7 +736,13 @@ static blk_status_t __scsi_error_from_host_byte(struct scsi_cmnd *cmd, { switch (host_byte(result)) { case DID_OK: - return BLK_STS_OK; + /* + * Also check the other bytes than the status byte in result + * to handle the case when a SCSI LLD sets result to + * DRIVER_SENSE << 24 without setting SAM_STAT_CHECK_CONDITION. + */ + return scsi_status_is_good(result) && (result & ~0xff) == 0 ? + BLK_STS_OK : BLK_STS_IOERR; case DID_TRANSPORT_FAILFAST: return BLK_STS_TRANSPORT; case DID_TARGET_FAILURE: