new scsi sense handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



There are 3 usages of sense handling in drivers

1. sense is available in driver internal structure and is mem-copied to upper level
2. A CHECK_CONDITION status was returned and the driver uses the scsi_eh_prep_cmnd()
   for a REQUEST_SENSE invocation to the target. Then returning the sense in 
   scsi_eh_return_cmnd(). A variation on this is when the driver does nothing the queue
   is frozen an the scsi watchdog timer does the above.
3. The underline host adapter does the REQUEST_SENSE and a pre-allocated and DMA mapped
   sense buffer receives the sense information from HW.

Now since all IO requests come with a sense set at request->sense the buffer at 
scsi_cmnd->sense_buffer can go away, and case 1 above can copy it's bits directly
into it.
Inspection of all users of blk_execute_rq_nowait() shows that all users setup a sense
buffer, but submitted code puts a BUG_ON to make sure new code does not break that.

for cases 2 and 3 above two new members in scsi host template will tell scsi-midlayer
what the driver wants to do.

.sense_buffsize  - will instruct a mempool_t to be allocated per host with sense buffers 
                   of ".sense_buffsize" size.

.pre_allocate_sense - If set tells the midlayer to pre-allocate a sense buffer for each
                      command. When set the code will behave like today. If the sense 
                      allocation fails the command allocation also fails. (With one extra
                      sense at mempool)
                      If .pre_allocate_sense is not set, then mempool_t is resized to
                      accommodate one reserved buffer for each target. So a call to
                      scsi_eh_prep_cmnd() will not fail to allocate a sense buffer even
                      in low memory condition.

Case 1 drivers call - scsi_eh_cpy_sense() - to transfer their sense information to upper
  layer. The drivers are completely abstracted from any future changes at the scsi and block
  sense handling. 

Case 3 drivers call the new scsi_make_sense()/scsi_return_sense() API to retrieve
  a pointer to an extra DMAable sense buffer/return it to free store. scsi_return_sense()
  will call scsi_eh_cpy_sense() to set new sense information into upper layer before
  freeing the buffer back to the mempool. If the driver properly set the .pre_allocate_sense
  flag & .sense_buffsize at host template then these calls are guaranteed to succeed.

Case 2 drivers continue to call scsi_eh_prep_cmnd()/scsi_eh_restore_cmnd() to reuse the
  failing command for REQUEST_SENSE. Inside these functions scsi_error.c will call above
  scsi_make_sense()/scsi_return_sense() for the actual sense buffer allocation. In this 
  case there is a guarantied, one reserved buffer per scsi_device. (.pre_allocate_sense not set).
  Drivers need to set proper size at .sense_buffsize in host template, for this to work.

Upper layer and ULDs that need to inspect the sense information can get to it
  using the scsi_sense() accessor.

Submitted for Review and comments (RFC) a patcset for that effect.

- first patch will introduce the new API implemented over existing members:
	scsi_eh: Define  new API for sense handling

- first group of patches are the case 1 drivers:
	scsi-drivers: Move to new sense API. The Trevial case
	scsi-drivers: more drivers use new scsi_eh_cpy_sense()
	firewire & ieee1394: Simple convert to new scsi_eh_cpy_sense.
	dpt_i2o: Use new scsi_eh_cpy_sense()
	gdth: Use of scsi_eh API and sense accessors
	qla2xxx: convert to new scsi_eh_cpy_sense API
	isd200, transport: Use scsi_eh_cpy_sense API
	ultrastor: Use scsi_eh_cpy_sense() API
	usb/microtek: No special handling for REQUEST_SENSE command please

- second group are case 2 drivers:
	libata: Use scsi_eh API for REQUEST_SENSE invocation
	53c700: Use scsi_eh API for REQUEST_SENSE invocation
	aic7xxx_old: Use scsi_eh API for REQUEST_SENSE invocation
	dc395x: Use scsi_eh API for REQUEST_SENSE invocation
	tmscsim: Use scsi_eh API for REQUEST_SENSE invocation
	Add .sense_buffsize to drivers that use scsi_eh_prep_cmnd

- third group are case 3:
	BusLogic: Use of scsi_make_sense() API for DMA-able sense buffer
	eata: Use of scsi_make_sense() API for DMA-able sense buffer
	initio: Use of scsi_make_sense() API for DMA-able sense buffer
	u14-34f: Use of scsi_make_sense() API for DMA-able sense buffer

- Then, some patches for the upper layer:
	scsi_tgt: use of sense accessors
	scsi upper layer use of sense accessors

- And finally, block and scsi-midlayer switch to new handling.
	block: Minor changes to sense handling
	scsi: New sense handling

These patches are over latest scsi-misc. They are completely *untested* and are for discussion
only. I will debug and update in the near future but only if it is accepted in principle
first.

Lots of maintainers' ACKs are needed and a good deal of testing time in mm so I think this 
is only 2.6.26 at the earliest.

Comment away ;)
Volunteers for testing needed!

Boaz


-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux