Skip to content
  • Nicholas Bellinger's avatar
    target: Add support for COMPARE_AND_WRITE emulation · 68ff9b9b
    Nicholas Bellinger authored
    
    
    This patch adds support for COMPARE_AND_WRITE emulation on a per block
    basis.  This logic is used as an atomic test and set primative currently
    used by VMWare ESX VAAI for performing array side locking of individual
    VMFS extent ownership.
    
    This includes the COMPARE_AND_WRITE CDB parsing within sbc_parse_cdb(),
    and does the majority of the work within the compare_and_write_callback()
    to perform the verify instance user data comparision, and subsequent
    write instance user data I/O submission upon a successfull comparision.
    
    The synchronization is enforced by se_device->caw_sem, that is obtained
    before the initial READ I/O submission in sbc_compare_and_write().  The
    mutex is then released upon MISCOMPARE in compare_and_write_callback(),
    or upon WRITE instance user-data completion in compare_and_write_post().
    
    The implementation currently assumes a single logical block (NoLB=1).
    
    v4 changes:
     - Explicitly clear cmd->transport_complete_callback for two failure
       cases in sbc_compare_and_write() in order to avoid double unlock
       of ->caw_sem in compare_and_write_callback() (Dan Carpenter)
    
    v3 changes:
     - Convert se_device->caw_mutex to ->caw_sem
    
    v2 changes:
     - Set SCF_COMPARE_AND_WRITE and cmd->execute_cmd() to
       sbc_compare_and_write() during setup in sbc_parse_cdb()
     - Use sbc_compare_and_write() for initial READ submission with
       DMA_FROM_DEVICE
     - Reset cmd->execute_cmd() to sbc_execute_rw() for write instance
       user-data in compare_and_write_callback()
     - Drop SCF_BIDI command flag usage
     - Set TRANSPORT_PROCESSING + transport_state flags before write
       instance submission, and convert to __target_execute_cmd()
     - Prevent sbc_get_size() from being being called twice to
       generate incorrect size in sbc_parse_cdb()
     - Enforce se_device->caw_mutex synchronization between initial
       READ I/O submission, and final WRITE I/O completion.
    
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Hannes Reinecke <hare@suse.de>
    Cc: Martin Petersen <martin.petersen@oracle.com>
    Cc: Chris Mason <chris.mason@fusionio.com>
    Cc: James Bottomley <JBottomley@Parallels.com>
    Cc: Nicholas Bellinger <nab@linux-iscsi.org>
    Signed-off-by: default avatarNicholas Bellinger <nab@daterainc.com>
    68ff9b9b