Author: imp
Date: Wed Dec 13 07:07:27 2017
New Revision: 326819
URL: https://svnweb.freebsd.org/changeset/base/326819

Log:
  Use ataio ccb instead of general ccb to avoid excessice stack usage.

Modified:
  head/sys/cam/ata/ata_da.c

Modified: head/sys/cam/ata/ata_da.c
==============================================================================
--- head/sys/cam/ata/ata_da.c   Wed Dec 13 06:20:18 2017        (r326818)
+++ head/sys/cam/ata/ata_da.c   Wed Dec 13 07:07:27 2017        (r326819)
@@ -1048,7 +1048,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical
        struct      cam_periph *periph;
        struct      ada_softc *softc;
        u_int       secsize;
-       union       ccb ccb;
+       struct      ccb_ataio ataio;
        struct      disk *dp;
        uint64_t    lba;
        uint16_t    count;
@@ -1067,11 +1067,11 @@ adadump(void *arg, void *virtual, vm_offset_t physical
                return (ENXIO);
        }
 
-       memset(&ccb, 0, sizeof(ccb));
+       memset(&ataio, 0, sizeof(ataio));
        if (length > 0) {
-               xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
-               ccb.ccb_h.ccb_state = ADA_CCB_DUMP;
-               cam_fill_ataio(&ccb.ataio,
+               xpt_setup_ccb(&ataio.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
+               ataio.ccb_h.ccb_state = ADA_CCB_DUMP;
+               cam_fill_ataio(&ataio,
                    0,
                    adadone,
                    CAM_DIR_OUT,
@@ -1082,13 +1082,13 @@ adadump(void *arg, void *virtual, vm_offset_t physical
                if ((softc->flags & ADA_FLAG_CAN_48BIT) &&
                    (lba + count >= ATA_MAX_28BIT_LBA ||
                    count >= 256)) {
-                       ata_48bit_cmd(&ccb.ataio, ATA_WRITE_DMA48,
+                       ata_48bit_cmd(&ataio, ATA_WRITE_DMA48,
                            0, lba, count);
                } else {
-                       ata_28bit_cmd(&ccb.ataio, ATA_WRITE_DMA,
+                       ata_28bit_cmd(&ataio, ATA_WRITE_DMA,
                            0, lba, count);
                }
-               error = cam_periph_runccb(&ccb, adaerror,
+               error = cam_periph_runccb((union ccb *)&ataio, adaerror,
                    0, SF_NO_RECOVERY | SF_NO_RETRY, NULL);
                if (error != 0)
                        printf("Aborting dump due to I/O error.\n");
@@ -1098,15 +1098,15 @@ adadump(void *arg, void *virtual, vm_offset_t physical
        }
 
        if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) {
-               xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
+               xpt_setup_ccb(&ataio.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
 
                /*
                 * Tell the drive to flush its internal cache. if we
                 * can't flush in 5s we have big problems. No need to
                 * wait the default 60s to detect problems.
                 */
-               ccb.ccb_h.ccb_state = ADA_CCB_DUMP;
-               cam_fill_ataio(&ccb.ataio,
+               ataio.ccb_h.ccb_state = ADA_CCB_DUMP;
+               cam_fill_ataio(&ataio,
                                    0,
                                    adadone,
                                    CAM_DIR_NONE,
@@ -1116,10 +1116,10 @@ adadump(void *arg, void *virtual, vm_offset_t physical
                                    5*1000);
 
                if (softc->flags & ADA_FLAG_CAN_48BIT)
-                       ata_48bit_cmd(&ccb.ataio, ATA_FLUSHCACHE48, 0, 0, 0);
+                       ata_48bit_cmd(&ataio, ATA_FLUSHCACHE48, 0, 0, 0);
                else
-                       ata_28bit_cmd(&ccb.ataio, ATA_FLUSHCACHE, 0, 0, 0);
-               error = cam_periph_runccb(&ccb, adaerror,
+                       ata_28bit_cmd(&ataio, ATA_FLUSHCACHE, 0, 0, 0);
+               error = cam_periph_runccb((union ccb *)&ataio, adaerror,
                    0, SF_NO_RECOVERY | SF_NO_RETRY, NULL);
                if (error != 0)
                        xpt_print(periph->path, "Synchronize cache failed\n");
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to