RFLUSH Rethink the Flush

RFLUSH implements a fine-grained flush command in a storage device using an open-source flash development platform to transfers a range of LBAs that need to be flushed and thus enables the storage device to force only a subset of data in its buffer.

The FLUSH command forces all the data in the volatile buffer of the storage device to non-volatile media to achieve persistency.

There are three system calls available to user applications to flush dirty buffers to disk:

  • sync() Allows a process to flush all dirty buffers to disk
  • fsync() Allows a process to flush all blocks that belong to a specific open file to disk
  • fdatasync() Very similar to fsync( ), but doesn’t flush the inode block of the file

Overall, RFLUSH implement a fine-grained flush by identifying related data blocks through inode information of a file. Those related data blocks are usually adjacent because filesystems trend to allocate space sequentially.

Implementation

RFLUSH adds a rflush command supports in an emulated SSD firmware. It then issues such a rflush command from the F2FS through submit_bio_wait.