|
@@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the
|
|
address_space has finer control of write sizes.
|
|
address_space has finer control of write sizes.
|
|
|
|
|
|
The read process essentially only requires 'readpage'. The write
|
|
The read process essentially only requires 'readpage'. The write
|
|
-process is more complicated and uses prepare_write/commit_write or
|
|
|
|
|
|
+process is more complicated and uses write_begin/write_end or
|
|
set_page_dirty to write data into the address_space, and writepage,
|
|
set_page_dirty to write data into the address_space, and writepage,
|
|
sync_page, and writepages to writeback data to storage.
|
|
sync_page, and writepages to writeback data to storage.
|
|
|
|
|
|
@@ -521,8 +521,6 @@ struct address_space_operations {
|
|
int (*set_page_dirty)(struct page *page);
|
|
int (*set_page_dirty)(struct page *page);
|
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
|
struct list_head *pages, unsigned nr_pages);
|
|
struct list_head *pages, unsigned nr_pages);
|
|
- int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
|
|
|
- int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
|
|
|
int (*write_begin)(struct file *, struct address_space *mapping,
|
|
int (*write_begin)(struct file *, struct address_space *mapping,
|
|
loff_t pos, unsigned len, unsigned flags,
|
|
loff_t pos, unsigned len, unsigned flags,
|
|
struct page **pagep, void **fsdata);
|
|
struct page **pagep, void **fsdata);
|
|
@@ -598,37 +596,7 @@ struct address_space_operations {
|
|
readpages is only used for read-ahead, so read errors are
|
|
readpages is only used for read-ahead, so read errors are
|
|
ignored. If anything goes wrong, feel free to give up.
|
|
ignored. If anything goes wrong, feel free to give up.
|
|
|
|
|
|
- prepare_write: called by the generic write path in VM to set up a write
|
|
|
|
- request for a page. This indicates to the address space that
|
|
|
|
- the given range of bytes is about to be written. The
|
|
|
|
- address_space should check that the write will be able to
|
|
|
|
- complete, by allocating space if necessary and doing any other
|
|
|
|
- internal housekeeping. If the write will update parts of
|
|
|
|
- any basic-blocks on storage, then those blocks should be
|
|
|
|
- pre-read (if they haven't been read already) so that the
|
|
|
|
- updated blocks can be written out properly.
|
|
|
|
- The page will be locked.
|
|
|
|
-
|
|
|
|
- Note: the page _must not_ be marked uptodate in this function
|
|
|
|
- (or anywhere else) unless it actually is uptodate right now. As
|
|
|
|
- soon as a page is marked uptodate, it is possible for a concurrent
|
|
|
|
- read(2) to copy it to userspace.
|
|
|
|
-
|
|
|
|
- commit_write: If prepare_write succeeds, new data will be copied
|
|
|
|
- into the page and then commit_write will be called. It will
|
|
|
|
- typically update the size of the file (if appropriate) and
|
|
|
|
- mark the inode as dirty, and do any other related housekeeping
|
|
|
|
- operations. It should avoid returning an error if possible -
|
|
|
|
- errors should have been handled by prepare_write.
|
|
|
|
-
|
|
|
|
- write_begin: This is intended as a replacement for prepare_write. The
|
|
|
|
- key differences being that:
|
|
|
|
- - it returns a locked page (in *pagep) rather than being
|
|
|
|
- given a pre locked page;
|
|
|
|
- - it must be able to cope with short writes (where the
|
|
|
|
- length passed to write_begin is greater than the number
|
|
|
|
- of bytes copied into the page).
|
|
|
|
-
|
|
|
|
|
|
+ write_begin:
|
|
Called by the generic buffered write code to ask the filesystem to
|
|
Called by the generic buffered write code to ask the filesystem to
|
|
prepare to write len bytes at the given offset in the file. The
|
|
prepare to write len bytes at the given offset in the file. The
|
|
address_space should check that the write will be able to complete,
|
|
address_space should check that the write will be able to complete,
|
|
@@ -640,6 +608,9 @@ struct address_space_operations {
|
|
The filesystem must return the locked pagecache page for the specified
|
|
The filesystem must return the locked pagecache page for the specified
|
|
offset, in *pagep, for the caller to write into.
|
|
offset, in *pagep, for the caller to write into.
|
|
|
|
|
|
|
|
+ It must be able to cope with short writes (where the length passed to
|
|
|
|
+ write_begin is greater than the number of bytes copied into the page).
|
|
|
|
+
|
|
flags is a field for AOP_FLAG_xxx flags, described in
|
|
flags is a field for AOP_FLAG_xxx flags, described in
|
|
include/linux/fs.h.
|
|
include/linux/fs.h.
|
|
|
|
|