Merge pull request #84 from datomia/synchronize-cache
provide offset and tl to DataSync
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user