kernel - Fix AHCI callout timer race (2)
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 20 Jan 2012 19:23:54 +0000 (11:23 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 20 Jan 2012 19:23:54 +0000 (11:23 -0800)
* Fix minor bug in last commit.  If the serial number does not match
  after the timeout is stopped we don't want to mess with the xa at
  all.

sys/dev/disk/ahci/ahci.c

index 677f776..1716fad 100644 (file)
@@ -3573,12 +3573,12 @@ ahci_ata_cmd_done(struct ahci_ccb *ccb)
        if (xa->flags & ATA_F_TIMEOUT_RUNNING) {
                serial = ccb->ccb_xa.serial;
                callout_stop_sync(&ccb->ccb_timeout);
-               xa->flags &= ~ATA_F_TIMEOUT_RUNNING;
                if (serial != ccb->ccb_xa.serial) {
                        kprintf("%s: Warning: timeout race ccb %p\n",
                                PORTNAME(ccb->ccb_port), ccb);
                        return;
                }
+               xa->flags &= ~ATA_F_TIMEOUT_RUNNING;
        }
        xa->flags &= ~(ATA_F_TIMEOUT_DESIRED | ATA_F_TIMEOUT_EXPIRED);
        ccb->ccb_port->ap_expired &= ~(1 << ccb->ccb_slot);