Received: by 10.192.165.156 with SMTP id m28csp20950imm; Tue, 10 Apr 2018 15:32:08 -0700 (PDT) X-Google-Smtp-Source: AIpwx48/fF4tGVr3Izq0U5UEF2Pl94fdMWYieH37es+Rl58W6bNFuOe+xJU+kyjjy+WiCYktTTBh X-Received: by 10.101.88.140 with SMTP id d12mr1554863pgu.408.1523399528035; Tue, 10 Apr 2018 15:32:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523399527; cv=none; d=google.com; s=arc-20160816; b=kk1ttSrdg9IdFZsdweBkhgGtn2jmUJBrNDpPeny8IC85gU6VRzkdog04hpXjBvASyR qTLExa6wEzNdlCtHATCD5pOd/C82ccr5ye2ZyXBbwvBeDFtQEO5T1ejvXCwSR2Vk4dI7 MGk3b24hwmP3Qwf4wfPFoyutq6veDpBCHfgo/wU/pOUcL65sGg4hR8yUxFR9WGLVCi4e 7rjHi2BilcoLHzVWNdpqrMwa0DUwVIkPdgyPpqSiIL644S7Q3Emzv05UDYp4Ev2C4Iup BS203ARxPfFT9ukHryXICdIibg76NY9CTxXJ1JNJ8MKIxz3Mc4AgMhp6rkodIjkW26T4 GdAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=wQZSy+ye6Ad1xcrcZF6IyjYDJ6L1zFkibUYeg7W5CEs=; b=ARVvGXPmEbCMK8Ique+6aQINNG2Nw3w7c2FVP2tnVDx3SqWGX9hDD16XjgIX9LFjJi FNBQ9vVMP0ku+Qy/IXh3/Z6bLx3u/TAEKPBXxhUkPL39OtPUxWwurAFOzSy6e3SGh8fk 0cxxWNmJW0lS1300cj3zdFPiwAeqB51rNfjyo6Zgw7qLR7vPbjhee/75KFfYg8FZsi9W m/Km7D6GEwhX7PnRzbMIN+S8fnI3klpl3hteCqtNetOZhzCY1fPKro0QgXp0nkpcIqEg C8RO1hUUgfzDpZXypq0AO7mSFiMu8DDErlAT7igAyhBtwMDNoNentRZvtDLyJO5pCTUi 3VgQ== ARC-Authentication-Results: i=1; mx.google.com; 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 y70si2851190pfg.121.2018.04.10.15.31.31; Tue, 10 Apr 2018 15:32:07 -0700 (PDT) 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; 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 S1753745AbeDJW1e (ORCPT + 99 others); Tue, 10 Apr 2018 18:27:34 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:37890 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753713AbeDJW1b (ORCPT ); Tue, 10 Apr 2018 18:27:31 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 98840CC4; Tue, 10 Apr 2018 22:27:30 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chaitra P B , Suganath Prabu S , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 4.15 041/168] scsi: mpt3sas: Proper handling of set/clear of "ATA command pending" flag. Date: Wed, 11 Apr 2018 00:23:03 +0200 Message-Id: <20180410212801.945729289@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180410212800.144079021@linuxfoundation.org> References: <20180410212800.144079021@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: Chaitra P B [ Upstream commit f49d4aed1315a7b766d855f1367142e682b0cc87 ] 1. In IO path, setting of "ATA command pending" flag early before device removal, invalid device handle etc., checks causes any new commands to be always returned with SAM_STAT_BUSY and when the driver removes the drive the SML issues SYNC Cache command and that command is always returned with SAM_STAT_BUSY and thus making SYNC Cache command to requeued. 2. If the driver gets an ATA PT command for a SATA drive then the driver set "ATA command pending" flag in device specific data structure not to allow any further commands until the ATA PT command is completed. However, after setting the flag if the driver decides to return the command back to upper layers without actually issuing to the firmware (i.e., returns from qcmd failure return paths) then the corresponding flag is not cleared and this prevents the driver from sending any new commands to the drive. This patch fixes above two issues by setting of "ATA command pending" flag after checking for whether device deleted, invalid device handle, device busy with task management. And by setting "ATA command pending" flag to false in all of the qcmd failure return paths after setting the flag. Signed-off-by: Chaitra P B Signed-off-by: Suganath Prabu S Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c @@ -4761,19 +4761,6 @@ scsih_qcmd(struct Scsi_Host *shost, stru return 0; } - /* - * Bug work around for firmware SATL handling. The loop - * is based on atomic operations and ensures consistency - * since we're lockless at this point - */ - do { - if (test_bit(0, &sas_device_priv_data->ata_command_pending)) { - scmd->result = SAM_STAT_BUSY; - scmd->scsi_done(scmd); - return 0; - } - } while (_scsih_set_satl_pending(scmd, true)); - sas_target_priv_data = sas_device_priv_data->sas_target; /* invalid device handle */ @@ -4799,6 +4786,19 @@ scsih_qcmd(struct Scsi_Host *shost, stru sas_device_priv_data->block) return SCSI_MLQUEUE_DEVICE_BUSY; + /* + * Bug work around for firmware SATL handling. The loop + * is based on atomic operations and ensures consistency + * since we're lockless at this point + */ + do { + if (test_bit(0, &sas_device_priv_data->ata_command_pending)) { + scmd->result = SAM_STAT_BUSY; + scmd->scsi_done(scmd); + return 0; + } + } while (_scsih_set_satl_pending(scmd, true)); + if (scmd->sc_data_direction == DMA_FROM_DEVICE) mpi_control = MPI2_SCSIIO_CONTROL_READ; else if (scmd->sc_data_direction == DMA_TO_DEVICE) @@ -4826,6 +4826,7 @@ scsih_qcmd(struct Scsi_Host *shost, stru if (!smid) { pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n", ioc->name, __func__); + _scsih_set_satl_pending(scmd, false); goto out; } mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); @@ -4857,6 +4858,7 @@ scsih_qcmd(struct Scsi_Host *shost, stru pcie_device = sas_target_priv_data->pcie_dev; if (ioc->build_sg_scmd(ioc, scmd, smid, pcie_device)) { mpt3sas_base_free_smid(ioc, smid); + _scsih_set_satl_pending(scmd, false); goto out; } } else