|  | The writecache target caches writes on persistent memory or on SSD. It | 
|  | doesn't cache reads because reads are supposed to be cached in page cache | 
|  | in normal RAM. | 
|  |  | 
|  | When the device is constructed, the first sector should be zeroed or the | 
|  | first sector should contain valid superblock from previous invocation. | 
|  |  | 
|  | Constructor parameters: | 
|  | 1. type of the cache device - "p" or "s" | 
|  | p - persistent memory | 
|  | s - SSD | 
|  | 2. the underlying device that will be cached | 
|  | 3. the cache device | 
|  | 4. block size (4096 is recommended; the maximum block size is the page | 
|  | size) | 
|  | 5. the number of optional parameters (the parameters with an argument | 
|  | count as two) | 
|  | start_sector n		(default: 0) | 
|  | offset from the start of cache device in 512-byte sectors | 
|  | high_watermark n	(default: 50) | 
|  | start writeback when the number of used blocks reach this | 
|  | watermark | 
|  | low_watermark x		(default: 45) | 
|  | stop writeback when the number of used blocks drops below | 
|  | this watermark | 
|  | writeback_jobs n	(default: unlimited) | 
|  | limit the number of blocks that are in flight during | 
|  | writeback. Setting this value reduces writeback | 
|  | throughput, but it may improve latency of read requests | 
|  | autocommit_blocks n	(default: 64 for pmem, 65536 for ssd) | 
|  | when the application writes this amount of blocks without | 
|  | issuing the FLUSH request, the blocks are automatically | 
|  | commited | 
|  | autocommit_time ms	(default: 1000) | 
|  | autocommit time in milliseconds. The data is automatically | 
|  | commited if this time passes and no FLUSH request is | 
|  | received | 
|  | fua			(by default on) | 
|  | applicable only to persistent memory - use the FUA flag | 
|  | when writing data from persistent memory back to the | 
|  | underlying device | 
|  | nofua | 
|  | applicable only to persistent memory - don't use the FUA | 
|  | flag when writing back data and send the FLUSH request | 
|  | afterwards | 
|  | - some underlying devices perform better with fua, some | 
|  | with nofua. The user should test it | 
|  |  | 
|  | Status: | 
|  | 1. error indicator - 0 if there was no error, otherwise error number | 
|  | 2. the number of blocks | 
|  | 3. the number of free blocks | 
|  | 4. the number of blocks under writeback | 
|  |  | 
|  | Messages: | 
|  | flush | 
|  | flush the cache device. The message returns successfully | 
|  | if the cache device was flushed without an error | 
|  | flush_on_suspend | 
|  | flush the cache device on next suspend. Use this message | 
|  | when you are going to remove the cache device. The proper | 
|  | sequence for removing the cache device is: | 
|  | 1. send the "flush_on_suspend" message | 
|  | 2. load an inactive table with a linear target that maps | 
|  | to the underlying device | 
|  | 3. suspend the device | 
|  | 4. ask for status and verify that there are no errors | 
|  | 5. resume the device, so that it will use the linear | 
|  | target | 
|  | 6. the cache device is now inactive and it can be deleted |