On Thu 26-11-20 14:04:10, Christoph Hellwig wrote: > Move the partition_meta_info to struct block_device in preparation for > killing struct hd_struct. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks good to me. You can add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > block/blk.h | 1 - > block/genhd.c | 3 ++- > block/partitions/core.c | 18 +++++++----------- > fs/block_dev.c | 1 + > include/linux/blk_types.h | 2 ++ > include/linux/genhd.h | 1 - > init/do_mounts.c | 7 ++++--- > 7 files changed, 16 insertions(+), 17 deletions(-) > > diff --git a/block/blk.h b/block/blk.h > index 3f801f6e86f8a1..0bd4b58bcbaf77 100644 > --- a/block/blk.h > +++ b/block/blk.h > @@ -381,7 +381,6 @@ static inline void hd_struct_put(struct hd_struct *part) > > static inline void hd_free_part(struct hd_struct *part) > { > - kfree(part->info); > bdput(part->bdev); > percpu_ref_exit(&part->ref); > } > diff --git a/block/genhd.c b/block/genhd.c > index 7bb45382658385..fe202a12eec096 100644 > --- a/block/genhd.c > +++ b/block/genhd.c > @@ -1002,7 +1002,8 @@ void __init printk_all_partitions(void) > bdevt_str(part_devt(part), devt_buf), > bdev_nr_sectors(part->bdev) >> 1, > disk_name(disk, part->partno, name_buf), > - part->info ? part->info->uuid : ""); > + part->bdev->bd_meta_info ? > + part->bdev->bd_meta_info->uuid : ""); > if (is_part0) { > if (dev->parent && dev->parent->driver) > printk(" driver: %s\n", > diff --git a/block/partitions/core.c b/block/partitions/core.c > index 485777cea26bfa..224a22d82fb86f 100644 > --- a/block/partitions/core.c > +++ b/block/partitions/core.c > @@ -275,8 +275,9 @@ static int part_uevent(struct device *dev, struct kobj_uevent_env *env) > struct hd_struct *part = dev_to_part(dev); > > add_uevent_var(env, "PARTN=%u", part->partno); > - if (part->info && part->info->volname[0]) > - add_uevent_var(env, "PARTNAME=%s", part->info->volname); > + if (part->bdev->bd_meta_info && part->bdev->bd_meta_info->volname[0]) > + add_uevent_var(env, "PARTNAME=%s", > + part->bdev->bd_meta_info->volname); > return 0; > } > > @@ -422,13 +423,10 @@ static struct hd_struct *add_partition(struct gendisk *disk, int partno, > p->policy = get_disk_ro(disk); > > if (info) { > - struct partition_meta_info *pinfo; > - > - pinfo = kzalloc_node(sizeof(*pinfo), GFP_KERNEL, disk->node_id); > - if (!pinfo) > + err = -ENOMEM; > + bdev->bd_meta_info = kmemdup(info, sizeof(*info), GFP_KERNEL); > + if (!bdev->bd_meta_info) > goto out_bdput; > - memcpy(pinfo, info, sizeof(*info)); > - p->info = pinfo; > } > > dname = dev_name(ddev); > @@ -444,7 +442,7 @@ static struct hd_struct *add_partition(struct gendisk *disk, int partno, > > err = blk_alloc_devt(p, &devt); > if (err) > - goto out_free_info; > + goto out_bdput; > pdev->devt = devt; > > /* delay uevent until 'holders' subdir is created */ > @@ -481,8 +479,6 @@ static struct hd_struct *add_partition(struct gendisk *disk, int partno, > kobject_uevent(&pdev->kobj, KOBJ_ADD); > return p; > > -out_free_info: > - kfree(p->info); > out_bdput: > bdput(bdev); > out_free: > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 11e6a9a255845d..62fae6a0e8aa56 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -785,6 +785,7 @@ static void bdev_free_inode(struct inode *inode) > struct block_device *bdev = I_BDEV(inode); > > free_percpu(bdev->bd_stats); > + kfree(bdev->bd_meta_info); > > kmem_cache_free(bdev_cachep, BDEV_I(inode)); > } > diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h > index a690008f60cd92..2f8ede04e5a94c 100644 > --- a/include/linux/blk_types.h > +++ b/include/linux/blk_types.h > @@ -49,6 +49,8 @@ struct block_device { > /* Mutex for freeze */ > struct mutex bd_fsfreeze_mutex; > struct super_block *bd_fsfreeze_sb; > + > + struct partition_meta_info *bd_meta_info; > } __randomize_layout; > > #define bdev_whole(_bdev) \ > diff --git a/include/linux/genhd.h b/include/linux/genhd.h > index 50d27f5d38e2af..30d7076155b4d2 100644 > --- a/include/linux/genhd.h > +++ b/include/linux/genhd.h > @@ -57,7 +57,6 @@ struct hd_struct { > struct device __dev; > struct kobject *holder_dir; > int policy, partno; > - struct partition_meta_info *info; > #ifdef CONFIG_FAIL_MAKE_REQUEST > int make_it_fail; > #endif > diff --git a/init/do_mounts.c b/init/do_mounts.c > index 5879edf083b318..368ccb71850126 100644 > --- a/init/do_mounts.c > +++ b/init/do_mounts.c > @@ -79,8 +79,8 @@ static int match_dev_by_uuid(struct device *dev, const void *data) > const struct uuidcmp *cmp = data; > struct hd_struct *part = dev_to_part(dev); > > - if (!part->info || > - strncasecmp(cmp->uuid, part->info->uuid, cmp->len)) > + if (!part->bdev->bd_meta_info || > + strncasecmp(cmp->uuid, part->bdev->bd_meta_info->uuid, cmp->len)) > return 0; > return 1; > } > @@ -169,7 +169,8 @@ static int match_dev_by_label(struct device *dev, const void *data) > const char *label = data; > struct hd_struct *part = dev_to_part(dev); > > - if (!part->info || strcmp(label, part->info->volname)) > + if (!part->bdev->bd_meta_info || > + strcmp(label, part->bdev->bd_meta_info->volname)) > return 0; > return 1; > } > -- > 2.29.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR