Hi, I've started to think about implementing the second part of discard support, namely "batch mode" (FITRIM ioctl). And it seems like I don't yet quite understand how to do it. It had been suggested to reuse existing transaction and discard machinery for this feature: create a transaction, allocate+deallocate all possible blocks and then force-commit it. However, the algorithms of discard_atom() are very inoptimal for discarding large amounts of known free space -- a bitmap check is performed for every single discard unit. Repeatedly calling reiser4_alloc_blocks() to allocate every possible block also seems inefficient. And this will still miss those 10% of reserved space, IIUC. So the best way I can imagine is to introduce a new space allocator method, "iterate free space", and discard all reported extents (blkdev_issue_discard() will take care of aligning them properly). With such method, a question arises: how to prevent bitmap modifications and disk writes to free space when such iteration is in progress? Thanks, -- Ivan Shapovalov / intelfx /
Attachment:
signature.asc
Description: This is a digitally signed message part.