update ModeSense6 function
This commit is contained in:
106
pkg/scsi/spc.go
106
pkg/scsi/spc.go
@@ -354,7 +354,7 @@ func SPCReportLuns(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
|
||||
// LUN list length
|
||||
buf.Write(util.MarshalUint32(availLength))
|
||||
cmd.InSDBBuffer.Resid = int32(actualLength)
|
||||
cmd.InSDBBuffer.Resid = uint32(actualLength)
|
||||
|
||||
// Skip through to byte 4, Reserved
|
||||
for i := 0; i < 4; i++ {
|
||||
@@ -474,13 +474,17 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
var (
|
||||
scb = cmd.SCB.Bytes()
|
||||
mode6 = (scb[0] == 0x1a)
|
||||
dbd = scb[1] & 0x8 /* Disable Block Descriptors */
|
||||
dbd = scb[1] & 0x8 // Disable Block Descriptors
|
||||
pcode = scb[2] & 0x3f
|
||||
pctrl = (scb[2] & 0xc0) >> 6
|
||||
subpcode = scb[3]
|
||||
blkDesctionLen = 0
|
||||
key = ILLEGAL_REQUEST
|
||||
asc = ASC_INVALID_FIELD_IN_CDB
|
||||
data []byte
|
||||
allocLen uint32
|
||||
remainLen uint32
|
||||
i uint32
|
||||
)
|
||||
if dbd == 0 {
|
||||
blkDesctionLen = 8
|
||||
@@ -489,11 +493,91 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
asc = ASC_SAVING_PARMS_UNSUP
|
||||
goto sense
|
||||
}
|
||||
_ = dbd
|
||||
_ = pcode
|
||||
_ = subpcode
|
||||
_ = mode6
|
||||
_ = blkDesctionLen
|
||||
if mode6 {
|
||||
allocLen = uint32(scb[4])
|
||||
// set header
|
||||
for i = 0; i < 4 && i < allocLen; i++ {
|
||||
data = append(data, 0x00)
|
||||
}
|
||||
} else {
|
||||
allocLen = uint32(util.GetUnalignedUint16(scb[7:9]))
|
||||
// set header
|
||||
for i = 0; i < 8 && i < allocLen; i++ {
|
||||
data = append(data, 0x00)
|
||||
}
|
||||
}
|
||||
remainLen = allocLen - uint32(len(data))
|
||||
if dbd == 0 && remainLen >= 8 {
|
||||
data = append(data, cmd.Device.ModeBlockDescriptor...)
|
||||
}
|
||||
if pcode == 0x3f {
|
||||
for _, pg := range cmd.Device.ModePages {
|
||||
if pg.SubPageCode == 0 {
|
||||
if remainLen < 2+uint32(pg.Size) {
|
||||
break
|
||||
}
|
||||
data = append(data, pg.PageCode)
|
||||
data = append(data, pg.Size)
|
||||
} else {
|
||||
if remainLen < 4+uint32(pg.Size) {
|
||||
break
|
||||
}
|
||||
data = append(data, pg.PageCode|0x40)
|
||||
data = append(data, pg.SubPageCode)
|
||||
data = append(data, (pg.Size>>8)&0xff)
|
||||
data = append(data, pg.Size&0xff)
|
||||
}
|
||||
if pctrl == 1 {
|
||||
data = append(data, pg.Data[pg.Size:]...)
|
||||
} else {
|
||||
data = append(data, pg.Data[:pg.Size]...)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var pg *api.ModePage
|
||||
for _, p := range cmd.Device.ModePages {
|
||||
if p.PageCode == pcode && p.SubPageCode == subpcode {
|
||||
pg = &p
|
||||
break
|
||||
}
|
||||
}
|
||||
if pg == nil {
|
||||
goto sense
|
||||
}
|
||||
if remainLen >= 2+uint32(pg.Size) {
|
||||
if pg.SubPageCode == 0 {
|
||||
data = append(data, pg.PageCode)
|
||||
data = append(data, pg.Size)
|
||||
if pctrl == 1 {
|
||||
data = append(data, pg.Data[pg.Size:]...)
|
||||
} else {
|
||||
data = append(data, pg.Data[:pg.Size]...)
|
||||
}
|
||||
} else if remainLen >= 4+uint32(pg.Size) {
|
||||
data = append(data, pg.PageCode|0x40)
|
||||
data = append(data, pg.SubPageCode)
|
||||
data = append(data, (pg.Size>>8)&0xff)
|
||||
data = append(data, pg.Size&0xff)
|
||||
if pctrl == 1 {
|
||||
data = append(data, pg.Data[pg.Size:]...)
|
||||
} else {
|
||||
data = append(data, pg.Data[:pg.Size]...)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if mode6 {
|
||||
data[0] = uint8(len(data) - 1)
|
||||
data[3] = uint8(blkDesctionLen)
|
||||
} else {
|
||||
data[0] = uint8((len(data) - 2) >> 8)
|
||||
data[1] = uint8(len(data) - 2)
|
||||
data[6] = uint8(blkDesctionLen >> 8)
|
||||
data[7] = uint8(blkDesctionLen)
|
||||
}
|
||||
cmd.InSDBBuffer.Resid = uint32(len(data))
|
||||
cmd.InSDBBuffer.Buffer = bytes.NewBuffer(data)
|
||||
return api.SAMStatGood
|
||||
sense:
|
||||
BuildSenseData(cmd, key, asc)
|
||||
@@ -660,7 +744,7 @@ func SPCPRReadKeys(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
cmd.InSDBBuffer.Buffer = bytes.NewBuffer(data)
|
||||
}
|
||||
|
||||
cmd.InSDBBuffer.Resid = int32(additionLength)
|
||||
cmd.InSDBBuffer.Resid = uint32(additionLength)
|
||||
return api.SAMStatGood
|
||||
sense:
|
||||
cmd.InSDBBuffer.Resid = 0
|
||||
@@ -715,7 +799,7 @@ func SPCPRReadReservation(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
cmd.InSDBBuffer.Buffer = bytes.NewBuffer(data)
|
||||
}
|
||||
|
||||
cmd.InSDBBuffer.Resid = int32(additionLength)
|
||||
cmd.InSDBBuffer.Resid = uint32(additionLength)
|
||||
return api.SAMStatGood
|
||||
|
||||
sense:
|
||||
@@ -760,7 +844,7 @@ func SPCPRReportCapabilities(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
} else {
|
||||
actualLength = availLength
|
||||
}
|
||||
cmd.InSDBBuffer.Resid = int32(actualLength)
|
||||
cmd.InSDBBuffer.Resid = uint32(actualLength)
|
||||
return api.SAMStatGood
|
||||
sense:
|
||||
cmd.InSDBBuffer.Resid = 0
|
||||
@@ -1257,7 +1341,7 @@ func SPCRequestSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
if cmd.SenseBuffer != nil {
|
||||
data.Write(cmd.SenseBuffer.Bytes()[:actualLength])
|
||||
}
|
||||
cmd.InSDBBuffer.Resid = int32(actualLength)
|
||||
cmd.InSDBBuffer.Resid = uint32(actualLength)
|
||||
cmd.InSDBBuffer.Buffer = data
|
||||
|
||||
// reset sense buffer in cmnd
|
||||
|
||||
Reference in New Issue
Block a user