Merge pull request #84 from datomia/synchronize-cache

provide offset and tl to DataSync
This commit is contained in:
Lei Xue
2019-06-28 08:32:04 +08:00
committed by GitHub
6 changed files with 26 additions and 7 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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
}