fs: Convert aops->write_end to take a folio

Most callers have a folio, and most implementations operate on a folio,
so remove the conversion from folio->page->folio to fit through this
interface.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2024-07-10 15:45:32 -04:00 committed by Christian Brauner
parent 3e5d37c5f9
commit a225800f32
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
45 changed files with 80 additions and 102 deletions

View File

@ -254,7 +254,7 @@ prototypes::
struct page **pagep, void **fsdata); struct page **pagep, void **fsdata);
int (*write_end)(struct file *, struct address_space *mapping, int (*write_end)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata); struct folio *folio, void *fsdata);
sector_t (*bmap)(struct address_space *, sector_t); sector_t (*bmap)(struct address_space *, sector_t);
void (*invalidate_folio) (struct folio *, size_t start, size_t len); void (*invalidate_folio) (struct folio *, size_t start, size_t len);
bool (*release_folio)(struct folio *, gfp_t); bool (*release_folio)(struct folio *, gfp_t);

View File

@ -810,7 +810,7 @@ cache in your filesystem. The following members are defined:
struct page **pagep, void **fsdata); struct page **pagep, void **fsdata);
int (*write_end)(struct file *, struct address_space *mapping, int (*write_end)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata); struct folio *folio, void *fsdata);
sector_t (*bmap)(struct address_space *, sector_t); sector_t (*bmap)(struct address_space *, sector_t);
void (*invalidate_folio) (struct folio *, size_t start, size_t len); void (*invalidate_folio) (struct folio *, size_t start, size_t len);
bool (*release_folio)(struct folio *, gfp_t); bool (*release_folio)(struct folio *, gfp_t);
@ -944,8 +944,8 @@ cache in your filesystem. The following members are defined:
called. len is the original len passed to write_begin, and called. len is the original len passed to write_begin, and
copied is the amount that was able to be copied. copied is the amount that was able to be copied.
The filesystem must take care of unlocking the page and The filesystem must take care of unlocking the folio,
releasing it refcount, and updating i_size. decrementing its refcount, and updating i_size.
Returns < 0 on failure, otherwise the number of bytes (<= Returns < 0 on failure, otherwise the number of bytes (<=
'copied') that were able to be copied into pagecache. 'copied') that were able to be copied into pagecache.

View File

@ -457,10 +457,9 @@ static int blkdev_write_begin(struct file *file, struct address_space *mapping,
} }
static int blkdev_write_end(struct file *file, struct address_space *mapping, static int blkdev_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, struct page *page, loff_t pos, unsigned len, unsigned copied, struct folio *folio,
void *fsdata) void *fsdata)
{ {
struct folio *folio = page_folio(page);
int ret; int ret;
ret = block_write_end(file, mapping, pos, len, copied, folio, fsdata); ret = block_write_end(file, mapping, pos, len, copied, folio, fsdata);

View File

@ -494,7 +494,7 @@ shmem_pwrite(struct drm_i915_gem_object *obj,
kunmap_local(vaddr); kunmap_local(vaddr);
err = aops->write_end(obj->base.filp, mapping, offset, len, err = aops->write_end(obj->base.filp, mapping, offset, len,
len - unwritten, page, data); len - unwritten, page_folio(page), data);
if (err < 0) if (err < 0)
return err; return err;
@ -688,7 +688,7 @@ i915_gem_object_create_shmem_from_data(struct drm_i915_private *i915,
kunmap(page); kunmap(page);
err = aops->write_end(file, file->f_mapping, offset, len, len, err = aops->write_end(file, file->f_mapping, offset, len, len,
page, pgdata); page_folio(page), pgdata);
if (err < 0) if (err < 0)
goto fail; goto fail;

View File

@ -433,12 +433,12 @@ static int affs_write_begin(struct file *file, struct address_space *mapping,
static int affs_write_end(struct file *file, struct address_space *mapping, static int affs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned int len, unsigned int copied, loff_t pos, unsigned int len, unsigned int copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
int ret; int ret;
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); ret = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
/* Clear Archived bit on file writes, as AmigaOS would do */ /* Clear Archived bit on file writes, as AmigaOS would do */
if (AFFS_I(inode)->i_protect & FIBF_ARCHIVED) { if (AFFS_I(inode)->i_protect & FIBF_ARCHIVED) {
@ -687,9 +687,8 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping
static int affs_write_end_ofs(struct file *file, struct address_space *mapping, static int affs_write_end_ofs(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct buffer_head *bh, *prev_bh; struct buffer_head *bh, *prev_bh;
@ -889,7 +888,7 @@ affs_truncate(struct inode *inode)
res = mapping->a_ops->write_begin(NULL, mapping, isize, 0, &page, &fsdata); res = mapping->a_ops->write_begin(NULL, mapping, isize, 0, &page, &fsdata);
if (!res) if (!res)
res = mapping->a_ops->write_end(NULL, mapping, isize, 0, 0, page, fsdata); res = mapping->a_ops->write_end(NULL, mapping, isize, 0, 0, page_folio(page), fsdata);
else else
inode->i_size = AFFS_I(inode)->mmu_private; inode->i_size = AFFS_I(inode)->mmu_private;
mark_inode_dirty(inode); mark_inode_dirty(inode);

View File

@ -743,12 +743,11 @@ int bch2_write_begin(struct file *file, struct address_space *mapping,
int bch2_write_end(struct file *file, struct address_space *mapping, int bch2_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct bch_inode_info *inode = to_bch_ei(mapping->host); struct bch_inode_info *inode = to_bch_ei(mapping->host);
struct bch_fs *c = inode->v.i_sb->s_fs_info; struct bch_fs *c = inode->v.i_sb->s_fs_info;
struct bch2_folio_reservation *res = fsdata; struct bch2_folio_reservation *res = fsdata;
struct folio *folio = page_folio(page);
unsigned offset = pos - folio_pos(folio); unsigned offset = pos - folio_pos(folio);
lockdep_assert_held(&inode->v.i_rwsem); lockdep_assert_held(&inode->v.i_rwsem);

View File

@ -13,7 +13,7 @@ void bch2_readahead(struct readahead_control *);
int bch2_write_begin(struct file *, struct address_space *, loff_t, int bch2_write_begin(struct file *, struct address_space *, loff_t,
unsigned, struct page **, void **); unsigned, struct page **, void **);
int bch2_write_end(struct file *, struct address_space *, loff_t, int bch2_write_end(struct file *, struct address_space *, loff_t,
unsigned, unsigned, struct page *, void *); unsigned len, unsigned copied, struct folio *, void *);
ssize_t bch2_write_iter(struct kiocb *, struct iov_iter *); ssize_t bch2_write_iter(struct kiocb *, struct iov_iter *);

View File

@ -2280,9 +2280,8 @@ EXPORT_SYMBOL(block_write_end);
int generic_write_end(struct file *file, struct address_space *mapping, int generic_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
loff_t old_size = inode->i_size; loff_t old_size = inode->i_size;
bool i_size_changed = false; bool i_size_changed = false;
@ -2480,7 +2479,7 @@ int generic_cont_expand_simple(struct inode *inode, loff_t size)
if (err) if (err)
goto out; goto out;
err = aops->write_end(NULL, mapping, size, 0, 0, page, fsdata); err = aops->write_end(NULL, mapping, size, 0, 0, page_folio(page), fsdata);
BUG_ON(err > 0); BUG_ON(err > 0);
out: out:
@ -2518,7 +2517,7 @@ static int cont_expand_zero(struct file *file, struct address_space *mapping,
goto out; goto out;
zero_user(page, zerofrom, len); zero_user(page, zerofrom, len);
err = aops->write_end(file, mapping, curpos, len, len, err = aops->write_end(file, mapping, curpos, len, len,
page, fsdata); page_folio(page), fsdata);
if (err < 0) if (err < 0)
goto out; goto out;
BUG_ON(err != len); BUG_ON(err != len);
@ -2551,7 +2550,7 @@ static int cont_expand_zero(struct file *file, struct address_space *mapping,
goto out; goto out;
zero_user(page, zerofrom, len); zero_user(page, zerofrom, len);
err = aops->write_end(file, mapping, curpos, len, len, err = aops->write_end(file, mapping, curpos, len, len,
page, fsdata); page_folio(page), fsdata);
if (err < 0) if (err < 0)
goto out; goto out;
BUG_ON(err != len); BUG_ON(err != len);

View File

@ -1509,9 +1509,8 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,
*/ */
static int ceph_write_end(struct file *file, struct address_space *mapping, static int ceph_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *subpage, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(subpage);
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
struct ceph_client *cl = ceph_inode_to_client(inode); struct ceph_client *cl = ceph_inode_to_client(inode);
bool check_cap = false; bool check_cap = false;

View File

@ -458,15 +458,14 @@ int ecryptfs_write_inode_size_to_metadata(struct inode *ecryptfs_inode)
* @pos: The file position * @pos: The file position
* @len: The length of the data (unused) * @len: The length of the data (unused)
* @copied: The amount of data copied * @copied: The amount of data copied
* @page: The eCryptfs page * @folio: The eCryptfs folio
* @fsdata: The fsdata (unused) * @fsdata: The fsdata (unused)
*/ */
static int ecryptfs_write_end(struct file *file, static int ecryptfs_write_end(struct file *file,
struct address_space *mapping, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
pgoff_t index = pos >> PAGE_SHIFT; pgoff_t index = pos >> PAGE_SHIFT;
unsigned from = pos & (PAGE_SIZE - 1); unsigned from = pos & (PAGE_SIZE - 1);
unsigned to = from + copied; unsigned to = from + copied;

View File

@ -548,7 +548,7 @@ static int exfat_file_zeroed_range(struct file *file, loff_t start, loff_t end)
zero_user_segment(page, zerofrom, zerofrom + len); zero_user_segment(page, zerofrom, zerofrom + len);
err = ops->write_end(file, mapping, start, len, len, page, NULL); err = ops->write_end(file, mapping, start, len, len, page_folio(page), NULL);
if (err < 0) if (err < 0)
goto out; goto out;
start += len; start += len;

View File

@ -463,13 +463,13 @@ static int exfat_write_begin(struct file *file, struct address_space *mapping,
static int exfat_write_end(struct file *file, struct address_space *mapping, static int exfat_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned int len, unsigned int copied, loff_t pos, unsigned int len, unsigned int copied,
struct page *pagep, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct exfat_inode_info *ei = EXFAT_I(inode); struct exfat_inode_info *ei = EXFAT_I(inode);
int err; int err;
err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata); err = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (ei->i_size_aligned < i_size_read(inode)) { if (ei->i_size_aligned < i_size_read(inode)) {
exfat_fs_error(inode->i_sb, exfat_fs_error(inode->i_sb,

View File

@ -928,11 +928,11 @@ ext2_write_begin(struct file *file, struct address_space *mapping,
static int ext2_write_end(struct file *file, struct address_space *mapping, static int ext2_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
int ret; int ret;
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); ret = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (ret < len) if (ret < len)
ext2_write_failed(mapping, pos + len); ext2_write_failed(mapping, pos + len);
return ret; return ret;

View File

@ -1298,9 +1298,8 @@ static int write_end_fn(handle_t *handle, struct inode *inode,
static int ext4_write_end(struct file *file, static int ext4_write_end(struct file *file,
struct address_space *mapping, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
handle_t *handle = ext4_journal_current_handle(); handle_t *handle = ext4_journal_current_handle();
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
loff_t old_size = inode->i_size; loff_t old_size = inode->i_size;
@ -1402,9 +1401,8 @@ static void ext4_journalled_zero_new_buffers(handle_t *handle,
static int ext4_journalled_write_end(struct file *file, static int ext4_journalled_write_end(struct file *file,
struct address_space *mapping, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
handle_t *handle = ext4_journal_current_handle(); handle_t *handle = ext4_journal_current_handle();
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
loff_t old_size = inode->i_size; loff_t old_size = inode->i_size;
@ -3080,15 +3078,14 @@ static int ext4_da_do_write_end(struct address_space *mapping,
static int ext4_da_write_end(struct file *file, static int ext4_da_write_end(struct file *file,
struct address_space *mapping, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
int write_mode = (int)(unsigned long)fsdata; int write_mode = (int)(unsigned long)fsdata;
struct folio *folio = page_folio(page);
if (write_mode == FALL_BACK_TO_NONDELALLOC) if (write_mode == FALL_BACK_TO_NONDELALLOC)
return ext4_write_end(file, mapping, pos, return ext4_write_end(file, mapping, pos,
len, copied, &folio->page, fsdata); len, copied, folio, fsdata);
trace_ext4_da_write_end(inode, pos, len, copied); trace_ext4_da_write_end(inode, pos, len, copied);

View File

@ -86,7 +86,7 @@ static int pagecache_write(struct inode *inode, const void *buf, size_t count,
memcpy_to_page(page, offset_in_page(pos), buf, n); memcpy_to_page(page, offset_in_page(pos), buf, n);
res = aops->write_end(NULL, mapping, pos, n, n, page, fsdata); res = aops->write_end(NULL, mapping, pos, n, n, page_folio(page), fsdata);
if (res < 0) if (res < 0)
return res; return res;
if (res != n) if (res != n)

View File

@ -3689,9 +3689,8 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
static int f2fs_write_end(struct file *file, static int f2fs_write_end(struct file *file,
struct address_space *mapping, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = folio->mapping->host; struct inode *inode = folio->mapping->host;
trace_f2fs_write_end(inode, pos, len, copied); trace_f2fs_write_end(inode, pos, len, copied);

View File

@ -2700,7 +2700,7 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
memcpy_to_page(page, offset, data, tocopy); memcpy_to_page(page, offset, data, tocopy);
a_ops->write_end(NULL, mapping, off, tocopy, tocopy, a_ops->write_end(NULL, mapping, off, tocopy, tocopy,
page, fsdata); page_folio(page), fsdata);
offset = 0; offset = 0;
towrite -= tocopy; towrite -= tocopy;
off += tocopy; off += tocopy;

View File

@ -90,7 +90,7 @@ static int pagecache_write(struct inode *inode, const void *buf, size_t count,
memcpy_to_page(page, offset_in_page(pos), buf, n); memcpy_to_page(page, offset_in_page(pos), buf, n);
res = aops->write_end(NULL, mapping, pos, n, n, page, fsdata); res = aops->write_end(NULL, mapping, pos, n, n, page_folio(page), fsdata);
if (res < 0) if (res < 0)
return res; return res;
if (res != n) if (res != n)

View File

@ -236,11 +236,11 @@ static int fat_write_begin(struct file *file, struct address_space *mapping,
static int fat_write_end(struct file *file, struct address_space *mapping, static int fat_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *pagep, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
int err; int err;
err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata); err = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (err < len) if (err < len)
fat_write_failed(mapping, pos + len); fat_write_failed(mapping, pos + len);
if (!(err < 0) && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) { if (!(err < 0) && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) {

View File

@ -2433,9 +2433,8 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping,
static int fuse_write_end(struct file *file, struct address_space *mapping, static int fuse_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = folio->mapping->host; struct inode *inode = folio->mapping->host;
/* Haven't copied anything? Skip zeroing, size extending, dirtying. */ /* Haven't copied anything? Skip zeroing, size extending, dirtying. */

View File

@ -495,7 +495,7 @@ void hfs_file_truncate(struct inode *inode)
&fsdata); &fsdata);
if (!res) { if (!res) {
res = generic_write_end(NULL, mapping, size + 1, 0, 0, res = generic_write_end(NULL, mapping, size + 1, 0, 0,
page, fsdata); page_folio(page), fsdata);
} }
if (res) if (res)
inode->i_size = HFS_I(inode)->phys_size; inode->i_size = HFS_I(inode)->phys_size;

View File

@ -563,7 +563,7 @@ void hfsplus_file_truncate(struct inode *inode)
if (res) if (res)
return; return;
res = generic_write_end(NULL, mapping, size, 0, 0, res = generic_write_end(NULL, mapping, size, 0, 0,
page, fsdata); page_folio(page), fsdata);
if (res < 0) if (res < 0)
return; return;
mark_inode_dirty(inode); mark_inode_dirty(inode);

View File

@ -477,9 +477,8 @@ static int hostfs_write_begin(struct file *file, struct address_space *mapping,
static int hostfs_write_end(struct file *file, struct address_space *mapping, static int hostfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
void *buffer; void *buffer;
size_t from = offset_in_folio(folio, pos); size_t from = offset_in_folio(folio, pos);

View File

@ -206,11 +206,11 @@ static int hpfs_write_begin(struct file *file, struct address_space *mapping,
static int hpfs_write_end(struct file *file, struct address_space *mapping, static int hpfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *pagep, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
int err; int err;
err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata); err = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (err < len) if (err < len)
hpfs_write_failed(mapping, pos + len); hpfs_write_failed(mapping, pos + len);
if (!(err < 0)) { if (!(err < 0)) {

View File

@ -395,7 +395,7 @@ static int hugetlbfs_write_begin(struct file *file,
static int hugetlbfs_write_end(struct file *file, struct address_space *mapping, static int hugetlbfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
BUG(); BUG();
return -EINVAL; return -EINVAL;

View File

@ -23,7 +23,7 @@
static int jffs2_write_end(struct file *filp, struct address_space *mapping, static int jffs2_write_end(struct file *filp, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *pg, void *fsdata); struct folio *folio, void *fsdata);
static int jffs2_write_begin(struct file *filp, struct address_space *mapping, static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
loff_t pos, unsigned len, loff_t pos, unsigned len,
struct page **pagep, void **fsdata); struct page **pagep, void **fsdata);
@ -239,9 +239,8 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
static int jffs2_write_end(struct file *filp, struct address_space *mapping, static int jffs2_write_end(struct file *filp, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *pg, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(pg);
/* Actually commit the write from the page cache page we're looking at. /* Actually commit the write from the page cache page we're looking at.
* For now, we write the full page out each time. It sucks, but it's simple * For now, we write the full page out each time. It sucks, but it's simple
*/ */

View File

@ -304,12 +304,12 @@ static int jfs_write_begin(struct file *file, struct address_space *mapping,
} }
static int jfs_write_end(struct file *file, struct address_space *mapping, static int jfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, struct page *page, loff_t pos, unsigned len, unsigned copied, struct folio *folio,
void *fsdata) void *fsdata)
{ {
int ret; int ret;
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); ret = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (ret < len) if (ret < len)
jfs_write_failed(mapping, pos + len); jfs_write_failed(mapping, pos + len);
return ret; return ret;

View File

@ -929,11 +929,11 @@ EXPORT_SYMBOL(simple_write_begin);
* @pos: " * @pos: "
* @len: " * @len: "
* @copied: " * @copied: "
* @page: " * @folio: "
* @fsdata: " * @fsdata: "
* *
* simple_write_end does the minimum needed for updating a page after writing is * simple_write_end does the minimum needed for updating a folio after
* done. It has the same API signature as the .write_end of * writing is done. It has the same API signature as the .write_end of
* address_space_operations vector. So it can just be set onto .write_end for * address_space_operations vector. So it can just be set onto .write_end for
* FSes that don't need any other processing. i_mutex is assumed to be held. * FSes that don't need any other processing. i_mutex is assumed to be held.
* Block based filesystems should use generic_write_end(). * Block based filesystems should use generic_write_end().
@ -946,9 +946,8 @@ EXPORT_SYMBOL(simple_write_begin);
*/ */
static int simple_write_end(struct file *file, struct address_space *mapping, static int simple_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = folio->mapping->host; struct inode *inode = folio->mapping->host;
loff_t last_pos = pos + copied; loff_t last_pos = pos + copied;

View File

@ -5321,7 +5321,7 @@ int page_symlink(struct inode *inode, const char *symname, int len)
memcpy(page_address(page), symname, len-1); memcpy(page_address(page), symname, len-1);
err = aops->write_end(NULL, mapping, 0, len-1, len-1, err = aops->write_end(NULL, mapping, 0, len-1, len-1,
page, fsdata); page_folio(page), fsdata);
if (err < 0) if (err < 0)
goto fail; goto fail;
if (err < len-1) if (err < len-1)

View File

@ -372,10 +372,9 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
static int nfs_write_end(struct file *file, struct address_space *mapping, static int nfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct nfs_open_context *ctx = nfs_file_open_context(file); struct nfs_open_context *ctx = nfs_file_open_context(file);
struct folio *folio = page_folio(page);
unsigned offset = offset_in_folio(folio, pos); unsigned offset = offset_in_folio(folio, pos);
int status; int status;

View File

@ -269,16 +269,16 @@ static int nilfs_write_begin(struct file *file, struct address_space *mapping,
static int nilfs_write_end(struct file *file, struct address_space *mapping, static int nilfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
unsigned int start = pos & (PAGE_SIZE - 1); unsigned int start = pos & (PAGE_SIZE - 1);
unsigned int nr_dirty; unsigned int nr_dirty;
int err; int err;
nr_dirty = nilfs_page_count_clean_buffers(page, start, nr_dirty = nilfs_page_count_clean_buffers(&folio->page, start,
start + copied); start + copied);
copied = generic_write_end(file, mapping, pos, len, copied, page, copied = generic_write_end(file, mapping, pos, len, copied, folio,
fsdata); fsdata);
nilfs_set_file_dirty(inode, nr_dirty); nilfs_set_file_dirty(inode, nr_dirty);
err = nilfs_transaction_commit(inode->i_sb); err = nilfs_transaction_commit(inode->i_sb);

View File

@ -215,7 +215,7 @@ static int ntfs_extend_initialized_size(struct file *file,
zero_user_segment(page, zerofrom, PAGE_SIZE); zero_user_segment(page, zerofrom, PAGE_SIZE);
/* This function in any case puts page. */ /* This function in any case puts page. */
err = ntfs_write_end(file, mapping, pos, len, len, page, NULL); err = ntfs_write_end(file, mapping, pos, len, len, page_folio(page), NULL);
if (err < 0) if (err < 0)
goto out; goto out;
pos += len; pos += len;

View File

@ -947,9 +947,8 @@ int ntfs_write_begin(struct file *file, struct address_space *mapping,
* ntfs_write_end - Address_space_operations::write_end. * ntfs_write_end - Address_space_operations::write_end.
*/ */
int ntfs_write_end(struct file *file, struct address_space *mapping, loff_t pos, int ntfs_write_end(struct file *file, struct address_space *mapping, loff_t pos,
u32 len, u32 copied, struct page *page, void *fsdata) u32 len, u32 copied, struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct ntfs_inode *ni = ntfs_i(inode); struct ntfs_inode *ni = ntfs_i(inode);
u64 valid = ni->i_valid; u64 valid = ni->i_valid;
@ -979,7 +978,7 @@ int ntfs_write_end(struct file *file, struct address_space *mapping, loff_t pos,
folio_unlock(folio); folio_unlock(folio);
folio_put(folio); folio_put(folio);
} else { } else {
err = generic_write_end(file, mapping, pos, len, copied, page, err = generic_write_end(file, mapping, pos, len, copied, folio,
fsdata); fsdata);
} }

View File

@ -713,7 +713,7 @@ int ntfs_get_block(struct inode *inode, sector_t vbn,
int ntfs_write_begin(struct file *file, struct address_space *mapping, int ntfs_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, u32 len, struct page **pagep, void **fsdata); loff_t pos, u32 len, struct page **pagep, void **fsdata);
int ntfs_write_end(struct file *file, struct address_space *mapping, loff_t pos, int ntfs_write_end(struct file *file, struct address_space *mapping, loff_t pos,
u32 len, u32 copied, struct page *page, void *fsdata); u32 len, u32 copied, struct folio *folio, void *fsdata);
int ntfs3_write_inode(struct inode *inode, struct writeback_control *wbc); int ntfs3_write_inode(struct inode *inode, struct writeback_control *wbc);
int ntfs_sync_inode(struct inode *inode); int ntfs_sync_inode(struct inode *inode);
int ntfs_flush_inodes(struct super_block *sb, struct inode *i1, int ntfs_flush_inodes(struct super_block *sb, struct inode *i1,

View File

@ -2076,7 +2076,7 @@ int ocfs2_write_end_nolock(struct address_space *mapping,
static int ocfs2_write_end(struct file *file, struct address_space *mapping, static int ocfs2_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
int ret; int ret;
struct inode *inode = mapping->host; struct inode *inode = mapping->host;

View File

@ -361,9 +361,9 @@ static int orangefs_write_begin(struct file *file,
} }
static int orangefs_write_end(struct file *file, struct address_space *mapping, static int orangefs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, struct page *page, void *fsdata) loff_t pos, unsigned len, unsigned copied, struct folio *folio,
void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = folio->mapping->host; struct inode *inode = folio->mapping->host;
loff_t last_pos = pos + copied; loff_t last_pos = pos + copied;

View File

@ -2862,10 +2862,9 @@ static sector_t reiserfs_aop_bmap(struct address_space *as, sector_t block)
static int reiserfs_write_end(struct file *file, struct address_space *mapping, static int reiserfs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page); struct inode *inode = folio->mapping->host;
struct inode *inode = page->mapping->host;
int ret = 0; int ret = 0;
int update_sd = 0; int update_sd = 0;
struct reiserfs_transaction_handle *th; struct reiserfs_transaction_handle *th;
@ -2887,7 +2886,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
} }
flush_dcache_folio(folio); flush_dcache_folio(folio);
reiserfs_commit_page(inode, page, start, start + copied); reiserfs_commit_page(inode, &folio->page, start, start + copied);
/* /*
* generic_commit_write does this for us, but does not update the * generic_commit_write does this for us, but does not update the
@ -2942,8 +2941,8 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping,
out: out:
if (locked) if (locked)
reiserfs_write_unlock(inode->i_sb); reiserfs_write_unlock(inode->i_sb);
unlock_page(page); folio_unlock(folio);
put_page(page); folio_put(folio);
if (pos + len > inode->i_size) if (pos + len > inode->i_size)
reiserfs_truncate_failed_write(inode); reiserfs_truncate_failed_write(inode);

View File

@ -524,9 +524,8 @@ static void cancel_budget(struct ubifs_info *c, struct folio *folio,
static int ubifs_write_end(struct file *file, struct address_space *mapping, static int ubifs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct ubifs_inode *ui = ubifs_inode(inode); struct ubifs_inode *ui = ubifs_inode(inode);
struct ubifs_info *c = inode->i_sb->s_fs_info; struct ubifs_info *c = inode->i_sb->s_fs_info;

View File

@ -273,16 +273,14 @@ static int udf_write_begin(struct file *file, struct address_space *mapping,
static int udf_write_end(struct file *file, struct address_space *mapping, static int udf_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
struct folio *folio;
loff_t last_pos; loff_t last_pos;
if (UDF_I(inode)->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) if (UDF_I(inode)->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB)
return generic_write_end(file, mapping, pos, len, copied, page, return generic_write_end(file, mapping, pos, len, copied, folio,
fsdata); fsdata);
folio = page_folio(page);
last_pos = pos + copied; last_pos = pos + copied;
if (last_pos > inode->i_size) if (last_pos > inode->i_size)
i_size_write(inode, last_pos); i_size_write(inode, last_pos);

View File

@ -511,11 +511,11 @@ static int ufs_write_begin(struct file *file, struct address_space *mapping,
static int ufs_write_end(struct file *file, struct address_space *mapping, static int ufs_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
int ret; int ret;
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); ret = generic_write_end(file, mapping, pos, len, copied, folio, fsdata);
if (ret < len) if (ret < len)
ufs_write_failed(mapping, pos + len); ufs_write_failed(mapping, pos + len);
return ret; return ret;

View File

@ -300,9 +300,8 @@ static int vboxsf_writepage(struct page *page, struct writeback_control *wbc)
static int vboxsf_write_end(struct file *file, struct address_space *mapping, static int vboxsf_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned int len, unsigned int copied, loff_t pos, unsigned int len, unsigned int copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct vboxsf_handle *sf_handle = file->private_data; struct vboxsf_handle *sf_handle = file->private_data;
size_t from = offset_in_folio(folio, pos); size_t from = offset_in_folio(folio, pos);
@ -314,10 +313,10 @@ static int vboxsf_write_end(struct file *file, struct address_space *mapping,
if (!folio_test_uptodate(folio) && copied < len) if (!folio_test_uptodate(folio) && copied < len)
folio_zero_range(folio, from + copied, len - copied); folio_zero_range(folio, from + copied, len - copied);
buf = kmap(page); buf = kmap(&folio->page);
err = vboxsf_write(sf_handle->root, sf_handle->handle, err = vboxsf_write(sf_handle->root, sf_handle->handle,
pos, &nwritten, buf + from); pos, &nwritten, buf + from);
kunmap(page); kunmap(&folio->page);
if (err) { if (err) {
nwritten = 0; nwritten = 0;

View File

@ -265,8 +265,8 @@ int block_write_end(struct file *, struct address_space *,
loff_t, unsigned len, unsigned copied, loff_t, unsigned len, unsigned copied,
struct folio *, void *); struct folio *, void *);
int generic_write_end(struct file *, struct address_space *, int generic_write_end(struct file *, struct address_space *,
loff_t, unsigned, unsigned, loff_t, unsigned len, unsigned copied,
struct page *, void *); struct folio *, void *);
void folio_zero_new_buffers(struct folio *folio, size_t from, size_t to); void folio_zero_new_buffers(struct folio *folio, size_t from, size_t to);
int cont_write_begin(struct file *, struct address_space *, loff_t, int cont_write_begin(struct file *, struct address_space *, loff_t,
unsigned, struct page **, void **, unsigned, struct page **, void **,

View File

@ -411,7 +411,7 @@ struct address_space_operations {
struct page **pagep, void **fsdata); struct page **pagep, void **fsdata);
int (*write_end)(struct file *, struct address_space *mapping, int (*write_end)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata); struct folio *folio, void *fsdata);
/* Unfortunately this kludge is needed for FIBMAP. Don't use it */ /* Unfortunately this kludge is needed for FIBMAP. Don't use it */
sector_t (*bmap)(struct address_space *, sector_t); sector_t (*bmap)(struct address_space *, sector_t);

View File

@ -4033,7 +4033,7 @@ ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
flush_dcache_folio(folio); flush_dcache_folio(folio);
status = a_ops->write_end(file, mapping, pos, bytes, copied, status = a_ops->write_end(file, mapping, pos, bytes, copied,
page, fsdata); folio, fsdata);
if (unlikely(status != copied)) { if (unlikely(status != copied)) {
iov_iter_revert(i, copied - max(status, 0L)); iov_iter_revert(i, copied - max(status, 0L));
if (unlikely(status < 0)) if (unlikely(status < 0))

View File

@ -2917,9 +2917,8 @@ shmem_write_begin(struct file *file, struct address_space *mapping,
static int static int
shmem_write_end(struct file *file, struct address_space *mapping, shmem_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied, loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata) struct folio *folio, void *fsdata)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
if (pos + copied > inode->i_size) if (pos + copied > inode->i_size)