UFS擦除相关的操作有四种,Erase,discard,purge和wipe device.Erase和discard与eMMC erase和discard很接近,purge就类似eMMC中的Sanitize.Wipe device就是全盘擦除。
如果把擦除指令比作丢弃垃圾的话,erase就像丢弃日记本,丢弃了就不希望会再被找到。discard就像丢弃饮料瓶,只是不需要了而已,并不在意是否会被捡回。而purge就是下达指令,开始彻底粉碎已经丢弃的数据。
一 Erase
Erase时device所做的操作其实是解除映射,成功erase的LBA host就不能再读出其中的数据。
Erase最小size是write最小单元。
Erase靠unmap命令实现,另一个条件是bProvisioningType(unit descriptor) 的值要被设定为03h,即TPRZ(Thin Provisioning Return Zero)设定为1.
二 Discard
Discard和erase很像,它们的区别是discard过的LBA,host再去读有可能返回任何数据,包括原数据。
Discard CMD 也是靠unmap CMD实现。只是bProvisioningType(unit descriptor) 的值要被设定为02h,即TPRZ(Thin Provisioning Return Zero)设定为0.
三 Purge
Purge其实像是eMMC里的sanitize操作,是从物理上擦除那些unmapped的物理地址。当然这个过程中会伴随这GC 和数据搬移。
Purge option通过Query Request实现。是如下一个flag和一个attribute。
R/W | Reset Value | Description | |
fPurgeEnable flag | WRITE ONLY | 0 | 1. =1时,enable purge operation 2. 只有当每一个lu的cmd queue都为空时才可以set flag 3.当purge操作结束或者有错误发生时,device会自动clear这个flag 4.host也可以clear flag如果要中断现在这个操作 |
bPurgeStatus Attribute | READ ONLY | 00h | 00h:Idle(purge operation disabled) 01h:purge operation is in progress 02h:purge operation stopped prematurely by the host 03h:purge opeartion finished successfully 04h:purge opeartion failed due to logical unit queue not empty 05h:purge operation general fail other values shall not be set. |
在协议上的有关于purge操作各种情况下的描述和状态转换图,为避免过多文字,这里我总结了一个表格:
start status | device condition | operation | waht will happen | end status |
fPurgeEnable = 00h bPurgeStatus = 00h |
LU queue is empty | set fPurgeEnable | set success | fPurgeEnable = 01h bPurgeStatus=01h |
fPurgeEnable = 00h bPurgeStatus = 00h |
LU queue is not empty | set fPurgeEnable | set fail | fpurgeEnable = 00h bPurgeStatus = 04h |
fPurgeEnable = 01h bPurgeStatus = 01h |
purge ongoing | purge finish successfully | - | fPurgeEnable = 00h bPurgeStatus = 03h |
fPurgeEnable = 01h bPurgeStatus = 01h |
purge ongoing | purge general fail | - | fPurgeEnable = 00h bPurgeStatus = 05h |
fPurgeEnable = 01h bPurgeStatus = 01h |
purge ongoing | clear fPurgeEnable |
purge stopped | fPurgeEnable = 00h bPurgeStatus = 02h |
bPurgeStatus = 02h/03h/04h/05h | - | host read | - | bPurgeStatus = 00h |
四 wipe device
Wipe device的操作是通过FORMAT UNIT command来实现的。这个命令host应该不是很常用。
如果我们发了FORMAT UNIT command给Device Well Known logical unit,那么device就会format除RPMB Well-known LU之外的所有enabled LU.
如果有某一个LU是Write Protect的,那么format unit命令就会执行失败。原数据不会被更改。