Hello, Aaron. On Thu, Dec 20, 2012 at 02:07:25PM +0800, Aaron Lu wrote: > +static int is_gendisk_part0(struct device *dev, void *data) > +{ > + struct device **child = data; > + > + if (dev->class == &block_class && dev->type == &disk_type) { > + *child = dev; > + return 1; > + } else > + return 0; > +} > + > +/** > + * disk_from_device - Get the gendisk pointer for this device. > + * @dev: the device this gendisk is created for, i.e. gendisk->driverfs_dev > + * > + * LLD sometimes need to play with the gendisk without HLD's aware, > + * this routine gives LLD the required access to gendisk. > + * > + * CONTEXT: > + * Don't care. > + */ > +struct gendisk *disk_from_device(struct device *dev) > +{ > + struct device *child; > + > + if (device_for_each_child(dev, &child, is_gendisk_part0)) > + return dev_to_disk(child); > + else > + return NULL; > +} > +EXPORT_SYMBOL(disk_from_device); This is really a round-about way to find out the matching device and it wouldn't work if the disk device nests deeper. Doesn't really look like a good idea to me. > Then together with disk_try_block_events and disk_unblock_events, we can > avoid touching SCSI layer to let ODD stay in zero power state. Also, I'd much prefer something along the line of block_events_nowait() instead of try_block. Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html