Add option to disable multipath and other fixes
Signed-off-by: Utkarsh Mani Tripathi <utkarsh.tripathi@mayadata.io>
This commit is contained in:
@@ -371,7 +371,6 @@ func (m *ISCSICommand) dataInBytes() []byte {
|
|||||||
copy(buf[36:], util.MarshalUint32(m.DataSN))
|
copy(buf[36:], util.MarshalUint32(m.DataSN))
|
||||||
copy(buf[40:], util.MarshalUint32(m.BufferOffset))
|
copy(buf[40:], util.MarshalUint32(m.BufferOffset))
|
||||||
copy(buf[44:], util.MarshalUint32(m.Resid))
|
copy(buf[44:], util.MarshalUint32(m.Resid))
|
||||||
copy(buf[48:], m.RawData[m.BufferOffset:m.BufferOffset+uint32(m.DataLen)])
|
|
||||||
if m.ExpectedDataLen != 0 {
|
if m.ExpectedDataLen != 0 {
|
||||||
copy(buf[48:], m.RawData[m.BufferOffset:m.BufferOffset+uint32(m.DataLen)])
|
copy(buf[48:], m.RawData[m.BufferOffset:m.BufferOffset+uint32(m.DataLen)])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ type ISCSITargetDriver struct {
|
|||||||
TSIHPoolMutex sync.Mutex
|
TSIHPoolMutex sync.Mutex
|
||||||
isClientConnected bool
|
isClientConnected bool
|
||||||
enableStats bool
|
enableStats bool
|
||||||
SCSIIOCount map[int]int64
|
|
||||||
mu *sync.RWMutex
|
mu *sync.RWMutex
|
||||||
l net.Listener
|
l net.Listener
|
||||||
state uint8
|
state uint8
|
||||||
@@ -77,8 +76,8 @@ func NewISCSITargetDriver(base *scsi.SCSITargetService) (scsi.SCSITargetDriver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if EnableStats {
|
if EnableStats {
|
||||||
driver.SCSIIOCount = map[int]int64{}
|
|
||||||
driver.enableStats = true
|
driver.enableStats = true
|
||||||
|
driver.TargetStats.SCSIIOCount = map[int]int64{}
|
||||||
}
|
}
|
||||||
return driver, nil
|
return driver, nil
|
||||||
}
|
}
|
||||||
@@ -631,10 +630,12 @@ func (s *ISCSITargetDriver) scsiCommandHandler(conn *iscsiConnection) (err error
|
|||||||
switch req.OpCode {
|
switch req.OpCode {
|
||||||
case OpSCSICmd:
|
case OpSCSICmd:
|
||||||
log.Debugf("SCSI Command processing...")
|
log.Debugf("SCSI Command processing...")
|
||||||
if _, ok := s.SCSIIOCount[(int)(req.CDB[0])]; ok != false {
|
if s.enableStats {
|
||||||
s.SCSIIOCount[(int)(req.CDB[0])] += 1
|
if _, ok := s.TargetStats.SCSIIOCount[(int)(req.CDB[0])]; ok != false {
|
||||||
} else {
|
s.TargetStats.SCSIIOCount[(int)(req.CDB[0])] += 1
|
||||||
s.SCSIIOCount[(int)(req.CDB[0])] = 1
|
} else {
|
||||||
|
s.TargetStats.SCSIIOCount[(int)(req.CDB[0])] = 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
scmd := &api.SCSICommand{
|
scmd := &api.SCSICommand{
|
||||||
ITNexusID: conn.session.ITNexus.ID,
|
ITNexusID: conn.session.ITNexus.ID,
|
||||||
|
|||||||
@@ -125,12 +125,12 @@ func bsPerformCommand(bs api.BackingStore, cmd *api.SCSICommand) (err error, key
|
|||||||
bs.DataAdvise(int64(offset), int64(length), util.POSIX_FADV_NOREUSE)
|
bs.DataAdvise(int64(offset), int64(length), util.POSIX_FADV_NOREUSE)
|
||||||
}
|
}
|
||||||
cmd.InSDBBuffer.Resid = uint32(length)
|
cmd.InSDBBuffer.Resid = uint32(length)
|
||||||
copy(cmd.InSDBBuffer.Buffer, rbuf)
|
|
||||||
if cmd.InSDBBuffer.Length < uint32(length) {
|
if cmd.InSDBBuffer.Length < uint32(length) {
|
||||||
key = ILLEGAL_REQUEST
|
key = ILLEGAL_REQUEST
|
||||||
asc = ASC_INVALID_FIELD_IN_CDB
|
asc = ASC_INVALID_FIELD_IN_CDB
|
||||||
goto sense
|
goto sense
|
||||||
}
|
}
|
||||||
|
copy(cmd.InSDBBuffer.Buffer, rbuf)
|
||||||
case api.PRE_FETCH_10, api.PRE_FETCH_16:
|
case api.PRE_FETCH_10, api.PRE_FETCH_16:
|
||||||
err = bs.DataAdvise(int64(offset), tl, util.POSIX_FADV_WILLNEED)
|
err = bs.DataAdvise(int64(offset), tl, util.POSIX_FADV_WILLNEED)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -113,6 +113,6 @@ func (bs *RemBackingStore) DataSync(offset, length int64) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bs *RemBackingStore) Unmap(bd []api.UnmapBlockDescriptor) (err error) {
|
func (bs *RemBackingStore) Unmap(bd []api.UnmapBlockDescriptor) (err error) {
|
||||||
_, err = bs.RemBs.Unmap(int64(bd[0].Offset), int64(bd[0].TL))
|
//_, err = bs.RemBs.Unmap(int64(bd[0].Offset), int64(bd[0].TL))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ import (
|
|||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
EnableMultipath = true
|
||||||
|
)
|
||||||
|
|
||||||
func SPCIllegalOp(host int, cmd *api.SCSICommand) api.SAMStat {
|
func SPCIllegalOp(host int, cmd *api.SCSICommand) api.SAMStat {
|
||||||
BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_OP_CODE)
|
BuildSenseData(cmd, ILLEGAL_REQUEST, ASC_INVALID_OP_CODE)
|
||||||
return api.SAMStatCheckCondition
|
return api.SAMStatCheckCondition
|
||||||
@@ -325,7 +329,11 @@ func SPCInquiry(host int, cmd *api.SCSICommand) api.SAMStat {
|
|||||||
}
|
}
|
||||||
//byte 5
|
//byte 5
|
||||||
//SCCS(0) AAC(0) TPGS(0) 3PC(0) PROTECT(0)
|
//SCCS(0) AAC(0) TPGS(0) 3PC(0) PROTECT(0)
|
||||||
addBuf.WriteByte(INQUIRY_TPGS_IMPLICIT)
|
if EnableMultipath {
|
||||||
|
addBuf.WriteByte(INQUIRY_TPGS_IMPLICIT)
|
||||||
|
} else {
|
||||||
|
addBuf.WriteByte(INQUIRY_TPGS_NO)
|
||||||
|
}
|
||||||
//byte 6
|
//byte 6
|
||||||
//ENCSERV(0) VS(0) MULTIP(0) ADDR16(0)
|
//ENCSERV(0) VS(0) MULTIP(0) ADDR16(0)
|
||||||
addBuf.WriteByte(0x00)
|
addBuf.WriteByte(0x00)
|
||||||
|
|||||||
Reference in New Issue
Block a user