Flushing the (page?) cache for a block device

From: Sascha Silbe
Date: Sun Mar 29 2009 - 09:01:38 EST


Hello!

I'd like to do a verification step after writing to a USB stick (block device level, no filesystem involved). For this to work as intended, I need to ensure the reads are not satisfied from blocks still in cache, i.e.: flush "the cache" (page cache IIUC) for the block device in question (and _only_ this device).
Some research resulted in the following options:

1. Open the target file using O_DIRECT while writing.
Doesn't feel like the right thing to do; only want to flush the cache, not circumvent it. Might severly limit performance as writes are synchronous.
Interface isn't very nice (need to ensure alignment to page size in memory).

2. Use posix_fadvise() with POSIX_FADV_DONTNEED.
Probably works with the current kernel (haven't tested yet), but there's absolutely no guarantee.
Interface much better than O_DIRECT.

3. Flush the entire page cache using procfs.
Brute force, last resort. Will severly impact performance of my tool (as it's going to write to several devices in parallel).


Is there a better method I've not found yet? Nr. 2 sounds like the way to go, but I don't like that it could (silently!) stop working with any new kernel version.


PS: Not subscribed, so please CC me.

CU Sascha

--
http://sascha.silbe.org/
http://www.infra-silbe.de/

Attachment: signature.asc
Description: Digital signature