On Wed, 25 May 2011, Linus Torvalds wrote: > On Wed, May 25, 2011 at 12:52 PM, Parag Warudkar <parag.lkml@xxxxxxxxx> wrote: > > > > +static inline int sdev_early_check(struct scsi_device *sdev) > > +{ > > + if (!sdev || sdev->sdev_state == SDEV_DEL > > + || sdev->sdev_state > SDEV_QUIESCE) > > + return -ENXIO; > > + return 0; > > +} > > Can somebody explain why it's those states, and nothing else? > > Quite frankly, if it's about "don't oops on sdev->queue not existing", > then test for that. Not for some random and uncommented list of > states. List of states and what commands if any are accepeted for each state are explained in scsi_device.h enum definition of scsi_device_state : enum scsi_device_state { SDEV_CREATED = 1, /* device created but not added to sysfs * Only internal commands allowed (for inq) */ SDEV_RUNNING, /* device properly configured * All commands allowed */ SDEV_CANCEL, /* beginning to delete device * Only error handler commands allowed */ SDEV_DEL, /* device deleted * no commands allowed */ SDEV_QUIESCE, /* Device quiescent. No block commands * will be accepted, only specials (which * originate in the mid-layer) */ SDEV_OFFLINE, /* Device offlined (by error handling or * user request */ SDEV_BLOCK, /* Device blocked by scsi lld. No * scsi commands from user or midlayer * should be issued to the scsi * lld. */ SDEV_CREATED_BLOCK, /* same as above but for created devices */ }; In this case - we check for cases where no commands are allowed and reject those right away, leaving prep_state_check to do filtering at lower level for which commands are allowed and which are not as the state permits. Parag