diff --git a/pkg/api/types.go b/pkg/api/types.go index de303e7..7238de3 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -349,7 +349,7 @@ type BackingStore interface { Size(dev *SCSILu) uint64 Read(offset, tl int64) ([]byte, error) Write([]byte, int64) error - DataSync() error + DataSync(offset, tl int64) error DataAdvise(int64, int64, uint32) error Unmap([]UnmapBlockDescriptor) error } diff --git a/pkg/scsi/backingstore.go b/pkg/scsi/backingstore.go index f96f15f..65df989 100644 --- a/pkg/scsi/backingstore.go +++ b/pkg/scsi/backingstore.go @@ -87,8 +87,13 @@ func bsPerformCommand(bs api.BackingStore, cmd *api.SCSICommand) (err error, key doWrite = true goto write case api.SYNCHRONIZE_CACHE, api.SYNCHRONIZE_CACHE_16: - if err = bs.DataSync(); err != nil { - panic(err) + if tl == 0 { + tl = int64(lu.Size - offset) + } + if err = bs.DataSync(int64(offset), tl); err != nil { + key = MEDIUM_ERROR + asc = ASC_READ_ERROR + break } break case api.WRITE_VERIFY, api.WRITE_VERIFY_12, api.WRITE_VERIFY_16: @@ -161,7 +166,7 @@ write: goto sense } if ((opcode != api.WRITE_6) && (scb[1]&0x8 != 0)) || (pg.Data[0]&0x04 == 0) { - if err = bs.DataSync(); err != nil { + if err = bs.DataSync(int64(offset), tl); err != nil { key = MEDIUM_ERROR asc = ASC_READ_ERROR goto sense diff --git a/pkg/scsi/backingstore/cephstore/cephstore_linux.go b/pkg/scsi/backingstore/cephstore/cephstore_linux.go index 2b48888..078cd67 100644 --- a/pkg/scsi/backingstore/cephstore/cephstore_linux.go +++ b/pkg/scsi/backingstore/cephstore/cephstore_linux.go @@ -141,7 +141,7 @@ func (bs *CephBackingStore) Write(wbuf []byte, offset int64) error { return err } -func (bs *CephBackingStore) DataSync() error { +func (bs *CephBackingStore) DataSync(offset, tl int64) error { err := bs.image.Flush() return err } diff --git a/pkg/scsi/backingstore/common.go b/pkg/scsi/backingstore/common.go index 6141833..41cccc4 100644 --- a/pkg/scsi/backingstore/common.go +++ b/pkg/scsi/backingstore/common.go @@ -106,7 +106,7 @@ func (bs *FileBackingStore) Write(wbuf []byte, offset int64) error { return nil } -func (bs *FileBackingStore) DataSync() error { +func (bs *FileBackingStore) DataSync(offset, tl int64) error { return util.Fdatasync(bs.file) } diff --git a/pkg/scsi/backingstore/null.go b/pkg/scsi/backingstore/null.go index 8c74739..ee7920e 100644 --- a/pkg/scsi/backingstore/null.go +++ b/pkg/scsi/backingstore/null.go @@ -67,7 +67,7 @@ func (bs *NullBackingStore) Write(wbuf []byte, offset int64) error { return nil } -func (bs *NullBackingStore) DataSync() error { +func (bs *NullBackingStore) DataSync(offset, tl int64) error { return nil } diff --git a/pkg/scsi/sbc.go b/pkg/scsi/sbc.go index d0a51bb..627234c 100644 --- a/pkg/scsi/sbc.go +++ b/pkg/scsi/sbc.go @@ -708,5 +708,19 @@ func SBCServiceAction(host int, cmd *api.SCSICommand) api.SAMStat { * 5.19 - SYNCHRONIZE CACHE (16) */ func SBCSyncCache(host int, cmd *api.SCSICommand) api.SAMStat { + scb := cmd.SCB + lba := getSCSIReadWriteOffset(scb) + tl := getSCSIReadWriteCount(scb) + dev := cmd.Device + + cmd.Offset = lba << dev.BlockShift + cmd.TL = tl << dev.BlockShift + + err, key, asc := bsPerformCommand(dev.Storage, cmd) + if err != nil { + BuildSenseData(cmd, key, asc) + return api.SAMStatCheckCondition + } + return api.SAMStatGood }