From patchwork Wed Apr 8 19:44:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480709 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1B6C192A for ; Wed, 8 Apr 2020 19:44:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D7E5B2075E for ; Wed, 8 Apr 2020 19:44:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="uA3NBa5j" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729134AbgDHTop (ORCPT ); Wed, 8 Apr 2020 15:44:45 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40568 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726795AbgDHTop (ORCPT ); Wed, 8 Apr 2020 15:44:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=zaiVVn26POc3v9EheIrbbUfgKHpxYPyAv21MH+M1N7Y=; b=uA3NBa5jwXGt8OOvlAv0cZL6Tt MSRvGcvla4/LNjOGonN8XWF1hdIF9692+uAQZZZFCqzKCCxwot5tkoDuBYX4oU9go2i4q/qOT7ocv fVwSdakhjCI4NLpCoVOcwj0pmOcYIQJUyCDeK+yO4S9piGtzmcxOZqljjBL0SRMsK1WR2KkHLs8uw OIHTSuQASC+/euKmvUJ/ugJadN56wWEx13CrEnt243cJVubL5Eg3KX4gfOZwIOVtrPjVPQgRifncZ 70Nklwc+y3YBbpJc7CduxngpNPHll8Bgk+XxuQeZxnnUKGV15+0gDoArJvTI31qw1ASbwsqQG6uDG ogyReXSQ==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGct-0004GS-VM; Wed, 08 Apr 2020 19:44:44 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 01/10] block: refactor blkpg_ioctl Date: Wed, 8 Apr 2020 21:44:30 +0200 Message-Id: <20200408194439.1580699-2-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Split each sub-command out into a separate helper, and move those helpers to block/partitions/core.c instead of having a lot of partition manipulation logic open coded in block/ioctl.c. Signed-off-by: Christoph Hellwig bd_disk; if (bdev != bdev->bd_contains) return -EINVAL; - partno = p.pno; - if (partno <= 0) + + if (p.pno <= 0) return -EINVAL; + + if (op == BLKPG_DEL_PARTITION) + return bdev_del_partition(bdev, p.pno); + + start = p.start >> SECTOR_SHIFT; + length = p.length >> SECTOR_SHIFT; + + /* check for fit in a hd_struct */ + if (sizeof(sector_t) < sizeof(long long)) { + long pstart = start, plength = length; + + if (pstart != start || plength != length || pstart < 0 || + plength < 0 || p.pno > 65535) + return -EINVAL; + } + switch (op) { - case BLKPG_ADD_PARTITION: - start = p.start >> 9; - length = p.length >> 9; - /* check for fit in a hd_struct */ - if (sizeof(sector_t) == sizeof(long) && - sizeof(long long) > sizeof(long)) { - long pstart = start, plength = length; - if (pstart != start || plength != length - || pstart < 0 || plength < 0 || partno > 65535) - return -EINVAL; - } - /* check if partition is aligned to blocksize */ - if (p.start & (bdev_logical_block_size(bdev) - 1)) - return -EINVAL; - - mutex_lock(&bdev->bd_mutex); - - /* overlap? */ - disk_part_iter_init(&piter, disk, - DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) { - if (!(start + length <= part->start_sect || - start >= part->start_sect + part->nr_sects)) { - disk_part_iter_exit(&piter); - mutex_unlock(&bdev->bd_mutex); - return -EBUSY; - } - } - disk_part_iter_exit(&piter); - - /* all seems OK */ - part = add_partition(disk, partno, start, length, - ADDPART_FLAG_NONE, NULL); - mutex_unlock(&bdev->bd_mutex); - return PTR_ERR_OR_ZERO(part); - case BLKPG_DEL_PARTITION: - part = disk_get_part(disk, partno); - if (!part) - return -ENXIO; - - bdevp = bdget(part_devt(part)); - disk_put_part(part); - if (!bdevp) - return -ENOMEM; - - mutex_lock(&bdevp->bd_mutex); - if (bdevp->bd_openers) { - mutex_unlock(&bdevp->bd_mutex); - bdput(bdevp); - return -EBUSY; - } - /* all seems OK */ - fsync_bdev(bdevp); - invalidate_bdev(bdevp); - - mutex_lock_nested(&bdev->bd_mutex, 1); - delete_partition(disk, partno); - mutex_unlock(&bdev->bd_mutex); - mutex_unlock(&bdevp->bd_mutex); - bdput(bdevp); - - return 0; - case BLKPG_RESIZE_PARTITION: - start = p.start >> 9; - /* new length of partition in bytes */ - length = p.length >> 9; - /* check for fit in a hd_struct */ - if (sizeof(sector_t) == sizeof(long) && - sizeof(long long) > sizeof(long)) { - long pstart = start, plength = length; - if (pstart != start || plength != length - || pstart < 0 || plength < 0) - return -EINVAL; - } - part = disk_get_part(disk, partno); - if (!part) - return -ENXIO; - bdevp = bdget(part_devt(part)); - if (!bdevp) { - disk_put_part(part); - return -ENOMEM; - } - mutex_lock(&bdevp->bd_mutex); - mutex_lock_nested(&bdev->bd_mutex, 1); - if (start != part->start_sect) { - mutex_unlock(&bdevp->bd_mutex); - mutex_unlock(&bdev->bd_mutex); - bdput(bdevp); - disk_put_part(part); - return -EINVAL; - } - /* overlap? */ - disk_part_iter_init(&piter, disk, - DISK_PITER_INCL_EMPTY); - while ((lpart = disk_part_iter_next(&piter))) { - if (lpart->partno != partno && - !(start + length <= lpart->start_sect || - start >= lpart->start_sect + lpart->nr_sects) - ) { - disk_part_iter_exit(&piter); - mutex_unlock(&bdevp->bd_mutex); - mutex_unlock(&bdev->bd_mutex); - bdput(bdevp); - disk_put_part(part); - return -EBUSY; - } - } - disk_part_iter_exit(&piter); - part_nr_sects_write(part, (sector_t)length); - i_size_write(bdevp->bd_inode, p.length); - mutex_unlock(&bdevp->bd_mutex); - mutex_unlock(&bdev->bd_mutex); - bdput(bdevp); - disk_put_part(part); - return 0; - default: + case BLKPG_ADD_PARTITION: + /* check if partition is aligned to blocksize */ + if (p.start & (bdev_logical_block_size(bdev) - 1)) return -EINVAL; + return bdev_add_partition(bdev, p.pno, start, length); + case BLKPG_DEL_PARTITION: + return bdev_resize_partition(bdev, p.pno, start, length); + default: + return -EINVAL; } } diff --git a/block/partitions/core.c b/block/partitions/core.c index 1a0a829d8416..7577bdba3b2b 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -335,7 +335,7 @@ static DEVICE_ATTR(whole_disk, 0444, whole_disk_show, NULL); * Must be called either with bd_mutex held, before a disk can be opened or * after all disk users are gone. */ -struct hd_struct *add_partition(struct gendisk *disk, int partno, +static struct hd_struct *add_partition(struct gendisk *disk, int partno, sector_t start, sector_t len, int flags, struct partition_meta_info *info) { @@ -472,6 +472,119 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, return ERR_PTR(err); } +static bool partition_overlaps(struct gendisk *disk, sector_t start, + sector_t length, int skip_partno) +{ + struct disk_part_iter piter; + struct hd_struct *part; + bool overlap = false; + + disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); + while ((part = disk_part_iter_next(&piter))) { + if (part->partno == skip_partno || + start >= part->start_sect + part->nr_sects || + start + length <= part->start_sect) + continue; + overlap = true; + break; + } + + disk_part_iter_exit(&piter); + return overlap; +} + +int bdev_add_partition(struct block_device *bdev, int partno, + sector_t start, sector_t length) +{ + struct hd_struct *part; + + mutex_lock(&bdev->bd_mutex); + if (partition_overlaps(bdev->bd_disk, start, length, -1)) { + mutex_unlock(&bdev->bd_mutex); + return -EBUSY; + } + + part = add_partition(bdev->bd_disk, partno, start, length, + ADDPART_FLAG_NONE, NULL); + mutex_unlock(&bdev->bd_mutex); + return PTR_ERR_OR_ZERO(part); +} + +int bdev_del_partition(struct block_device *bdev, int partno) +{ + struct block_device *bdevp; + struct hd_struct *part; + int ret = 0; + + part = disk_get_part(bdev->bd_disk, partno); + if (!part) + return -ENXIO; + + bdevp = bdget(part_devt(part)); + disk_put_part(part); + if (!bdevp) + return -ENOMEM; + + mutex_lock(&bdevp->bd_mutex); + + ret = -EBUSY; + if (bdevp->bd_openers) + goto out_unlock; + + fsync_bdev(bdevp); + invalidate_bdev(bdevp); + + mutex_lock_nested(&bdev->bd_mutex, 1); + delete_partition(bdev->bd_disk, partno); + mutex_unlock(&bdev->bd_mutex); + + ret = 0; +out_unlock: + mutex_unlock(&bdevp->bd_mutex); + bdput(bdevp); + return ret; +} + +int bdev_resize_partition(struct block_device *bdev, int partno, + sector_t start, sector_t length) +{ + struct block_device *bdevp; + struct hd_struct *part; + int ret = 0; + + part = disk_get_part(bdev->bd_disk, partno); + if (!part) + return -ENXIO; + + ret = -ENOMEM; + bdevp = bdget(part_devt(part)); + if (!bdevp) + goto out_put_part; + + mutex_lock(&bdevp->bd_mutex); + mutex_lock_nested(&bdev->bd_mutex, 1); + + ret = -EINVAL; + if (start != part->start_sect) + goto out_unlock; + + ret = -EBUSY; + if (partition_overlaps(bdev->bd_disk, start, length, partno)) + goto out_unlock; + + part_nr_sects_write(part, (sector_t)length); + i_size_write(bdevp->bd_inode, length << SECTOR_SHIFT); + + ret = 0; +out_unlock: + mutex_unlock(&bdevp->bd_mutex); + mutex_unlock(&bdev->bd_mutex); + bdput(bdevp); +out_put_part: + disk_put_part(part); + return ret; +} + static bool disk_unlock_native_capacity(struct gendisk *disk) { const struct block_device_operations *bdops = disk->fops; From patchwork Wed Apr 8 19:44:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480711 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4530C92A for ; Wed, 8 Apr 2020 19:44:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 20B102075E for ; Wed, 8 Apr 2020 19:44:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="n3g19FCc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726795AbgDHTos (ORCPT ); Wed, 8 Apr 2020 15:44:48 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40578 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729382AbgDHTor (ORCPT ); Wed, 8 Apr 2020 15:44:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=eMgjMncEKgAqWJyPyH1vyyn2QVvReCcuhgzuxnNDQW0=; b=n3g19FCcdIpv/YytL0yLLzLPUe pe2LGDmDj4ZcIuHqHbC+VDAPsVjc0hRJCBegrKVCd3bA3dOn4mCQgqw2IGiu8P4VBwg38Lc+oYUtn sAWXKQjEBiaN87RZasDq3vzV3GlkdOpLaXM0KlvFTKVz7vKc5b4wZy5VmJfH8bWKS4VPm0ikDqN++ 7ZKTOmPYoHANtanYglOWrBM0hXmNHkF5012Eodxm2X/bq5Cim3AGAVpcNvyiQk6ps2qcKdHCD35Pv Tw3M1Xo+YXmiC6GUu0ZHotlKvuWJH2Sv5KrPKX4HUOezav9f/DGITBtVDFKFgJFeecbrEdE2ze/4G JAoK6/ZA==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGcw-0004Gu-E4; Wed, 08 Apr 2020 19:44:46 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 02/10] block: pass a hd_struct to delete_partition Date: Wed, 8 Apr 2020 21:44:31 +0200 Message-Id: <20200408194439.1580699-3-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org All callers have the hd_strut at hand, so pass it instead of doing another lookup. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/blk.h | 2 +- block/genhd.c | 2 +- block/partitions/core.c | 22 ++++++++-------------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/block/blk.h b/block/blk.h index 305e0ac22bf7..0cbf64108922 100644 --- a/block/blk.h +++ b/block/blk.h @@ -390,7 +390,7 @@ char *disk_name(struct gendisk *hd, int partno, char *buf); #define ADDPART_FLAG_RAID 1 #define ADDPART_FLAG_WHOLEDISK 2 void __delete_partition(struct percpu_ref *ref); -void delete_partition(struct gendisk *disk, int partno); +void delete_partition(struct gendisk *disk, struct hd_struct *part); int bdev_add_partition(struct block_device *bdev, int partno, sector_t start, sector_t length); int bdev_del_partition(struct block_device *bdev, int partno); diff --git a/block/genhd.c b/block/genhd.c index 06b642b23a07..1cc50ad5b191 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -897,7 +897,7 @@ void del_gendisk(struct gendisk *disk) while ((part = disk_part_iter_next(&piter))) { invalidate_partition(disk, part->partno); bdev_unhash_inode(part_devt(part)); - delete_partition(disk, part->partno); + delete_partition(disk, part); } disk_part_iter_exit(&piter); diff --git a/block/partitions/core.c b/block/partitions/core.c index 7577bdba3b2b..0b1b67f50652 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -296,20 +296,12 @@ void __delete_partition(struct percpu_ref *ref) * Must be called either with bd_mutex held, before a disk can be opened or * after all disk users are gone. */ -void delete_partition(struct gendisk *disk, int partno) +void delete_partition(struct gendisk *disk, struct hd_struct *part) { struct disk_part_tbl *ptbl = rcu_dereference_protected(disk->part_tbl, 1); - struct hd_struct *part; - - if (partno >= ptbl->len) - return; - part = rcu_dereference_protected(ptbl->part[partno], 1); - if (!part) - return; - - rcu_assign_pointer(ptbl->part[partno], NULL); + rcu_assign_pointer(ptbl->part[part->partno], NULL); rcu_assign_pointer(ptbl->last_lookup, NULL); kobject_put(part->holder_dir); device_del(part_to_dev(part)); @@ -520,10 +512,10 @@ int bdev_del_partition(struct block_device *bdev, int partno) if (!part) return -ENXIO; + ret = -ENOMEM; bdevp = bdget(part_devt(part)); - disk_put_part(part); if (!bdevp) - return -ENOMEM; + goto out_put_part; mutex_lock(&bdevp->bd_mutex); @@ -535,13 +527,15 @@ int bdev_del_partition(struct block_device *bdev, int partno) invalidate_bdev(bdevp); mutex_lock_nested(&bdev->bd_mutex, 1); - delete_partition(bdev->bd_disk, partno); + delete_partition(bdev->bd_disk, part); mutex_unlock(&bdev->bd_mutex); ret = 0; out_unlock: mutex_unlock(&bdevp->bd_mutex); bdput(bdevp); +out_put_part: + disk_put_part(part); return ret; } @@ -617,7 +611,7 @@ int blk_drop_partitions(struct gendisk *disk, struct block_device *bdev) disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); while ((part = disk_part_iter_next(&piter))) - delete_partition(disk, part->partno); + delete_partition(disk, part); disk_part_iter_exit(&piter); return 0; From patchwork Wed Apr 8 19:44:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480713 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F2E031871 for ; Wed, 8 Apr 2020 19:44:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CFEA620769 for ; Wed, 8 Apr 2020 19:44:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ShjMphoK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730140AbgDHTou (ORCPT ); Wed, 8 Apr 2020 15:44:50 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40590 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729382AbgDHTou (ORCPT ); Wed, 8 Apr 2020 15:44:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=Wml7/xX2IDkCSxaxAQtskneh/deGc50NOSntC92sdYg=; b=ShjMphoK9COXRZM/bzso9hS1UX AdN5i4+iAFiH1gNQ1l1whtCPqtdnm3YP2JaMjqbXLG+5doufa39H1cSgscgknCU9hLzwHBxExEqIk FNm2TucytguFNHLWMXa2NPLFaj8BZOiAv2rgsFDHHYFEamv3jyrx6jNkn1Aq66uHoMz9J8sIcRrzQ slcSRKhSMcbvCk6FQMsNVREdIwdlssUueo9bDWZOBejSLUL3vgXDFI6IJCe9YNu0xtcGh1/eUhlcy bzXYgHWK7omt796ew6g6ybrcRwTdTV6zrgfLklzd1zRalCp43bEPHG/jcjJQTZbdsw1fWsqOAad9h 6B46UcMg==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGcy-0004HP-RA; Wed, 08 Apr 2020 19:44:49 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 03/10] block: cleanup hd_struct freeing Date: Wed, 8 Apr 2020 21:44:32 +0200 Message-Id: <20200408194439.1580699-4-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Move hd_ref_init out of line as there it isn't anywhere near a fast path, and rename the rcu ref freeing callbacks to be more descriptive. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/blk.h | 10 +--------- block/partitions/core.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/block/blk.h b/block/blk.h index 0cbf64108922..b1a0b8cd87f0 100644 --- a/block/blk.h +++ b/block/blk.h @@ -389,7 +389,6 @@ char *disk_name(struct gendisk *hd, int partno, char *buf); #define ADDPART_FLAG_NONE 0 #define ADDPART_FLAG_RAID 1 #define ADDPART_FLAG_WHOLEDISK 2 -void __delete_partition(struct percpu_ref *ref); void delete_partition(struct gendisk *disk, struct hd_struct *part); int bdev_add_partition(struct block_device *bdev, int partno, sector_t start, sector_t length); @@ -397,14 +396,7 @@ int bdev_del_partition(struct block_device *bdev, int partno); int bdev_resize_partition(struct block_device *bdev, int partno, sector_t start, sector_t length); int disk_expand_part_tbl(struct gendisk *disk, int target); - -static inline int hd_ref_init(struct hd_struct *part) -{ - if (percpu_ref_init(&part->ref, __delete_partition, 0, - GFP_KERNEL)) - return -ENOMEM; - return 0; -} +int hd_ref_init(struct hd_struct *part); static inline void hd_struct_get(struct hd_struct *part) { diff --git a/block/partitions/core.c b/block/partitions/core.c index 0b1b67f50652..13d61ed76e0e 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -274,10 +274,10 @@ struct device_type part_type = { .uevent = part_uevent, }; -static void delete_partition_work_fn(struct work_struct *work) +static void hd_struct_free_work(struct work_struct *work) { - struct hd_struct *part = container_of(to_rcu_work(work), struct hd_struct, - rcu_work); + struct hd_struct *part = + container_of(to_rcu_work(work), struct hd_struct, rcu_work); part->start_sect = 0; part->nr_sects = 0; @@ -285,13 +285,21 @@ static void delete_partition_work_fn(struct work_struct *work) put_device(part_to_dev(part)); } -void __delete_partition(struct percpu_ref *ref) +static void hd_struct_free(struct percpu_ref *ref) { struct hd_struct *part = container_of(ref, struct hd_struct, ref); - INIT_RCU_WORK(&part->rcu_work, delete_partition_work_fn); + + INIT_RCU_WORK(&part->rcu_work, hd_struct_free_work); queue_rcu_work(system_wq, &part->rcu_work); } +int hd_ref_init(struct hd_struct *part) +{ + if (percpu_ref_init(&part->ref, hd_struct_free, 0, GFP_KERNEL)) + return -ENOMEM; + return 0; +} + /* * Must be called either with bd_mutex held, before a disk can be opened or * after all disk users are gone. From patchwork Wed Apr 8 19:44:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480715 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 22CB692A for ; Wed, 8 Apr 2020 19:44:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E7AE12075E for ; Wed, 8 Apr 2020 19:44:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="oUAJAqRs" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730142AbgDHTow (ORCPT ); Wed, 8 Apr 2020 15:44:52 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40616 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729382AbgDHTow (ORCPT ); Wed, 8 Apr 2020 15:44:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=CLr8PhWQMR8C43XGb6bzbVdZHVmy/mIdNLhGTpfjDbE=; b=oUAJAqRs7Q0bFEsq+DT4Fbvbls 3j+5MLNlN2c7b35dA1bPaX+7YeylfB0lguHGeUab6y9AccFr/QFDFcQufqZ+01VM537y1NDpGCT1R KdUkuMF22WUQft/qyiWHyI6wh0yl0fRJmE62ICpine+nOq4Z7uVoL341c54i65gstPXMYf9P9c7kK 21BxL9C1URFouD4w7amca1ldCEynizD1ik6jMqZh48Sk1/xuGqWCgcf8x8zcBTzkX9FpKtvCk6/1n cTbhCWskExSry2qC400ARedjtM05xSo5IbUdniWM+cJW09moqVzYHEFZsePSGxU/lbTCiuj2RmUU7 6RSY1BGw==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGd1-0004Hk-9g; Wed, 08 Apr 2020 19:44:51 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 04/10] block: remove hd_struct_kill Date: Wed, 8 Apr 2020 21:44:33 +0200 Message-Id: <20200408194439.1580699-5-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org The function has a single caller, so just open code it. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/blk.h | 5 ----- block/partitions/core.c | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/block/blk.h b/block/blk.h index b1a0b8cd87f0..204963bb03e8 100644 --- a/block/blk.h +++ b/block/blk.h @@ -413,11 +413,6 @@ static inline void hd_struct_put(struct hd_struct *part) percpu_ref_put(&part->ref); } -static inline void hd_struct_kill(struct hd_struct *part) -{ - percpu_ref_kill(&part->ref); -} - static inline void hd_free_part(struct hd_struct *part) { free_part_stats(part); diff --git a/block/partitions/core.c b/block/partitions/core.c index 13d61ed76e0e..f10968b601be 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -321,7 +321,7 @@ void delete_partition(struct gendisk *disk, struct hd_struct *part) * "in-use" until we really free the gendisk. */ blk_invalidate_devt(part_devt(part)); - hd_struct_kill(part); + percpu_ref_kill(&part->ref); } static ssize_t whole_disk_show(struct device *dev, From patchwork Wed Apr 8 19:44:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480717 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 771C492A for ; Wed, 8 Apr 2020 19:44:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 53AEA20768 for ; Wed, 8 Apr 2020 19:44:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="dLowl9zm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730145AbgDHToy (ORCPT ); Wed, 8 Apr 2020 15:44:54 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40682 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729275AbgDHToy (ORCPT ); Wed, 8 Apr 2020 15:44:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=rf3iQYGzID/dQr0pHf8WR5hx65mdh86c4mjP6+mfsPI=; b=dLowl9zmoTau0KkXodCJua834/ X//ClqzwvwwEFC8SM8EqFEkHTbuIJcIu/bYUiq9Q7CJV0lSXs2aDYvDDkz8QenX4cyAUVsj6dhov3 WKjLycOxk1yw4x2k0Gh9A0tmjTclpu72EcjP8PTvhp7RZYu817IAVfvK7fWAkCce6zQLFuQ5I/saq LzYvJT/Zuchy/2K81Rqku5sgioaArE+GVmbfOCYu2StMvGWCQWN1skXWldwn/1XA5F7zRu+O9X3Er HELPtVdIwmbVtRsM9xg+ka7PZk2fbroshTMJlo+3iUWF42VWYL+gULsWVfe+YDkuK4vnSm6QHAAZB Z3/9RunA==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGd3-0004It-ON; Wed, 08 Apr 2020 19:44:54 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 05/10] block: remove the disk argument from blk_drop_partitions Date: Wed, 8 Apr 2020 21:44:34 +0200 Message-Id: <20200408194439.1580699-6-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org The gendisk can be trivially deducted from the block_device. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/partitions/core.c | 10 +++++----- fs/block_dev.c | 2 +- include/linux/genhd.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index f10968b601be..e0ff8a49279f 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -603,23 +603,23 @@ static bool disk_unlock_native_capacity(struct gendisk *disk) } } -int blk_drop_partitions(struct gendisk *disk, struct block_device *bdev) +int blk_drop_partitions(struct block_device *bdev) { struct disk_part_iter piter; struct hd_struct *part; int res; - if (!disk_part_scan_enabled(disk)) + if (!disk_part_scan_enabled(bdev->bd_disk)) return 0; if (bdev->bd_part_count || bdev->bd_openers) return -EBUSY; - res = invalidate_partition(disk, 0); + res = invalidate_partition(bdev->bd_disk, 0); if (res) return res; - disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); + disk_part_iter_init(&piter, bdev->bd_disk, DISK_PITER_INCL_EMPTY); while ((part = disk_part_iter_next(&piter))) - delete_partition(disk, part); + delete_partition(bdev->bd_disk, part); disk_part_iter_exit(&piter); return 0; diff --git a/fs/block_dev.c b/fs/block_dev.c index 52b6f646cdbd..9c8de54fa0c9 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1517,7 +1517,7 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate) lockdep_assert_held(&bdev->bd_mutex); rescan: - ret = blk_drop_partitions(disk, bdev); + ret = blk_drop_partitions(bdev); if (ret) return ret; diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 9b3fffdf4011..058d895544c7 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -339,7 +339,7 @@ extern dev_t blk_lookup_devt(const char *name, int partno); int bdev_disk_changed(struct block_device *bdev, bool invalidate); int blk_add_partitions(struct gendisk *disk, struct block_device *bdev); -int blk_drop_partitions(struct gendisk *disk, struct block_device *bdev); +int blk_drop_partitions(struct block_device *bdev); extern void printk_all_partitions(void); extern struct gendisk *__alloc_disk_node(int minors, int node_id); From patchwork Wed Apr 8 19:44:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480719 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 20D0C112C for ; Wed, 8 Apr 2020 19:44:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F0BC820768 for ; Wed, 8 Apr 2020 19:44:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="QqagxzLH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729275AbgDHTo5 (ORCPT ); Wed, 8 Apr 2020 15:44:57 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40776 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727968AbgDHTo5 (ORCPT ); Wed, 8 Apr 2020 15:44:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=i4bEGtCLQccNYXil7zhdkF5o1S3lZFIBpHM3YttaFak=; b=QqagxzLHO7rnRKv3nqEul7YeDp IPJkAq6+rNJUiTGQcidif0ZgpL+SsXBzW+pmmE2iqzEkLMuGUo7519ZcMExsV19h22JqdJ3yf6DqI a7hdhkAmr2psUKh5zw0HM5EQY+8IGqC71WACi1StZoZkfvYh09/8vflFVoF0aIr0V3rtEaI4zmR8n jlkrQEvSmb2qQoUyY0gDxDFdOiRUa6HtsiFiVvyRVM3iAmEUW7lL+BN+T/Zqm4PsaYTvhSLjkMXkT RcJRy9G3zBtHHrD5NPcWGqspZwVkFUB5sBiuKMkd/Cy72jry4kb852lr9uj5SzT4j48rrVLv2sbVx bgjRj9EA==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGd6-0004Kr-8L; Wed, 08 Apr 2020 19:44:56 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 06/10] dasd: use blk_drop_partitions instead of badly reimplementing it Date: Wed, 8 Apr 2020 21:44:35 +0200 Message-Id: <20200408194439.1580699-7-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Use the blk_drop_partitions function instead of messing around with ioctls that get kernel pointers. For this blk_drop_partitions needs to be exported, which it normally shouldn't - make an exception for s390 only. Signed-off-by: Christoph Hellwig --- block/partitions/core.c | 4 ++++ drivers/s390/block/dasd_genhd.c | 20 ++++---------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index e0ff8a49279f..8a41c25022ab 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -624,6 +624,10 @@ int blk_drop_partitions(struct block_device *bdev) return 0; } +#ifdef CONFIG_S390 +/* for historic reasons in the DASD driver */ +EXPORT_SYMBOL_GPL(blk_drop_partitions); +#endif static bool blk_add_partition(struct gendisk *disk, struct block_device *bdev, struct parsed_partitions *state, int p) diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 7d079154f849..af5b0ecb8f89 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -143,9 +143,6 @@ int dasd_scan_partitions(struct dasd_block *block) */ void dasd_destroy_partitions(struct dasd_block *block) { - /* The two structs have 168/176 byte on 31/64 bit. */ - struct blkpg_partition bpart; - struct blkpg_ioctl_arg barg; struct block_device *bdev; /* @@ -155,19 +152,10 @@ void dasd_destroy_partitions(struct dasd_block *block) bdev = block->bdev; block->bdev = NULL; - /* - * See fs/partition/check.c:delete_partition - * Can't call delete_partitions directly. Use ioctl. - * The ioctl also does locking and invalidation. - */ - memset(&bpart, 0, sizeof(struct blkpg_partition)); - memset(&barg, 0, sizeof(struct blkpg_ioctl_arg)); - barg.data = (void __force __user *) &bpart; - barg.op = BLKPG_DEL_PARTITION; - for (bpart.pno = block->gdp->minors - 1; bpart.pno > 0; bpart.pno--) - ioctl_by_bdev(bdev, BLKPG, (unsigned long) &barg); - - invalidate_partition(block->gdp, 0); + mutex_lock(&bdev->bd_mutex); + blk_drop_partitions(bdev); + mutex_unlock(&bdev->bd_mutex); + /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */ blkdev_put(bdev, FMODE_READ); set_capacity(block->gdp, 0); From patchwork Wed Apr 8 19:44:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480721 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8628F112C for ; Wed, 8 Apr 2020 19:45:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 58CC920768 for ; Wed, 8 Apr 2020 19:45:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="HQrkRVL5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730148AbgDHTo7 (ORCPT ); Wed, 8 Apr 2020 15:44:59 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40820 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727968AbgDHTo7 (ORCPT ); Wed, 8 Apr 2020 15:44:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=gXgklFUzM8WqeF/kVmfPL5DEFYfPnsK4+i73wy067BY=; b=HQrkRVL54iSZ0Aizg5wKt1BL2s SKURkscTE930uqrc9wfrniY8XdQzMwneVenENUAnZcDskyQi6Tq+rbcj680GSB1f/+pbGDfOYjP2V gApwv3e7rgXHPnNGb60y3AlQIk+Pfjf2tjbjfgz8MQ8oMBo7OqncDjdQpKl2fDtaxWlklhPYjxrYg ffstGq96Fji+9QkTA14NL5HNvfbT+YQefIdujgT4RvFsU4a8K72qyV7vmQxRi1/O5xH+pW2OJYlNY pEcCsM1uX8ftyFb1sg5rM5JfVQ2d4pfCZbksMNxBSvMS91OlKuUinw+E5LnUOAYrIoxv7dH0bfY/t LI49zPwg==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGd8-0004Ln-Ms; Wed, 08 Apr 2020 19:44:59 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 07/10] block: don't call invalidate_partition from blk_drop_partitions Date: Wed, 8 Apr 2020 21:44:36 +0200 Message-Id: <20200408194439.1580699-8-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Given that the device must not be busy, most of the calls from invalidate_partition that are related to file system metadata are guranteed to not happen. Just open code the calls to sync_blockdev and invalidate_bdev instead. Signed-off-by: Christoph Hellwig --- block/partitions/core.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index 8a41c25022ab..3fe383adb42a 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -607,15 +607,14 @@ int blk_drop_partitions(struct block_device *bdev) { struct disk_part_iter piter; struct hd_struct *part; - int res; if (!disk_part_scan_enabled(bdev->bd_disk)) return 0; if (bdev->bd_part_count || bdev->bd_openers) return -EBUSY; - res = invalidate_partition(bdev->bd_disk, 0); - if (res) - return res; + + sync_blockdev(bdev); + invalidate_bdev(bdev); disk_part_iter_init(&piter, bdev->bd_disk, DISK_PITER_INCL_EMPTY); while ((part = disk_part_iter_next(&piter))) From patchwork Wed Apr 8 19:44:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480723 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A785F112C for ; Wed, 8 Apr 2020 19:45:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 78ECC20768 for ; Wed, 8 Apr 2020 19:45:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="fe7tcieX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730154AbgDHTpD (ORCPT ); Wed, 8 Apr 2020 15:45:03 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40882 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727968AbgDHTpC (ORCPT ); Wed, 8 Apr 2020 15:45:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=WaFDFRBmbmUN+/BUtSasLo/ufQZePgX56qxKiFzwBwo=; b=fe7tcieX69aREXEJjhPcJeewmF G0iGRY36xLimW2bwx+t3uf9a6t3ra6OAIKG004hrDGmk3fEuORkj5oBDMficlqBDq4ZjCVH2n24Ou VxqpGt+GGMV9QkleV+oEoTqOs8oscGbXuR6xt3t2EGNyJl1GNH/aGakuRkoyXxkEwThQ7Wz+TgXqo tbWK5SbStkaw2VT2bi70dPAYcDHT8bZ/JlvcoKUWdzYRuoD0x6AxxOAn4rdl2t+PLGcxiXnIpVOzH UukwyWVgdxrpEFuiUdEwaH+eX77J9dFtuMK+oHrfkSt0nEJoZczYs/kqmt9t/ueZfGDyC18pSEiyv 7EL2cEAA==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGdB-0004MT-5O; Wed, 08 Apr 2020 19:45:01 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 08/10] block: simplify block device syncing in bdev_del_partition Date: Wed, 8 Apr 2020 21:44:37 +0200 Message-Id: <20200408194439.1580699-9-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org We just checked a little above that the block device for the partition im busy. That implies no file system is mounted, and thus the only thing in fsync_bdev that actually is used is sync_blockdev. Just call sync_blockdev directly. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/partitions/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index 3fe383adb42a..9c402edee4a4 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -531,7 +531,7 @@ int bdev_del_partition(struct block_device *bdev, int partno) if (bdevp->bd_openers) goto out_unlock; - fsync_bdev(bdevp); + sync_blockdev(bdevp); invalidate_bdev(bdevp); mutex_lock_nested(&bdev->bd_mutex, 1); From patchwork Wed Apr 8 19:44:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480725 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 70F53112C for ; Wed, 8 Apr 2020 19:45:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4E1F120768 for ; Wed, 8 Apr 2020 19:45:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="sYm2mUTY" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730158AbgDHTpE (ORCPT ); Wed, 8 Apr 2020 15:45:04 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40900 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730155AbgDHTpE (ORCPT ); Wed, 8 Apr 2020 15:45:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=td9FKDuHu44hBn78rtG6Cx5Jw6iwU7hJjoA7cgQQecE=; b=sYm2mUTY5dAWOxhUzOnHC2iYUq tPcU2omVIVgOcf7G0fRqykx4RCygQtMzcFCu+IrCGO4CFBlR20aOcIbzjqzbfOKvNCf7/19Zo+jSl Jmu4lcYlkodYiMMtYIS+w7CvkfdV5+ywHeKBfRJs71GWRHeVIP8MJqn4CAJTzuRZnuldYG+BkHzT5 5PVxVAaSLP83zJMQ5HKIGvxffMQwfNI6n0Kl7HNfxu396iuW84JImALLTJP1qldDZeObdt3jccTWJ eyzs2aNxdpYHwUcwHWPLVi98clYdQ68L78beZK6W23riel+cDlO98mbNLHVWEg4QYjGwJNYjgazwN QDfAYHaw==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGdD-0004UT-Li; Wed, 08 Apr 2020 19:45:04 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 09/10] block: mark invalidate_partition static Date: Wed, 8 Apr 2020 21:44:38 +0200 Message-Id: <20200408194439.1580699-10-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org invalidate_partition is only used in genhd.c, so mark it static. Also drop the return value given that is is always ignored. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/genhd.c | 27 +++++++++++++-------------- include/linux/fs.h | 1 - 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 1cc50ad5b191..980a4609d4a5 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -878,6 +878,19 @@ void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk) } EXPORT_SYMBOL(device_add_disk_no_queue_reg); +static void invalidate_partition(struct gendisk *disk, int partno) +{ + struct block_device *bdev; + + bdev = bdget_disk(disk, partno); + if (!bdev) + return; + + fsync_bdev(bdev); + __invalidate_device(bdev, true); + bdput(bdev); +} + void del_gendisk(struct gendisk *disk) { struct disk_part_iter piter; @@ -1806,20 +1819,6 @@ int bdev_read_only(struct block_device *bdev) EXPORT_SYMBOL(bdev_read_only); -int invalidate_partition(struct gendisk *disk, int partno) -{ - int res = 0; - struct block_device *bdev = bdget_disk(disk, partno); - if (bdev) { - fsync_bdev(bdev); - res = __invalidate_device(bdev, true); - bdput(bdev); - } - return res; -} - -EXPORT_SYMBOL(invalidate_partition); - /* * Disk events - monitor disk events like media change and eject request. */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 4f6f59b4f22a..2b4e9f86b151 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2723,7 +2723,6 @@ extern bool is_bad_inode(struct inode *); extern int revalidate_disk(struct gendisk *); extern int check_disk_change(struct block_device *); extern int __invalidate_device(struct block_device *, bool); -extern int invalidate_partition(struct gendisk *, int); #endif unsigned long invalidate_mapping_pages(struct address_space *mapping, pgoff_t start, pgoff_t end); From patchwork Wed Apr 8 19:44:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11480727 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 36B73112C for ; Wed, 8 Apr 2020 19:45:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1562A20771 for ; Wed, 8 Apr 2020 19:45:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="OXY2d9Y0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730161AbgDHTpH (ORCPT ); Wed, 8 Apr 2020 15:45:07 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:40938 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730155AbgDHTpH (ORCPT ); Wed, 8 Apr 2020 15:45:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=FEfhWvLPZ+iih2DaP3qYwNHreINUocGi+rjtpjpeO7c=; b=OXY2d9Y08lLZf/nY5hBJ1v0Tj8 qzf5arRByNejSLT74+LWTZ7yrLfpFJCdQ/BVi67porZqbPrhuDX+JIJ4HMtopLbSPDKP1Ks0OwW2g 3IR/jWagzml6yDf4jBC9h0Ccu55/8HIgEIS/KmbhYVPfBiBOoWOepWZFNCy2uiGZW9d38kd6k2b35 tPiPiKdTIb+FnqxL60+2DcYK9R8nJIw4++KK4mc4kzoJRguf7tL17/TkygKptxxD8z+0khcExMxLs Sp3yHgR81vTXjI5/i9kZld90FvhAK89jejAhc9L/6Raa4SIgg/TrROvwreYPuBDXTsQdXwFhnZW8Z wSro+NFw==; Received: from [2001:4bb8:180:5765:65b6:f11e:f109:b151] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jMGdG-00055y-4Q; Wed, 08 Apr 2020 19:45:06 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Stefan Haberland , Jan Hoeppner , linux-block@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH 10/10] block: fold bdev_unhash_inode into invalidate_partition Date: Wed, 8 Apr 2020 21:44:39 +0200 Message-Id: <20200408194439.1580699-11-hch@lst.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200408194439.1580699-1-hch@lst.de> References: <20200408194439.1580699-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org invalidate_partition and bdev_unhash_inode are always paired, and invalidate_partition already does an icache lookup for the block device inode. Piggy back on that to remove the inode from the hash. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- block/genhd.c | 8 ++++++-- fs/block_dev.c | 15 --------------- include/linux/fs.h | 1 - 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 980a4609d4a5..c05d509877fa 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -888,6 +888,12 @@ static void invalidate_partition(struct gendisk *disk, int partno) fsync_bdev(bdev); __invalidate_device(bdev, true); + + /* + * Unhash the bdev inode for this device so that it gets evicted as soon + * as last inode reference is dropped. + */ + remove_inode_hash(bdev->bd_inode); bdput(bdev); } @@ -909,13 +915,11 @@ void del_gendisk(struct gendisk *disk) DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE); while ((part = disk_part_iter_next(&piter))) { invalidate_partition(disk, part->partno); - bdev_unhash_inode(part_devt(part)); delete_partition(disk, part); } disk_part_iter_exit(&piter); invalidate_partition(disk, 0); - bdev_unhash_inode(disk_devt(disk)); set_capacity(disk, 0); disk->flags &= ~GENHD_FL_UP; up_write(&disk->lookup_sem); diff --git a/fs/block_dev.c b/fs/block_dev.c index 9c8de54fa0c9..998820174d3e 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -883,21 +883,6 @@ static int bdev_set(struct inode *inode, void *data) static LIST_HEAD(all_bdevs); -/* - * If there is a bdev inode for this device, unhash it so that it gets evicted - * as soon as last inode reference is dropped. - */ -void bdev_unhash_inode(dev_t dev) -{ - struct inode *inode; - - inode = ilookup5(blockdev_superblock, hash(dev), bdev_test, &dev); - if (inode) { - remove_inode_hash(inode); - iput(inode); - } -} - struct block_device *bdget(dev_t dev) { struct block_device *bdev; diff --git a/include/linux/fs.h b/include/linux/fs.h index 2b4e9f86b151..1a95e5158811 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2581,7 +2581,6 @@ extern struct kmem_cache *names_cachep; #ifdef CONFIG_BLOCK extern int register_blkdev(unsigned int, const char *); extern void unregister_blkdev(unsigned int, const char *); -extern void bdev_unhash_inode(dev_t dev); extern struct block_device *bdget(dev_t); extern struct block_device *bdgrab(struct block_device *bdev); extern void bd_set_size(struct block_device *, loff_t size);