M boot/aux.c => boot/aux.c +0 -1
@@ 120,7 120,6 @@ srvcreate(char *name, int fd)
int f;
char buf[2*NAMELEN];
- print("post(%s)...", name);
srvname = strrchr(name, '/');
if(srvname)
srvname++;
M port/auth.c => port/auth.c +50 -39
@@ 96,58 96,71 @@ sysfsession(ulong *arg)
{
int i, n;
Chan *c;
- Fcall *f;
- char *buf;
Crypt *cp;
Session *s;
Ticketreq tr;
+ Fcall f;
+ char buf[MAXMSG];
validaddr(arg[1], TICKREQLEN, 1);
- f = malloc(sizeof(Fcall));
- if(f == 0)
- error(Enomem);
- buf = malloc(MAXMSG);
- if(buf == 0){
- free(f);
- error(Enomem);
- }
c = fdtochan(arg[0], OWRITE, 0, 1);
- s = 0;
- if(waserror()) {
- if(s)
- free(s);
+ if(waserror()){
close(c);
- free(buf);
- free(f);
nexterror();
}
+
+ /*
+ * if two processes get here at the same
+ * time with no session exchanged, we have
+ * a race.
+ */
s = c->session;
if(s == 0){
- /* exchange a session message with the server */
+ /*
+ * no session exchanged yet
+ */
s = malloc(sizeof(Session));
if(s == 0)
error(Enomem);
memset(s, 0, sizeof(Session));
- for(i = 0; i < CHALLEN; i++)
- s->cchal[i] = nrand(256);
- f->tag = NOTAG;
- f->type = Tsession;
- memmove(f->chal, s->cchal, CHALLEN);
- n = convS2M(f, buf);
- if((*devtab[c->type].write)(c, buf, n, 0) != n)
- error(Emountrpc);
- dkhack:
- n = (*devtab[c->type].read)(c, buf, MAXMSG, 0);
- if(n == 2 && buf[0] == 'O' && buf[1] == 'K')
- goto dkhack;
- if(convM2S(buf, f, n) == 0)
- error(Emountrpc);
- if(f->type == Rsession){
- memmove(s->schal, f->chal, CHALLEN);
- memmove(s->authid, f->authid, NAMELEN);
- memmove(s->authdom, f->authdom, DOMLEN);
+
+ /*
+ * Exchange a session message with the server.
+ * If an error occurs reading or writing,
+ * assume this is a mount of a mount and turn off
+ * authentication.
+ */
+ if(!waserror()){
+ for(i = 0; i < CHALLEN; i++)
+ s->cchal[i] = nrand(256);
+ f.tag = NOTAG;
+ f.type = Tsession;
+ memmove(f.chal, s->cchal, CHALLEN);
+ n = convS2M(&f, buf);
+ if((*devtab[c->type].write)(c, buf, n, 0) != n)
+ error(Emountrpc);
+ n = (*devtab[c->type].read)(c, buf, sizeof buf, 0);
+ if(n == 2 && buf[0] == 'O' && buf[1] == 'K')
+ n = (*devtab[c->type].read)(c, buf, sizeof buf, 0);
+ poperror();
+ if(convM2S(buf, &f, n) == 0){
+ free(s);
+ error(Emountrpc);
+ }
+ switch(f.type){
+ case Rsession:
+ memmove(s->schal, f.chal, CHALLEN);
+ memmove(s->authid, f.authid, NAMELEN);
+ memmove(s->authdom, f.authdom, DOMLEN);
+ break;
+ case Rerror:
+ free(s);
+ error(f.ename);
+ default:
+ free(s);
+ error(Emountrpc);
+ }
}
- s->cid = 0;
c->session = s;
}
@@ 172,10 185,8 @@ sysfsession(ulong *arg)
memmove(tr.hostid, eve, NAMELEN);
convTR2M(&tr, (char*)arg[1]);
- poperror();
close(c);
- free(buf);
- free(f);
+ poperror();
return 0;
}
M port/devscsi.c => port/devscsi.c +48 -10
@@ 297,6 297,7 @@ scsicmd(int dev, int cmdbyte, Scsibuf *b, long size)
cmd->cmd.ptr = cmd->cmd.base;
memset(cmd->cmdblk, 0, sizeof cmd->cmdblk);
cmd->cmdblk[0] = cmdbyte;
+ cmd->cmdblk[1] = cmd->lun << 5;
switch(cmdbyte >> 5){
case 0:
cmd->cmd.lim = &cmd->cmdblk[6];
@@ 497,16 498,34 @@ int
scsibread(int dev, Scsibuf *b, long n, long blocksize, long blockno)
{
Scsi *cmd;
+ int cmdbyte;
- cmd = scsicmd(dev, ScsiRead, b, n*blocksize);
+ if(blockno <= 0x1fffff && n <= 256)
+ cmdbyte = ScsiRead;
+ else
+ cmdbyte = ScsiExtread;
+
+ cmd = scsicmd(dev, cmdbyte, b, n*blocksize);
if(waserror()){
qunlock(cmd);
nexterror();
}
- cmd->cmdblk[1] = blockno >> 16;
- cmd->cmdblk[2] = blockno >> 8;
- cmd->cmdblk[3] = blockno;
- cmd->cmdblk[4] = n;
+ switch(cmdbyte){
+ case ScsiRead:
+ cmd->cmdblk[1] |= blockno >> 16;
+ cmd->cmdblk[2] = blockno >> 8;
+ cmd->cmdblk[3] = blockno;
+ cmd->cmdblk[4] = n;
+ break;
+ default:
+ cmd->cmdblk[2] = blockno >> 24;
+ cmd->cmdblk[3] = blockno >> 16;
+ cmd->cmdblk[4] = blockno >> 8;
+ cmd->cmdblk[5] = blockno;
+ cmd->cmdblk[7] = n>>8;
+ cmd->cmdblk[8] = n;
+ break;
+ }
scsiexec(cmd, ScsiIn);
n = cmd->data.ptr - cmd->data.base;
poperror();
@@ 519,15 538,34 @@ scsibwrite(int dev, Scsibuf *b, long n, long blocksize, long blockno)
{
Scsi *cmd;
- cmd = scsicmd(dev, ScsiWrite, b, n*blocksize);
+ int cmdbyte;
+
+ if(blockno <= 0x1fffff && n <= 256)
+ cmdbyte = ScsiWrite;
+ else
+ cmdbyte = ScsiExtwrite;
+
+ cmd = scsicmd(dev, cmdbyte, b, n*blocksize);
if(waserror()){
qunlock(cmd);
nexterror();
}
- cmd->cmdblk[1] = blockno >> 16;
- cmd->cmdblk[2] = blockno >> 8;
- cmd->cmdblk[3] = blockno;
- cmd->cmdblk[4] = n;
+ switch(cmdbyte){
+ case ScsiWrite:
+ cmd->cmdblk[1] |= blockno >> 16;
+ cmd->cmdblk[2] = blockno >> 8;
+ cmd->cmdblk[3] = blockno;
+ cmd->cmdblk[4] = n;
+ break;
+ default:
+ cmd->cmdblk[2] = blockno >> 24;
+ cmd->cmdblk[3] = blockno >> 16;
+ cmd->cmdblk[4] = blockno >> 8;
+ cmd->cmdblk[5] = blockno;
+ cmd->cmdblk[7] = n>>8;
+ cmd->cmdblk[8] = n;
+ break;
+ }
scsiexec(cmd, ScsiOut);
n = cmd->data.ptr - cmd->data.base;
poperror();
M port/portdat.h => port/portdat.h +2 -0
@@ 231,6 231,8 @@ enum
ScsiGetcap = 0x25,
ScsiRead = 0x08,
ScsiWrite = 0x0a,
+ ScsiExtread = 0x28,
+ ScsiExtwrite = 0x2a,
/* data direction */
ScsiIn = 1,