[PATCH 29/44] block: remove the nr_sects field in struct hd_struct
Jan Kara
jack at suse.cz
Thu Nov 26 11:50:36 EST 2020
On Thu 26-11-20 14:04:07, Christoph Hellwig wrote:
> Now that the hd_struct always has a block device attached to it, there is
> no need for having two size field that just get out of sync.
>
> Additional the field in hd_struct did not use proper serializiation,
^^ Additionaly ^^^ serialization
> possibly allowing for torn writes. By only using the block_device field
> this problem also gets fixed.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> Acked-by: Coly Li <colyli at suse.de> [bcache]
> Acked-by: Chao Yu <yuchao0 at huawei.com> [f2fs]
Nice, just two nits below.
> @@ -47,18 +57,22 @@ static void disk_release_events(struct gendisk *disk);
> bool set_capacity_and_notify(struct gendisk *disk, sector_t size)
> {
> sector_t capacity = get_capacity(disk);
> + char *envp[] = { "RESIZE=1", NULL };
>
> set_capacity(disk, size);
> - revalidate_disk_size(disk, true);
> -
> - if (capacity != size && capacity != 0 && size != 0) {
> - char *envp[] = { "RESIZE=1", NULL };
> -
> - kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp);
> - return true;
> - }
>
> - return false;
> + /*
> + * Only print a message and send a uevent if the gendisk is user visible
> + * and alive. This avoids spamming the log and udev when setting the
> + * initial capacity during probing.
> + */
> + if (size == capacity ||
> + (disk->flags & (GENHD_FL_UP | GENHD_FL_HIDDEN)) != GENHD_FL_UP)
> + return false;
> + pr_info("%s: detected capacity change from %lld to %lld\n",
> + disk->disk_name, size, capacity);
> + kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp);
I think we don't want to generate resize event for changes from / to 0...
Also the return value of this function is now different.
> diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
> index 4e37fa9b409d52..a70c33c49f0960 100644
> --- a/drivers/target/target_core_pscsi.c
> +++ b/drivers/target/target_core_pscsi.c
> @@ -1027,12 +1027,7 @@ static u32 pscsi_get_device_type(struct se_device *dev)
>
> static sector_t pscsi_get_blocks(struct se_device *dev)
> {
> - struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
> -
> - if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
> - return pdv->pdv_bd->bd_part->nr_sects;
> -
> - return 0;
> + return bdev_nr_sectors(PSCSI_DEV(dev)->pdv_bd);
I pdv_bd guaranteed to be non-NULL in pscsi_dev_virt?
Honza
--
Jan Kara <jack at suse.com>
SUSE Labs, CR
More information about the linux-mtd
mailing list