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@xxxxxx> > Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Acked-by: Coly Li <colyli@xxxxxxx> [bcache] > Acked-by: Chao Yu <yuchao0@xxxxxxxxxx> [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@xxxxxxxx> SUSE Labs, CR