Documentation: flesh out the section in vfs.txt on storing and reporting writeback errors
Let's try to make this extra clear for fs authors. Cc: Jan Kara <jack@suse.cz> Signed-off-by: Jeff Layton <jlayton@redhat.com>
This commit is contained in:
parent
8ed1e46aaf
commit
acbf3c3452
|
@ -576,7 +576,43 @@ should clear PG_Dirty and set PG_Writeback. It can be actually
|
|||
written at any point after PG_Dirty is clear. Once it is known to be
|
||||
safe, PG_Writeback is cleared.
|
||||
|
||||
Writeback makes use of a writeback_control structure...
|
||||
Writeback makes use of a writeback_control structure to direct the
|
||||
operations. This gives the the writepage and writepages operations some
|
||||
information about the nature of and reason for the writeback request,
|
||||
and the constraints under which it is being done. It is also used to
|
||||
return information back to the caller about the result of a writepage or
|
||||
writepages request.
|
||||
|
||||
Handling errors during writeback
|
||||
--------------------------------
|
||||
Most applications that do buffered I/O will periodically call a file
|
||||
synchronization call (fsync, fdatasync, msync or sync_file_range) to
|
||||
ensure that data written has made it to the backing store. When there
|
||||
is an error during writeback, they expect that error to be reported when
|
||||
a file sync request is made. After an error has been reported on one
|
||||
request, subsequent requests on the same file descriptor should return
|
||||
0, unless further writeback errors have occurred since the previous file
|
||||
syncronization.
|
||||
|
||||
Ideally, the kernel would report errors only on file descriptions on
|
||||
which writes were done that subsequently failed to be written back. The
|
||||
generic pagecache infrastructure does not track the file descriptions
|
||||
that have dirtied each individual page however, so determining which
|
||||
file descriptors should get back an error is not possible.
|
||||
|
||||
Instead, the generic writeback error tracking infrastructure in the
|
||||
kernel settles for reporting errors to fsync on all file descriptions
|
||||
that were open at the time that the error occurred. In a situation with
|
||||
multiple writers, all of them will get back an error on a subsequent fsync,
|
||||
even if all of the writes done through that particular file descriptor
|
||||
succeeded (or even if there were no writes on that file descriptor at all).
|
||||
|
||||
Filesystems that wish to use this infrastructure should call
|
||||
mapping_set_error to record the error in the address_space when it
|
||||
occurs. Then, after writing back data from the pagecache in their
|
||||
file->fsync operation, they should call file_check_and_advance_wb_err to
|
||||
ensure that the struct file's error cursor has advanced to the correct
|
||||
point in the stream of errors emitted by the backing device(s).
|
||||
|
||||
struct address_space_operations
|
||||
-------------------------------
|
||||
|
@ -804,7 +840,8 @@ struct address_space_operations {
|
|||
The File Object
|
||||
===============
|
||||
|
||||
A file object represents a file opened by a process.
|
||||
A file object represents a file opened by a process. This is also known
|
||||
as an "open file description" in POSIX parlance.
|
||||
|
||||
|
||||
struct file_operations
|
||||
|
@ -887,7 +924,8 @@ otherwise noted.
|
|||
|
||||
release: called when the last reference to an open file is closed
|
||||
|
||||
fsync: called by the fsync(2) system call
|
||||
fsync: called by the fsync(2) system call. Also see the section above
|
||||
entitled "Handling errors during writeback".
|
||||
|
||||
fasync: called by the fcntl(2) system call when asynchronous
|
||||
(non-blocking) mode is enabled for a file
|
||||
|
|
Loading…
Reference in New Issue