Search for "Transaction based IO" in fs/libfs.c: /* * Transaction based IO. * The file expects a single write which triggers the transaction, and then * possibly a read which collects the result - which is stored in a * file-local buffer. */ So the user is expected to do: open() write() #send argument read() #get result close() The read() is optional, but multiple writes without closing and reopening will result in -EBUSY. The size of the argument and response are limited by SIMPLE_TRANSACTION_LIMIT, which is PAGE_SIZE (4k) minus a few bytes to store the size of the argument or response. To use from the kernel: call data = simple_transaction_set(file, buf, size) from the filesystem write method. This returns pointer to the write data copied from userspace. After processing that write data, store the response in the returned data, then call simple_transaction_set(file, size) All you need for the read method is simple_transaction_read(). Note nfsd uses this for the nfsd filesystem, but also allows open() read() write() (So, e.g., you can just cat those files.), by doing a dummy zero-length write when it gets the read.