if (unlikely(!scsicmd || !scsicmd->scsi_done)) {
                dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
                aac_fib_complete(fibptr);
-               aac_fib_free(fibptr);
                return 0;
        }
        scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
        if (unlikely(!device || !scsi_device_online(device))) {
                dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
                aac_fib_complete(fibptr);
-               aac_fib_free(fibptr);
                return 0;
        }
        return 1;
        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
        aac_fib_complete(fibptr);
-       aac_fib_free(fibptr);
        scsicmd->scsi_done(scsicmd);
 }
 
 
        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
-       if (!(cmd_fibcontext = aac_fib_alloc(dev)))
+       cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+       if (!cmd_fibcontext)
                return -ENOMEM;
 
        aac_fib_init(cmd_fibcontext);
 
        printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
        aac_fib_complete(cmd_fibcontext);
-       aac_fib_free(cmd_fibcontext);
        return -1;
 }
 
        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
        aac_fib_complete(fibptr);
-       aac_fib_free(fibptr);
        scsicmd->scsi_done(scsicmd);
 }
 
 
        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
-       if (!(cmd_fibcontext = aac_fib_alloc(dev)))
+       cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+       if (!cmd_fibcontext)
                return -ENOMEM;
 
        aac_fib_init(cmd_fibcontext);
 
        printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
        aac_fib_complete(cmd_fibcontext);
-       aac_fib_free(cmd_fibcontext);
        return -1;
 }
 
                break;
        }
        aac_fib_complete(fibptr);
-       aac_fib_free(fibptr);
 
        scsicmd->scsi_done(scsicmd);
 }
        /*
         *      Alocate and initialize a Fib
         */
-       if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+       cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+       if (!cmd_fibcontext) {
                printk(KERN_WARNING "aac_read: fib allocation failed\n");
                return -1;
        }
        /*
         *      Allocate and initialize a Fib then setup a BlockWrite command
         */
-       if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+       cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+       if (!cmd_fibcontext) {
                /* FIB temporarily unavailable,not catastrophic failure */
 
                /* scsicmd->result = DID_ERROR << 16;
        /*
         *      Allocate and initialize a Fib
         */
-       cmd_fibcontext = aac_fib_alloc(aac);
+       cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd);
        if (!cmd_fibcontext)
                return SCSI_MLQUEUE_HOST_BUSY;
 
        scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
 
        aac_fib_complete(fibptr);
-       aac_fib_free(fibptr);
        scsicmd->scsi_done(scsicmd);
 }
 
        /*
         *      Allocate and initialize a Fib then setup a BlockWrite command
         */
-       if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+       cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+       if (!cmd_fibcontext)
                return -1;
-       }
+
        status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
 
        /*
 
                i++, fibptr++)
        {
                fibptr->flags = 0;
+               fibptr->size = sizeof(struct fib);
                fibptr->dev = dev;
                fibptr->hw_fib_va = hw_fib;
                fibptr->data = (void *) fibptr->hw_fib_va->data;
         */
        dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL;
        /*
-        *      Enable this to debug out of queue space
-        */
-       dev->free_fib = &dev->fibs[0];
+       *       Set 8 fibs aside for management tools
+       */
+       dev->free_fib = &dev->fibs[dev->scsi_host_ptr->can_queue];
        return 0;
 }
 
+/**
+ *     aac_fib_alloc_tag-allocate a fib using tags
+ *     @dev: Adapter to allocate the fib for
+ *
+ *     Allocate a fib from the adapter fib pool using tags
+ *     from the blk layer.
+ */
+
+struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd)
+{
+       struct fib *fibptr;
+
+       fibptr = &dev->fibs[scmd->request->tag];
+       /*
+        *      Null out fields that depend on being zero at the start of
+        *      each I/O
+        */
+       fibptr->hw_fib_va->header.XferState = 0;
+       fibptr->type = FSAFS_NTC_FIB_CONTEXT;
+       fibptr->callback_data = NULL;
+       fibptr->callback = NULL;
+
+       return fibptr;
+}
+
 /**
  *     aac_fib_alloc   -       allocate a fib
  *     @dev: Adapter to allocate the fib for