Merge pull request #80 from datomia/fix-write-cache
MODE SENSE: ALLOCATION LENGTH shouldn't affect a size in response
This commit is contained in:
@@ -101,7 +101,7 @@ func (sbc SBCSCSIDeviceProtocol) InitLu(lu *api.SCSILu) error {
|
||||
// Disconnect page
|
||||
pages = append(pages, api.ModePage{2, 0, 14, []byte{0x80, 0x80, 0, 0xa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}})
|
||||
// Caching Page
|
||||
pages = append(pages, api.ModePage{8, 0, 18, []byte{0x14, 0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0, 0x4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}})
|
||||
pages = append(pages, api.ModePage{8, 0, 18, []byte{0x14, 0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0}})
|
||||
|
||||
// Control page
|
||||
pages = append(pages, api.ModePage{0x0a, 0, 10, []byte{2, 0x10, 0, 0, 0, 0, 0, 0, 2, 0, 0x08, 0, 0, 0, 0, 0, 0, 0}})
|
||||
|
||||
@@ -476,9 +476,9 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
asc = ASC_INVALID_FIELD_IN_CDB
|
||||
data []byte
|
||||
allocLen uint32
|
||||
remainLen uint32
|
||||
i uint32
|
||||
)
|
||||
|
||||
if dbd == 0 {
|
||||
blkDesctionLen = 8
|
||||
}
|
||||
@@ -499,22 +499,15 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
data = append(data, 0x00)
|
||||
}
|
||||
}
|
||||
remainLen = allocLen - uint32(len(data))
|
||||
if dbd == 0 && remainLen >= 8 {
|
||||
if dbd == 0 {
|
||||
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)
|
||||
@@ -537,27 +530,24 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
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 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 {
|
||||
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 {
|
||||
@@ -569,8 +559,8 @@ func SPCModeSense(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||
data[6] = uint8(blkDesctionLen >> 8)
|
||||
data[7] = uint8(blkDesctionLen)
|
||||
}
|
||||
if rlen := uint32(len(data)); rlen < allocLen {
|
||||
cmd.InSDBBuffer.Resid = rlen
|
||||
if rlen := uint32(len(data)); rlen > allocLen {
|
||||
cmd.InSDBBuffer.Resid = allocLen
|
||||
}
|
||||
copy(cmd.InSDBBuffer.Buffer, data)
|
||||
return api.SAMStatGood
|
||||
|
||||
Reference in New Issue
Block a user