Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp4626729ybc; Tue, 26 Nov 2019 11:56:20 -0800 (PST) X-Google-Smtp-Source: APXvYqyTDlxGOvo6EjMJSDPgKJEBjsSPb/Ro1SW0FQ4qaKMlb2tXM47FJfqJjHB+rPEgGY7Piuwb X-Received: by 2002:a17:906:1fd5:: with SMTP id e21mr43751022ejt.320.1574798180083; Tue, 26 Nov 2019 11:56:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574798180; cv=none; d=google.com; s=arc-20160816; b=dqcLRbYLqeaprYYMLT2oCH6l053eHpKAkWtDDHJs/5gqSPPTQGTO5KqExTB4HAvgBy 5Iv78Rc9rNwYDcxaWT1gcTNfVyxLRzn/EnL+zOLQSONQw2yrLRbBlMUNpB9gR8CDvysl HcoDhUjoKTprk+gmFPYv//GsLZaR5VbPDnBZR20QRxeJ5qEKdPAHwcUDU/O0gM+rWWoC jnvWgPIy+4HZ+fedoPpepJu18ZdjO2i4N7T4tpF1Nhd0GJOpJVXqNTrPGIKpsK+5k9DE w9jsDWJ/9oqrW3D+rLzvbcmH+jgOUwd4tuK5afd/8DO9MXIZPHM820uFxFClHU0b5Mbv pNiw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=vdehyL3BzFqcwpfJw0zozr23K7gtdCPt/5pcIxiHph4=; b=RPxAa7Z/+Cc1lisivBxFODtdihYn08OhKiTDn/v0cbbYKgn+ZsvrV59BRTfwB2ngU9 J4nNL0VuudPIZTzp1ykvLPWDVEKl/fo8EK/8L15RHh7rU4RW78LBc1vEHU6OD1quBTCy 3S/DuFa7Dlu4+2Mw9eosfFBR0mBp/Gyx8xHpei6eejS/eQ59erpTbnBa5KUz2ZoiKwDS n2DzdSqstFtbVjQOWsvBAliwjB6MpES0L+/2gTVvleqHn4tUZRarbxmI6xhCxI6ofEkC As7sjNwi3xp3AeR4S+3Bujd5Vl7tyJlPN5WrqC83WM3uZBHARKL1csEElCyNEyOv4rJh wzJA== 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 30si9169230edr.9.2019.11.26.11.55.56; Tue, 26 Nov 2019 11:56:20 -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; 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 S1727188AbfKZTyw (ORCPT + 99 others); Tue, 26 Nov 2019 14:54:52 -0500 Received: from mx2.suse.de ([195.135.220.15]:40502 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726618AbfKZTyu (ORCPT ); Tue, 26 Nov 2019 14:54:50 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 3E5CAAD26; Tue, 26 Nov 2019 19:54:47 +0000 (UTC) From: Michal Suchanek To: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org Cc: Michal Suchanek , Jonathan Corbet , Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" , Alexander Viro , Eric Biggers , "J. Bruce Fields" , Mauro Carvalho Chehab , Benjamin Coddington , Ming Lei , Chaitanya Kulkarni , Bart Van Assche , Damien Le Moal , Hou Tao , Pavel Begunkov , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Jan Kara , Hannes Reinecke , "Ewan D. Milne" , Christoph Hellwig , Matthew Wilcox Subject: [PATCH v4 rebase 10/10] scsi: sr: wait for the medium to become ready Date: Tue, 26 Nov 2019 20:54:29 +0100 Message-Id: <16e56013bf54485a98af855deddb660ade2136b8.1574797504.git.msuchanek@suse.de> X-Mailer: git-send-email 2.23.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the autoclose function provided by cdrom driver to wait for drive to close in open_finish, and attempt to open once more after the door closes. Signed-off-by: Michal Suchanek --- v3: use function call rather than IOCTL v4: fix reference leak on -ENXIO --- drivers/scsi/sr.c | 54 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 07c319494bf4..41ddf08b4c7b 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -522,29 +522,58 @@ static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt) return ret; } -static int sr_block_open(struct block_device *bdev, fmode_t mode) +static int __sr_block_open(struct block_device *bdev, fmode_t mode) { - struct scsi_cd *cd; - struct scsi_device *sdev; - int ret = -ENXIO; - - cd = scsi_cd_get(bdev->bd_disk); - if (!cd) - goto out; + struct scsi_cd *cd = scsi_cd(bdev->bd_disk); + int ret; - sdev = cd->device; - scsi_autopm_get_device(sdev); check_disk_change(bdev); mutex_lock(&sr_mutex); ret = cdrom_open(&cd->cdi, bdev, mode); mutex_unlock(&sr_mutex); + return ret; +} + +static int sr_block_open(struct block_device *bdev, fmode_t mode) +{ + struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk); + struct scsi_device *sdev; + int ret; + + if (!cd) + return -ENXIO; + + sdev = cd->device; + scsi_autopm_get_device(sdev); + ret = __sr_block_open(bdev, mode); scsi_autopm_put_device(sdev); - if (ret) + + if ((ret == -ERESTARTSYS) || (ret == -ENXIO)) scsi_cd_put(cd); -out: + return ret; +} + +static int sr_block_open_finish(struct block_device *bdev, fmode_t mode, + int ret) +{ + struct scsi_cd *cd = scsi_cd(bdev->bd_disk); + + /* wait for drive to get ready */ + if ((ret == -ENOMEDIUM) && !(mode & FMODE_NDELAY)) { + struct scsi_device *sdev = cd->device; + /* + * Cannot use sr_block_ioctl because it locks sr_mutex blocking + * out any processes trying to access the drive + */ + scsi_autopm_get_device(sdev); + cdrom_autoclose(&cd->cdi); + ret = __sr_block_open(bdev, mode); + scsi_autopm_put_device(sdev); + } + return ret; } @@ -640,6 +669,7 @@ static const struct block_device_operations sr_bdops = { .owner = THIS_MODULE, .open = sr_block_open, + .open_finish = sr_block_open_finish, .release = sr_block_release, .ioctl = sr_block_ioctl, .check_events = sr_block_check_events, -- 2.23.0