diff options
author | Jeff Layton <jlayton@redhat.com> | 2017-07-06 07:02:27 -0400 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2017-07-06 07:02:27 -0400 |
commit | acbf3c3452c3729829fdb0e5a52fed3cce556eb2 (patch) | |
tree | 3cb8abd9adad56f04131f9ea824f689fbf550c85 /Documentation/filesystems | |
parent | 8ed1e46aaf1bec6a12f4c89637f2c3ef4c70f18e (diff) |
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>
Diffstat (limited to 'Documentation/filesystems')
-rw-r--r-- | Documentation/filesystems/vfs.txt | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index f42b90687d40..48c9faa73a76 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -576,7 +576,43 @@ should clear PG_Dirty and set PG_Writeback. It can be actually | |||
576 | written at any point after PG_Dirty is clear. Once it is known to be | 576 | written at any point after PG_Dirty is clear. Once it is known to be |
577 | safe, PG_Writeback is cleared. | 577 | safe, PG_Writeback is cleared. |
578 | 578 | ||
579 | Writeback makes use of a writeback_control structure... | 579 | Writeback makes use of a writeback_control structure to direct the |
580 | operations. This gives the the writepage and writepages operations some | ||
581 | information about the nature of and reason for the writeback request, | ||
582 | and the constraints under which it is being done. It is also used to | ||
583 | return information back to the caller about the result of a writepage or | ||
584 | writepages request. | ||
585 | |||
586 | Handling errors during writeback | ||
587 | -------------------------------- | ||
588 | Most applications that do buffered I/O will periodically call a file | ||
589 | synchronization call (fsync, fdatasync, msync or sync_file_range) to | ||
590 | ensure that data written has made it to the backing store. When there | ||
591 | is an error during writeback, they expect that error to be reported when | ||
592 | a file sync request is made. After an error has been reported on one | ||
593 | request, subsequent requests on the same file descriptor should return | ||
594 | 0, unless further writeback errors have occurred since the previous file | ||
595 | syncronization. | ||
596 | |||
597 | Ideally, the kernel would report errors only on file descriptions on | ||
598 | which writes were done that subsequently failed to be written back. The | ||
599 | generic pagecache infrastructure does not track the file descriptions | ||
600 | that have dirtied each individual page however, so determining which | ||
601 | file descriptors should get back an error is not possible. | ||
602 | |||
603 | Instead, the generic writeback error tracking infrastructure in the | ||
604 | kernel settles for reporting errors to fsync on all file descriptions | ||
605 | that were open at the time that the error occurred. In a situation with | ||
606 | multiple writers, all of them will get back an error on a subsequent fsync, | ||
607 | even if all of the writes done through that particular file descriptor | ||
608 | succeeded (or even if there were no writes on that file descriptor at all). | ||
609 | |||
610 | Filesystems that wish to use this infrastructure should call | ||
611 | mapping_set_error to record the error in the address_space when it | ||
612 | occurs. Then, after writing back data from the pagecache in their | ||
613 | file->fsync operation, they should call file_check_and_advance_wb_err to | ||
614 | ensure that the struct file's error cursor has advanced to the correct | ||
615 | point in the stream of errors emitted by the backing device(s). | ||
580 | 616 | ||
581 | struct address_space_operations | 617 | struct address_space_operations |
582 | ------------------------------- | 618 | ------------------------------- |
@@ -804,7 +840,8 @@ struct address_space_operations { | |||
804 | The File Object | 840 | The File Object |
805 | =============== | 841 | =============== |
806 | 842 | ||
807 | A file object represents a file opened by a process. | 843 | A file object represents a file opened by a process. This is also known |
844 | as an "open file description" in POSIX parlance. | ||
808 | 845 | ||
809 | 846 | ||
810 | struct file_operations | 847 | struct file_operations |
@@ -887,7 +924,8 @@ otherwise noted. | |||
887 | 924 | ||
888 | release: called when the last reference to an open file is closed | 925 | release: called when the last reference to an open file is closed |
889 | 926 | ||
890 | fsync: called by the fsync(2) system call | 927 | fsync: called by the fsync(2) system call. Also see the section above |
928 | entitled "Handling errors during writeback". | ||
891 | 929 | ||
892 | fasync: called by the fcntl(2) system call when asynchronous | 930 | fasync: called by the fcntl(2) system call when asynchronous |
893 | (non-blocking) mode is enabled for a file | 931 | (non-blocking) mode is enabled for a file |