[SCSI] libsas: fix ata list corruption issue
[cascardo/linux.git] / drivers / scsi / libsas / sas_ata.c
index 16c5094..3356bf3 100644 (file)
@@ -802,6 +802,19 @@ int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q,
                if (!list_empty(&sata_q)) {
                        ata_port_printk(ap, KERN_DEBUG, "sas eh calling libata cmd error handler\n");
                        ata_scsi_cmd_error_handler(shost, ap, &sata_q);
+                       /*
+                        * ata's error handler may leave the cmd on the list
+                        * so make sure they don't remain on a stack list
+                        * about to go out of scope.
+                        *
+                        * This looks strange, since the commands are
+                        * now part of no list, but the next error
+                        * action will be ata_port_error_handler()
+                        * which takes no list and sweeps them up
+                        * anyway from the ata tag array.
+                        */
+                       while (!list_empty(&sata_q))
+                               list_del_init(sata_q.next);
                }
        } while (ap);