dm-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Jens Axboe <axboe@kernel.dk>, Mike Snitzer <snitzer@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Richard Weinberger <richard@nod.at>,
	Josef Bacik <josef@toxicpanda.com>, Coly Li <colyli@suse.de>,
	linux-block@vger.kernel.org, linux-mm@kvack.org,
	dm-devel@redhat.com, linux-mtd@lists.infradead.org,
	Jan Kara <jack@suse.com>,
	linux-fsdevel@vger.kernel.org, xen-devel@lists.xenproject.org,
	linux-bcache@vger.kernel.org
Subject: Re: [dm-devel] [PATCH 11/20] block: reference struct block_device from struct hd_struct
Date: Tue, 24 Nov 2020 11:59:49 -0500	[thread overview]
Message-ID: <X708BTJ5njtbC2z1@mtj.duckdns.org> (raw)
In-Reply-To: <20201118084800.2339180-12-hch@lst.de>

Hello,

This is great. So much simpler & better. Some nits below.

> diff --git a/block/partitions/core.c b/block/partitions/core.c
> index a02e224115943d..0ba0bf44b88af3 100644
> --- a/block/partitions/core.c
> +++ b/block/partitions/core.c
> @@ -340,12 +340,11 @@ void delete_partition(struct hd_struct *part)
>  	device_del(part_to_dev(part));
>  
>  	/*
> -	 * Remove gendisk pointer from idr so that it cannot be looked up
> -	 * while RCU period before freeing gendisk is running to prevent
> -	 * use-after-free issues. Note that the device number stays
> -	 * "in-use" until we really free the gendisk.
> +	 * Remove the block device from the inode hash, so that it cannot be
> +	 * looked up while waiting for the RCU grace period.
>  	 */
> -	blk_invalidate_devt(part_devt(part));
> +	remove_inode_hash(part->bdev->bd_inode);

I don't think this is necessary now that the bdev and inode lifetimes are
one. Before, punching out the association early was necessary because we
could be in a situation where we can successfully look up a part from idr
and then try to pin the associated disk which may already be freed. With the
new code, the lookup is through the inode whose lifetime is one and the same
with gendisk, so use-after-free isn't possible and __blkdev_get() will
reliably reject such open attempts.

...
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 4c4d6c30382c06..e94633dc6ad93b 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -870,34 +870,50 @@ void __init bdev_cache_init(void)
>  	blockdev_superblock = bd_mnt->mnt_sb;   /* For writeback */
>  }
>  
> -static struct block_device *bdget(dev_t dev)
> +struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
>  {
>  	struct block_device *bdev;
>  	struct inode *inode;
>  
> -	inode = iget_locked(blockdev_superblock, dev);
> +	inode = new_inode(blockdev_superblock);
>  	if (!inode)
>  		return NULL;
>  
> -	bdev = &BDEV_I(inode)->bdev;
> +	bdev = I_BDEV(inode);
> +	spin_lock_init(&bdev->bd_size_lock);
> +	bdev->bd_disk = disk;
> +	bdev->bd_partno = partno;
> +	bdev->bd_contains = NULL;
> +	bdev->bd_super = NULL;
> +	bdev->bd_inode = inode;
> +	bdev->bd_part_count = 0;
> +
> +	inode->i_mode = S_IFBLK;
> +	inode->i_rdev = 0;
> +	inode->i_bdev = bdev;
> +	inode->i_data.a_ops = &def_blk_aops;

Missing the call to mapping_set_gfp_mask().

>  
> -	if (inode->i_state & I_NEW) {
> -		spin_lock_init(&bdev->bd_size_lock);
> -		bdev->bd_contains = NULL;
> -		bdev->bd_super = NULL;
> -		bdev->bd_inode = inode;
> -		bdev->bd_part_count = 0;
> -		bdev->bd_dev = dev;
> -		inode->i_mode = S_IFBLK;
> -		inode->i_rdev = dev;
> -		inode->i_bdev = bdev;
> -		inode->i_data.a_ops = &def_blk_aops;
> -		mapping_set_gfp_mask(&inode->i_data, GFP_USER);
> -		unlock_new_inode(inode);
> -	}
>  	return bdev;
>  }
...
>  /**
>   * bdgrab -- Grab a reference to an already referenced block device
>   * @bdev:	Block device to grab a reference to.
> @@ -957,6 +973,10 @@ static struct block_device *bd_acquire(struct inode *inode)
>  		bd_forget(inode);
>  
>  	bdev = bdget(inode->i_rdev);
> +	if (!bdev) {
> +		blk_request_module(inode->i_rdev);
> +		bdev = bdget(inode->i_rdev);
> +	}

One side effect here is that, before, a device which uses the traditional
consecutive devt range would reserve all minors for the partitions whether
they exist or not and fail open requests without requesting the matching
module. After the change, trying to open an non-existent partition would
trigger module probe. I don't think the behavior change is consequential in
any sane not-crazily-arcane setup but it might be worth mentioning in the
commit log.

Thank you.

-- 
tejun

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel


  parent reply	other threads:[~2020-11-24 17:00 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-18  8:47 [dm-devel] merge struct block_device and struct hd_struct Christoph Hellwig
2020-11-18  8:47 ` [dm-devel] [PATCH 01/20] blk-cgroup: fix a hd_struct leak in blkcg_fill_root_iostats Christoph Hellwig
2020-11-18 14:09   ` Jan Kara
2020-11-19  8:37   ` Johannes Thumshirn
2020-11-24 12:26   ` Tejun Heo
2020-11-18  8:47 ` [dm-devel] [PATCH 02/20] block: remove a duplicate __disk_get_part prototype Christoph Hellwig
2020-11-18 14:10   ` Jan Kara
2020-11-19  8:37   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 03/20] block: add a bdev_kobj helper Christoph Hellwig
2020-11-18 14:18   ` Jan Kara
2020-11-19  8:37   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 04/20] block: use disk_part_iter_exit in disk_part_iter_next Christoph Hellwig
2020-11-18 14:19   ` Jan Kara
2020-11-19  8:37   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 05/20] block: use put_device in put_disk Christoph Hellwig
2020-11-18 14:20   ` Jan Kara
2020-11-19  8:38   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 06/20] block: change the hash used for looking up block devices Christoph Hellwig
2020-11-18 14:22   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 07/20] init: refactor name_to_dev_t Christoph Hellwig
2020-11-18 14:37   ` Jan Kara
2020-11-19  7:52     ` Christoph Hellwig
2020-11-19  8:25       ` Jan Kara
2020-11-20  8:49         ` Christoph Hellwig
2020-11-19  8:38   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 08/20] init: refactor devt_from_partuuid Christoph Hellwig
2020-11-18 14:41   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 09/20] init: cleanup match_dev_by_uuid and match_dev_by_label Christoph Hellwig
2020-11-18 14:42   ` Jan Kara
2020-11-19  8:38   ` Johannes Thumshirn
2020-11-18  8:47 ` [dm-devel] [PATCH 10/20] block: refactor __blkdev_put Christoph Hellwig
2020-11-18 14:46   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 11/20] block: reference struct block_device from struct hd_struct Christoph Hellwig
2020-11-19  9:41   ` Jan Kara
2020-11-20  8:56     ` Christoph Hellwig
2020-11-24 16:59   ` Tejun Heo [this message]
2020-11-25 11:40     ` Jan Kara
2020-11-25 12:09       ` Tejun Heo
2020-11-18  8:47 ` [dm-devel] [PATCH 12/20] block: simplify the block device claiming interface Christoph Hellwig
2020-11-19 10:07   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 13/20] block: remove ->bd_contains Christoph Hellwig
2020-11-19 10:32   ` Jan Kara
2020-11-20  9:01     ` Christoph Hellwig
2020-11-18  8:47 ` [dm-devel] [PATCH 14/20] block: remove the nr_sects field in struct hd_struct Christoph Hellwig
2020-11-19 12:05   ` Jan Kara
2020-11-20  9:08     ` Christoph Hellwig
2020-11-20 11:21       ` Jan Kara
2020-11-20 15:32         ` Christoph Hellwig
2020-11-20 15:59           ` Matthew Wilcox
2020-11-20 16:01             ` Christoph Hellwig
2020-11-20 20:05             ` Jan Kara
2020-11-21 16:24               ` Christoph Hellwig
2020-11-18  8:47 ` [dm-devel] [PATCH 15/20] block: merge struct block_device and " Christoph Hellwig
2020-11-19 14:39   ` Jan Kara
2020-11-20  9:15     ` Christoph Hellwig
2020-11-20 10:53       ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 16/20] block: stop using bdget_disk for partition 0 Christoph Hellwig
2020-11-19 14:43   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 17/20] filemap: consistently use ->f_mapping over ->i_mapping Christoph Hellwig
2020-11-19 14:53   ` Jan Kara
2020-11-19 15:13   ` Matthew Wilcox
2020-11-20  9:17     ` Christoph Hellwig
2020-11-18  8:47 ` [dm-devel] [PATCH 18/20] fs: remove get_super_thawed and get_super_exclusive_thawed Christoph Hellwig
2020-11-19 14:59   ` Jan Kara
2020-11-18  8:47 ` [dm-devel] [PATCH 19/20] bcache: remove a superflous lookup_bdev all Christoph Hellwig
2020-11-18  8:54   ` Coly Li
2020-11-18  9:10     ` Greg KH
2020-11-18  9:55       ` Coly Li
2020-11-18 16:24     ` Christoph Hellwig
2020-11-18  8:48 ` [dm-devel] [PATCH 20/20] block: remove i_bdev Christoph Hellwig
2020-11-18  8:56 ` [dm-devel] merge struct block_device and struct hd_struct Jan Beulich
2020-11-18  8:58   ` Christoph Hellwig
2020-11-18  9:04     ` Jan Beulich
2020-11-18  9:08       ` Christoph Hellwig
2020-11-18  9:09       ` Greg KH
2020-11-18  9:23         ` Jan Beulich
2020-11-18  9:32           ` Greg KH
2020-11-18 12:50           ` Matthew Wilcox
2020-11-18  9:13 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=X708BTJ5njtbC2z1@mtj.duckdns.org \
    --to=tj@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=colyli@suse.de \
    --cc=dm-devel@redhat.com \
    --cc=hch@lst.de \
    --cc=jack@suse.com \
    --cc=josef@toxicpanda.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=richard@nod.at \
    --cc=snitzer@redhat.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).