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 <[email protected]>
> Reviewed-by: Greg Kroah-Hartman <[email protected]>
> Acked-by: Coly Li <[email protected]>                    [bcache]
> Acked-by: Chao Yu <[email protected]>                        [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 <[email protected]>
SUSE Labs, CR

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to