AIC7899's 2 SCSI channels infect with each other in target mode?

Jingrong Xie xjrcool at hotmail.com
Tue Aug 19 23:44:42 PDT 2003


-------------------------------------------------
1.(to Nate) about scsi_target(user-space scsi_disk emulator):

1)applying targ-noloop.diff result:
    scsi_target crashed!
2)applying targ-numctios.diff result:
    not seeing any changes.
3)applying targ-jingrong1.diff result:
    ONLY log something to /var/log/messages, for my convinence ^-^.
4)applying targ-jingrong2.diff result:
    when NOT using it, my prog <test_write_scsi> can only write 9 times 
before ERROR!
    I saw 'IO 0xXXXX out of order' warning is not very friendly and do such, 
it works.
-------------------------------------------------
-------------------
1) targ-noloop.diff
-------------------
Index: src/share/examples/scsi_target/scsi_target.c
===================================================================
RCS file: /home/ncvs/src/share/examples/scsi_target/scsi_target.c,v
retrieving revision 1.14
diff -u -r1.14 scsi_target.c
--- src/share/examples/scsi_target/scsi_target.c        16 Jan 2003 00:24:29 
-0000      1.14
+++ src/share/examples/scsi_target/scsi_target.c        12 Apr 2003 00:28:06 
-0000
@@ -642,6 +642,7 @@

        /* Insert in order, sorted by offset */
        if (!TAILQ_EMPTY(ioq)) {
+#ifdef notyet
                TAILQ_FOREACH_REVERSE(ccb_h, ioq, io_queue, 
periph_links.tqe) {
                        curr_descr = (struct ctio_descr *)ccb_h->targ_descr;
                        if (curr_descr->offset <= c_descr->offset) {
@@ -657,6 +658,7 @@
                        }
                }
        } else {
+#endif
                TAILQ_INSERT_HEAD(ioq, &ctio->ccb_h, periph_links.tqe);
        }
}


-------------------
2) targ-numctios.diff
-------------------
Index: src/share/examples/scsi_target/scsi_target.c
===================================================================
RCS file: /home/ncvs/src/share/examples/scsi_target/scsi_target.c,v
retrieving revision 1.14
diff -u -r1.14 scsi_target.c
--- src/share/examples/scsi_target/scsi_target.c        16 Jan 2003 00:24:29 
-0000      1.14
+++ src/share/examples/scsi_target/scsi_target.c        12 Apr 2003 00:24:33 
-0000
@@ -796,7 +796,7 @@
        struct ctio_descr *c_descr;
        struct sigevent *se;

-       if (num_ctios == MAX_CTIOS)
+       if (num_ctios >= MAX_CTIOS)
                return (NULL);

        ctio = (struct ccb_scsiio *)malloc(sizeof(*ctio));

-------------------
3) targ-jingrong1.diff
-------------------
*** scsi_target.c.orig  Wed Aug 20 13:34:40 2003
--- scsi_target.c       Wed Aug 20 14:12:49 2003
***************
*** 685,691 ****
                c_descr = (struct ctio_descr *)ctio->ccb_h.targ_descr;

                /* If completed item is in range, call handler */
!               if ( 1 || (c_descr->event == AIO_DONE && //Avoiding 'IO ... 
out of order' warning.
                    c_descr->offset == a_descr->base_off + 
a_descr->targ_ack)
                 || (c_descr->event == CTIO_DONE &&
                    c_descr->offset == a_descr->base_off + 
a_descr->init_ack)) {
--- 685,691 ----
                c_descr = (struct ctio_descr *)ctio->ccb_h.targ_descr;

                /* If completed item is in range, call handler */
!               if ((c_descr->event == AIO_DONE &&
                    c_descr->offset == a_descr->base_off + 
a_descr->targ_ack)
                 || (c_descr->event == CTIO_DONE &&
                    c_descr->offset == a_descr->base_off + 
a_descr->init_ack)) {

-------------------
4) targ-jingrong2.diff
-------------------
*** scsi_cmds.c.orig    Tue Aug 19 19:34:52 2003
--- scsi_cmds.c Wed Aug 20 13:35:20 2003
***************
*** 602,607 ****
--- 602,615 ----
                        a_descr->targ_req += ctio->dxfer_len;
                        if (aio_write(&c_descr->aiocb) < 0)
                                err(1, "aio_write"); /* XXX */
+                       {//Jingrong add for test.
+                       #include <syslog.h>
+                       #include <stdarg.h>
+                       static unsigned long g_count=0;
+                       g_count++;
+                       if( g_count % 100 == 0)
+                               syslog(LOG_ERR,"====write %ld blocks!\n", 
g_count);
+                       }
                } else {
                        if (debug)
                                warnx("CTIO done freeing CTIO");



-------------------------------------------------
2. test_write_wscsi.c
-------------------------------------------------
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
        int fd = 0;
        FILE *fp2 = 0;
        int ret = 0;
        char buf[10240];
        fd = open("/dev/da0", O_RDWR);

        if(argc<2){
                printf("usage: %s <filename>\n", argv[0]);
                return 1;
        }
        fp2 = fopen(argv[1], "r+");
        if(fp2 <=0){
                perror("fopen");
                exit(1);
        }

        memset(buf, 0, 10240);
        ret = fread( buf, 10240, 1, fp2);

        lseek(fd,10240, SEEK_SET);
        write(fd, buf, 10240);

        return 0;
}


-------------------------------------------------
3. test.sh
-------------------------------------------------
TOTALCOUNT=$1
SLEEPTIME=$2
COUNT=0

while true ; do
  echo "count = $COUNT, totalcount= $TOTALCOUNT"
  if [ $COUNT -gt $TOTALCOUNT ] ; then
        break ;
  fi

  ./test_write_scsi test_write_wscsi.c
  sleep $SLEEPTIME

  COUNT=`expr $COUNT + 1`
done


-------------------------------------------------
4. Test:
   On IA, using './test.sh 1000000 0', test for 3 days and about 1Tbytes 
data, no problem.
   On OA, also.
   but when the two do at the same time, IA or OA will crash down soon.
-------------------------------------------------
OA# dd if=/dev/zero of=testfile bs=1024 count=102400
OA# ./scsi_target -S -W 16 0:5:0 testfile

IA# camcontrol rescan 0
IA# ./test.sh 1000000 0

IA# dd if=/dev/zero of=testfile bs=1024 count=102400
IA# ./scsi_target -S -W 16 1:5:0 testfile

OA# camcontrol rescan 1
OA# ./test.sh 1000000 0

-------------------------------------------------
5. Also about Justin's advice:
-------------------------------------------------
>You shouldn't be able to do this since ahc(4) does not support
>simultaneous target/initiator mode.

It can, you just need to disable the multi-target-id feature to do
it.  I should probably modify the driver so that it will allow dual
mode operation so long as only one target-id is set and it corresponds
to the initiator's id.

Q: How could I disable the multi-target-id feature? Is the following 
correct?

Beforing this advice, i use 0x27 to enable 0,1,2,5 as target-id,
GENERIC_IA: options         AHC_TMODE_ENABLE=0x27
GENERIC_OA: options         AHC_TMODE_ENABLE=0x27
and this is the kernel output for scsi_target:
IA#
  (targbh0:ahc0:0:-1:-1): Lun now enabled for target mode
  (targbh1:ahc1:0:-1:-1): Lun now enabled for target mode
OA#
  (targbh0:ahc0:0:-1:-1): Lun now enabled for target mode
  (targbh1:ahc1:0:-1:-1): Lun now enabled for target mode

I changed to disable the multi-target-id feature:
GENERIC_IA: options         AHC_TMODE_ENABLE=0x21  #only enable 0,5 as 
target-id
GENERIC_OA: options         AHC_TMODE_ENABLE=0x22  #only enable 1,5 as 
target-id
and this is the kernel output for scsi_target:
IA#
  (targbh0:ahc0:0:-1:-1): Lun now enabled for target mode
OA#
  (targbh1:ahc1:0:-1:-1): Lun now enabled for target mode


I tried 'AHC_TMODE_ENABLE=0x20' to enable only 5 as target-id, but failed! 
kernel says it dont support target-mode when i using scsi_target.


thanks very much!


Regards,

Jingrong

_________________________________________________________________
Protect your PC - get McAfee.com VirusScan Online 
http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963



More information about the freebsd-scsi mailing list