• T
    [PATCH] libata: implement ata_exec_internal() · a2a7a662
    Tejun Heo 提交于
    This patch implements ata_exec_internal() function which performs
    libata internal command execution.  Previously, this was done by each
    user by manually initializing a qc, issueing it, waiting for its
    completion and handling errors.  In addition to obvious code
    factoring, using ata_exec_internal() fixes the following bugs.
    
    * qc not freed on issue failure
    * ap->qactive clearing could race with the next internal command
    * race between timeout handling and irq
    * ignoring error condition not represented in tf->status
    
    Also, qc & hardware are not accessed anymore once it's completed,
    making internal commands more conformant with general semantics.
    ata_exec_internal() also makes it easy to issue internal commands from
    multiple threads if that becomes necessary.
    
    This patch only implements ata_exec_internal().  A following patch
    will convert all users.
    Signed-off-by: NTejun Heo <htejun@gmail.com>
    
    --
    
    Jeff, all patches have been regenerated against upstream branch as of
    today.  (575ab52a)
    
    Also, I took out a debug printk from ata_exec_internal (don't know how
    that one got left there).  Other than that, all patches are identical
    to the previous posting.
    
    Thanks. :-)
    Signed-off-by: NJeff Garzik <jgarzik@pobox.com>
    a2a7a662
libata-core.c 123.0 KB