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
|
Size(dev *SCSILu) uint64
|
||||||
Read(offset, tl int64) ([]byte, error)
|
Read(offset, tl int64) ([]byte, error)
|
||||||
Write([]byte, int64) error
|
Write([]byte, int64) error
|
||||||
DataSync() error
|
DataSync(offset, tl int64) error
|
||||||
DataAdvise(int64, int64, uint32) error
|
DataAdvise(int64, int64, uint32) error
|
||||||
Unmap([]UnmapBlockDescriptor) error
|
Unmap([]UnmapBlockDescriptor) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,8 +87,13 @@ func bsPerformCommand(bs api.BackingStore, cmd *api.SCSICommand) (err error, key
|
|||||||
doWrite = true
|
doWrite = true
|
||||||
goto write
|
goto write
|
||||||
case api.SYNCHRONIZE_CACHE, api.SYNCHRONIZE_CACHE_16:
|
case api.SYNCHRONIZE_CACHE, api.SYNCHRONIZE_CACHE_16:
|
||||||
if err = bs.DataSync(); err != nil {
|
if tl == 0 {
|
||||||
panic(err)
|
tl = int64(lu.Size - offset)
|
||||||
|
}
|
||||||
|
if err = bs.DataSync(int64(offset), tl); err != nil {
|
||||||
|
key = MEDIUM_ERROR
|
||||||
|
asc = ASC_READ_ERROR
|
||||||
|
break
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case api.WRITE_VERIFY, api.WRITE_VERIFY_12, api.WRITE_VERIFY_16:
|
case api.WRITE_VERIFY, api.WRITE_VERIFY_12, api.WRITE_VERIFY_16:
|
||||||
@@ -161,7 +166,7 @@ write:
|
|||||||
goto sense
|
goto sense
|
||||||
}
|
}
|
||||||
if ((opcode != api.WRITE_6) && (scb[1]&0x8 != 0)) || (pg.Data[0]&0x04 == 0) {
|
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
|
key = MEDIUM_ERROR
|
||||||
asc = ASC_READ_ERROR
|
asc = ASC_READ_ERROR
|
||||||
goto sense
|
goto sense
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ func (bs *CephBackingStore) Write(wbuf []byte, offset int64) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *CephBackingStore) DataSync() error {
|
func (bs *CephBackingStore) DataSync(offset, tl int64) error {
|
||||||
err := bs.image.Flush()
|
err := bs.image.Flush()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ func (bs *FileBackingStore) Write(wbuf []byte, offset int64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *FileBackingStore) DataSync() error {
|
func (bs *FileBackingStore) DataSync(offset, tl int64) error {
|
||||||
return util.Fdatasync(bs.file)
|
return util.Fdatasync(bs.file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func (bs *NullBackingStore) Write(wbuf []byte, offset int64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *NullBackingStore) DataSync() error {
|
func (bs *NullBackingStore) DataSync(offset, tl int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -708,5 +708,19 @@ func SBCServiceAction(host int, cmd *api.SCSICommand) api.SAMStat {
|
|||||||
* 5.19 - SYNCHRONIZE CACHE (16)
|
* 5.19 - SYNCHRONIZE CACHE (16)
|
||||||
*/
|
*/
|
||||||
func SBCSyncCache(host int, cmd *api.SCSICommand) api.SAMStat {
|
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
|
return api.SAMStatGood
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user