Пример #1
0
void mscp_talk_with(char * node, char * sysap)
{
    // both parameters are unused right now
    // we know they are the other node, and the second is mscp$disk

    __du_init(); //temp placement?

    signed long long time=-100000000;
    int unit;
    struct _cdrp * cdrp = vmalloc(sizeof(struct _cdrp));
    struct _mscp_basic_pkt * basic = vmalloc(sizeof(struct _mscp_basic_pkt));
    memset(cdrp,0,sizeof(struct _cdrp));
    memset(basic,0,sizeof(struct _mscp_basic_pkt));
    //basic->mscp$b_caa=MSCP$K_OP_READ;
    for (unit=1; unit < 5; unit ++)
    {
        exe$schdwk(0,0,&time,0);
        sys$hiber();
        printk("probing other node dqa%x\n",unit);
        basic->mscp$b_opcode = MSCP$K_OP_GTUNT;
        basic->mscp$w_unit=unit;
        basic->mscp$l_cmd_ref=0;
        cdrp->cdrp$w_cdrpsize=600;
        cdrp->cdrp$l_rspid=scs_std$alloc_rspid(0,0,cdrp,0);
        cdrp->cdrp$l_cdt=find_mscp_cdt();
        cdrp->cdrp$l_msg_buf=basic;
        cdrp->cdrp$l_xct_len=sizeof(struct _mscp_basic_pkt);
        if (cdrp->cdrp$l_cdt==0)
        {
            printk("gtunt cli no cdt\n");
            return;
        }
        scs_std$senddg(0,600,cdrp);
    }
}
Пример #2
0
void lck$snd_granted(struct _lkb * lck) {
  struct _cdrp * cdrp = kmalloc(sizeof(struct _cdrp), GFP_KERNEL);
  memset(cdrp,0,sizeof(struct _cdrp));
  cdrp->cdrp$l_val1=lck->lkb$l_remlkid;
  cdrp->cdrp$l_val2=lck-lockidtbl[0];
  if (!dlmconnected) {
    dlmconnected=1;
  }
  scs_std$senddg(0,500,cdrp);
}
Пример #3
0
void returnsome(struct _irp * i)
{
    struct _cdrp * cdrp = vmalloc(sizeof(struct _cdrp));
    struct _mscp_basic_pkt * basic = vmalloc(sizeof(struct _mscp_basic_pkt));
    memset(cdrp,0,sizeof(struct _cdrp));
    memset(basic,0,sizeof(struct _mscp_basic_pkt));
    //basic->mscp$b_caa=MSCP$K_OP_READ;
    basic->mscp$b_opcode = MSCP$K_OP_END;
    basic->mscp$l_cmd_ref=0;
    //bcopy(i->irp$l_qio_p1,(unsigned long)basic + sizeof(struct _transfer_commands),512);
    cdrp->cdrp$w_cdrpsize=600;
    cdrp->cdrp$l_rspid=i->irp$l_rspid;
    cdrp->cdrp$l_cdt=i->irp$l_cdt;
    cdrp->cdrp$l_msg_buf=i->irp$l_qio_p1;
    cdrp->cdrp$l_xct_len=512;
    scs_std$senddata(&dupdt,cdrp,0);
    return;
    cdrp->cdrp$l_msg_buf=basic;
    cdrp->cdrp$l_xct_len=sizeof(struct _mscp_basic_pkt);
    scs_std$senddg(0,600,cdrp);
}
Пример #4
0
int mscplisten(void * packet, struct _cdt * c, struct _pdt * p)
{
    int sts;
    struct _iosb * iosb=kmalloc(sizeof(struct _iosb),GFP_KERNEL);
    struct _cdrp * cdrp;
    struct _scs * scs = packet;
    struct _scs1 * scs1 = scs;
    struct _ppd * ppd = scs;
    struct _cdt * cdt = &cdtl[scs->scs$l_dst_conid];
    struct _mscp_basic_pkt * basic = ((unsigned long)packet) + sizeof(*scs);
    void * next = basic;
    struct _transfer_commands * trans = basic;
    unsigned short int chan;//wasint chan =get_mscp_chan(cdt->cdt$l_condat);
    char * nam;
    $DESCRIPTOR(devnam,"d0a0");
    nam=devnam.dsc$a_pointer;
    nam[1]=basic->mscp$b_caa;
    nam[3]=48+basic->mscp$w_unit;

    exe$assign(&devnam,&chan,0,0,0);

    if (hrbq==0) qhead_init(&hrbq);

    //printk("packet %x %x %x %x\n",packet,ppd,ppd->ppd$b_opc,chan);

    switch (ppd->ppd$b_opc)
    {
    case PPD$C_REQDAT:
        goto read;
        break;
    case PPD$C_SNDDAT:
        goto write;
        break;
    case PPD$C_SNDDG:
        goto mscp;
        break;
    default:
        panic("ppdopc\n");

    }

mscp:
    {
        unsigned long lbn=trans->mscp$l_lbn;
        struct _hrb * hrb=kmalloc(sizeof(struct _hrb),GFP_KERNEL);
        cdrp = vmalloc(sizeof(struct _cdrp));
        memset(cdrp,0,sizeof(struct _cdrp));
        memset(hrb,0,sizeof(struct _hrb));
        hrb->hrb$l_lbn=lbn;
        hrb->hrb$l_cmd_time=scs1->scs$l_rspid; // wrong, but have to have some id...
        insque(hrb,&hrbq);
        if (basic->mscp$b_opcode == MSCP$K_OP_WRITE)
        {
            basic->mscp$b_opcode = MSCP$K_OP_END;
            cdrp->cdrp$w_cdrpsize=600;
            cdrp->cdrp$l_cdt=c;
            cdrp->cdrp$l_msg_buf=basic;
            cdrp->cdrp$l_xct_len=512;
            //scs_std$senddg(0,600,cdrp);
        }
        if (basic->mscp$b_opcode == MSCP$K_OP_READ)
        {
        }
        if (basic->mscp$b_opcode == MSCP$K_OP_GTUNT)
        {
            $DESCRIPTOR(disk,"dqa0");
            char * str = disk.dsc$a_pointer;
            str[3]='0'+basic->mscp$w_unit;
            long long dummy;
            int sts=ioc$search(&dummy, &disk);
            struct _gtunt * gtunt = kmalloc(sizeof(struct _gtunt),GFP_KERNEL);
            memset(gtunt, 0, sizeof(struct _gtunt));
            struct _mscp_basic_pkt * gtbas = gtunt;
            gtbas->mscp$b_opcode=MSCP$K_OP_GTUNT|MSCP$M_OP_END;
            gtbas->mscp$w_unit=basic->mscp$w_unit;
            if (sts==SS$_NORMAL)
                gtbas->mscp$w_status=MSCP$K_ST_SUCC;
            else
                gtbas->mscp$w_status=MSCP$K_ST_OFFLN;

            struct _cdrp * cdrp = vmalloc(sizeof(struct _cdrp));
            memset(cdrp,0,sizeof(struct _cdrp));

            cdrp->cdrp$w_cdrpsize=400;
            cdrp->cdrp$l_rspid=scs_std$alloc_rspid(0,0,cdrp,0);
            cdrp->cdrp$l_cdt=find_mscp_cdt();
            cdrp->cdrp$l_msg_buf=gtunt;
            cdrp->cdrp$l_xct_len=sizeof(struct _gtunt);
            if (cdrp->cdrp$l_cdt==0)
            {
                printk("gtunt srv no cdt\n");
                return;
            }
            scs_std$senddg(0,400,cdrp);

        }
        if (basic->mscp$b_opcode == (MSCP$K_OP_GTUNT|MSCP$M_OP_END) )
        {
            if (basic->mscp$w_status==MSCP$K_ST_SUCC)
            {
                struct _ddb * ddb;
                struct _ucb * ucb;
                char dev[16];
                extern struct _sb othersb;
                char len=othersb.sb$t_nodename[0];
                memcpy(dev,&othersb.sb$t_nodename[1],len);
                dev[len]='$';
                dev[len+1]='d';
                dev[len+2]='q';
                dev[len+3]='a';
                dev[len+4]='0';//+basic->mscp$w_unit;
                struct dsc$descriptor disk;
                disk.dsc$a_pointer=dev;
                disk.dsc$w_length=len+5;
                long long dummy;
                int sts=ioc$search(&dummy, &disk);
                if (sts!=SS$_NORMAL)
                {
                    ddb=ide_iodb_vmsinit(1);
                    du_iodb_clu_vmsinit(ddb->ddb$ps_ucb);
                    struct _ucb * ucb = ddb->ddb$ps_ucb;
                    ucb->ucb$l_ddt=&du$ddt;
                    if (ddb)
                        ddb->ddb$ps_sb=&othersb;
                }
                else
                {
                    long *l=&dummy;
                    struct _ucb * u = *l;
                    ddb = u->ucb$l_ddb;
                }
                int i=basic->mscp$w_unit;
                $DESCRIPTOR(d, "dqa0");
                char * c= d.dsc$a_pointer;
                c[3]='0'+i;
                ucb = ide_iodbunit_vmsinit(ddb,i,&d);
                ucb->ucb$l_ddt=&du$ddt;
                ((struct _mscp_ucb *)ucb)->ucb$w_mscpunit=ucb->ucb$w_unit;
                printk("UCB MSCPUNIT %x\n",((struct _mscp_ucb *)ucb)->ucb$w_mscpunit);
            }
        }
    }
    return;

read:
    {
        char * buf = vmalloc(1024);
        struct _irp * i=kmalloc(sizeof(struct _irp),GFP_KERNEL);
        struct _ucb * u;
        struct _hrb * hrb = find_hrb(scs1->scs$l_rspid);
        //printk("mscpread\n");
        remque(hrb,hrb);
        memset(i,0,sizeof(struct _irp));
        iosb->iosb$w_status=0;
        i->irp$b_type=DYN$C_IRP;
        i->irp$w_chan=chan;
        i->irp$l_func=IO$_READLBLK;
        i->irp$l_iosb=iosb;
        i->irp$l_qio_p1=buf;
        i->irp$l_qio_p2=512;
        i->irp$l_qio_p3=hrb->hrb$l_lbn;
        ((struct _acb *)i)->acb$b_rmod|=ACB$M_NODELETE; // bad idea to free this
        //printk("chan %x\n",chan);
        u=ctl$gl_ccbbase[chan].ccb$l_ucb;
        i->irp$l_ucb=u;
        i->irp$l_pid=current->pcb$l_pid;
        i->irp$l_sts|=IRP$M_BUFIO;
        i->irp$l_astprm=i;
        i->irp$l_ast=returnsome;
        i->irp$l_cdt=c;
        i->irp$l_rspid=scs1->scs$l_rspid;
        exe$insioq(i,u);
    }
    exe$dassgn(chan);
    return;
write:
    {
        struct _irp * i=kmalloc(sizeof(struct _irp),GFP_KERNEL);
        struct _ucb * u;
        struct _hrb * hrb = find_hrb(scs1->scs$l_rspid);
        //printk("mscpwrite\n");
        remque(hrb,hrb);
        memset(i,0,sizeof(struct _irp));
        iosb->iosb$w_status=0;
        i->irp$b_type=DYN$C_IRP;
        i->irp$w_chan=chan;
        i->irp$l_func=IO$_WRITELBLK;
        i->irp$l_iosb=iosb;
        i->irp$l_qio_p1=next;
        i->irp$l_qio_p2=512;
        i->irp$l_qio_p3=hrb->hrb$l_lbn;
        //printk("chan %x\n",chan);
        u=ctl$gl_ccbbase[chan].ccb$l_ucb;
        i->irp$l_ucb=u;
        i->irp$l_pid=current->pcb$l_pid;
        i->irp$l_sts|=IRP$M_BUFIO;
        i->irp$l_astprm=i;
        i->irp$l_ast=returnsome;
        i->irp$l_cdt=c;
        i->irp$l_rspid=scs1->scs$l_rspid;
        exe$insioq(i,u);
    }
    exe$dassgn(chan);
    return;
}