Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp801771pxb; Tue, 3 Nov 2020 12:57:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJxi85xV90R2DrILqyYeXeEQ0vSjEE3h4Y3EateoJciwfeh28ASZXIM9uDy6FjGY7z5WegI2 X-Received: by 2002:a50:8064:: with SMTP id 91mr1696283eda.172.1604437033749; Tue, 03 Nov 2020 12:57:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604437033; cv=none; d=google.com; s=arc-20160816; b=AFyEGRjspcM9Q7Jy6c9fUXOHOBrnv4xUY6npENJPdfY3EPchTywRetKXoT3JwcHngT FVEJUqdl5RXXJ2RygB5cEDkYq2YQ4uSTQCGTlz3u6VlEYhlxQrdV75cJplyI+P21Q1sw nz1iNlPDNW19gsv9dqXmUU4vc3HPNKmTA/iAKogLQA+ygBkyviV1oWYdYK64nc0MAXRV kZ1vYDJOMtk4PBkN5ybGzC8EGzxqswlZrIlCS1c78Z6BElkwYC2xE7rhyH6QaSDywrHH ZOnvusME2Djiutbc2OOIo1cyiGbGYzvhXqmHQLb9ZVDy+ZMMDgCEGQ+wIeDhSGi5owD9 qKOA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=r+Fo1x+MXhUF6Lhe+8jbhVjmkMPGumFiBvq7qDBmVOg=; b=zaCXUBI0ujFskdqzBDh2ZZfHAa6UF3HdxFF8abHTqG48Oo2ULhkXp247oXd85jmNBs H0hZp7i3uwEBa6+d8fGArTUMcfHDLQOn2hCrvLhW5NzFK3u453224926VrR3gl3S0Qdd DvZVP64mESGB1f2s/TMS6G+9hx/WYXgX8/6OHSrjbQD52r0Q4kjt08E5v7+cjRSkZmpj tquNkuKHiDEzlHW+rKL7bwJzB8dyaZ6Iy1rrGUWpwY/TajuR/iH9s7OyT9l5X0V9rQek oOK2oSVXufzi1fUGye+aGq/oKiwBLPjAZqtDw8HbY+aAxrXInm27GFqtntzy2RZOuN77 EwdA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=feT9GuMe; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l19si11239044edr.128.2020.11.03.12.56.50; Tue, 03 Nov 2020 12:57:13 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=feT9GuMe; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732040AbgKCUwH (ORCPT + 99 others); Tue, 3 Nov 2020 15:52:07 -0500 Received: from mail.kernel.org ([198.145.29.99]:48138 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732033AbgKCUwF (ORCPT ); Tue, 3 Nov 2020 15:52:05 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 15B8D2071E; Tue, 3 Nov 2020 20:52:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1604436724; bh=qel/IkwRvO6XCYXxbcDTBAZGsaf0ynC01QjhCLa9Pxw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=feT9GuMeXHBNWY1DGYwf9451evkE3OY5AVfceaf5ofJErxeShmKLcwUQ6BqT2TXwZ 4bmhZlMOKhalPsSKXSnl21Ko7CdPVcXTVV4olpV+bWyRLeZZynogoUWdA3hHB8rk1v rF7meHGyn8nmx8bNCK38EBWBLAlIqEJDY2/njZcc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kanchan Joshi , Damien Le Moal , Jens Axboe Subject: [PATCH 5.9 374/391] null_blk: synchronization fix for zoned device Date: Tue, 3 Nov 2020 21:37:05 +0100 Message-Id: <20201103203412.385651316@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201103203348.153465465@linuxfoundation.org> References: <20201103203348.153465465@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kanchan Joshi commit 35bc10b2eafbb701064b94f283b77c54d3304842 upstream. Parallel write,read,zone-mgmt operations accessing/altering zone state and write-pointer may get into race. Avoid the situation by using a new spinlock for zoned device. Concurrent zone-appends (on a zone) returning same write-pointer issue is also avoided using this lock. Cc: stable@vger.kernel.org Fixes: e0489ed5daeb ("null_blk: Support REQ_OP_ZONE_APPEND") Signed-off-by: Kanchan Joshi Reviewed-by: Damien Le Moal Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- drivers/block/null_blk.h | 1 + drivers/block/null_blk_zoned.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) --- a/drivers/block/null_blk.h +++ b/drivers/block/null_blk.h @@ -44,6 +44,7 @@ struct nullb_device { unsigned int nr_zones; struct blk_zone *zones; sector_t zone_size_sects; + spinlock_t zone_lock; unsigned long size; /* device size in MB */ unsigned long completion_nsec; /* time in ns to complete a request */ --- a/drivers/block/null_blk_zoned.c +++ b/drivers/block/null_blk_zoned.c @@ -45,6 +45,7 @@ int null_init_zoned_dev(struct nullb_dev if (!dev->zones) return -ENOMEM; + spin_lock_init(&dev->zone_lock); if (dev->zone_nr_conv >= dev->nr_zones) { dev->zone_nr_conv = dev->nr_zones - 1; pr_info("changed the number of conventional zones to %u", @@ -131,8 +132,11 @@ int null_report_zones(struct gendisk *di * So use a local copy to avoid corruption of the device zone * array. */ + spin_lock_irq(&dev->zone_lock); memcpy(&zone, &dev->zones[first_zone + i], sizeof(struct blk_zone)); + spin_unlock_irq(&dev->zone_lock); + error = cb(&zone, i, data); if (error) return error; @@ -277,18 +281,28 @@ static blk_status_t null_zone_mgmt(struc blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd, enum req_opf op, sector_t sector, sector_t nr_sectors) { + blk_status_t sts; + struct nullb_device *dev = cmd->nq->dev; + + spin_lock_irq(&dev->zone_lock); switch (op) { case REQ_OP_WRITE: - return null_zone_write(cmd, sector, nr_sectors, false); + sts = null_zone_write(cmd, sector, nr_sectors, false); + break; case REQ_OP_ZONE_APPEND: - return null_zone_write(cmd, sector, nr_sectors, true); + sts = null_zone_write(cmd, sector, nr_sectors, true); + break; case REQ_OP_ZONE_RESET: case REQ_OP_ZONE_RESET_ALL: case REQ_OP_ZONE_OPEN: case REQ_OP_ZONE_CLOSE: case REQ_OP_ZONE_FINISH: - return null_zone_mgmt(cmd, op, sector); + sts = null_zone_mgmt(cmd, op, sector); + break; default: - return null_process_cmd(cmd, op, sector, nr_sectors); + sts = null_process_cmd(cmd, op, sector, nr_sectors); } + spin_unlock_irq(&dev->zone_lock); + + return sts; }