mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
vfs-6.11.pg_error
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCZpEGSgAKCRCRxhvAZXjc opvwAQCBfq5sxn/P34MNheHAVJOkQlozaflLIRM/CRN60HXV3AEAiph0RJBszvDu VhJ9VZ21zypvpS34enBfPKp1ZmyHPwI= =hNqR -----END PGP SIGNATURE----- Merge tag 'vfs-6.11.pg_error' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs Pull PG_error removal updates from Christian Brauner: "This contains work to remove almost all remaining users of PG_error from filesystems and filesystem helper libraries. An additional patch will be coming in via the jfs tree which tests the PG_error bit. Afterwards nothing will be testing it anymore and it's safe to remove all places which set or clear the PG_error bit. The goal is to fully remove PG_error by the next merge window" * tag 'vfs-6.11.pg_error' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: buffer: Remove calls to set and clear the folio error flag iomap: Remove calls to set and clear folio error flag vboxsf: Convert vboxsf_read_folio() to use a folio ufs: Remove call to set the folio error flag romfs: Convert romfs_read_folio() to use a folio reiserfs: Remove call to folio_set_error() orangefs: Remove calls to set/clear the error flag nfs: Remove calls to folio_set_error jffs2: Remove calls to set/clear the folio error flag hostfs: Convert hostfs_read_folio() to use a folio isofs: Convert rock_ridge_symlink_read_folio to use a folio hpfs: Convert hpfs_symlink_read_folio to use a folio efs: Convert efs_symlink_read_folio to use a folio cramfs: Convert cramfs_read_folio to use a folio coda: Convert coda_symlink_filler() to use folio_end_read() befs: Convert befs_symlink_read_folio() to use folio_end_read()
This commit is contained in:
commit
aff31330e0
@ -475,6 +475,7 @@ static int befs_symlink_read_folio(struct file *unused, struct folio *folio)
|
||||
befs_data_stream *data = &befs_ino->i_data.ds;
|
||||
befs_off_t len = data->size;
|
||||
char *link = folio_address(folio);
|
||||
int err = -EIO;
|
||||
|
||||
if (len == 0 || len > PAGE_SIZE) {
|
||||
befs_error(sb, "Long symlink with illegal length");
|
||||
@ -487,13 +488,10 @@ static int befs_symlink_read_folio(struct file *unused, struct folio *folio)
|
||||
goto fail;
|
||||
}
|
||||
link[len - 1] = '\0';
|
||||
folio_mark_uptodate(folio);
|
||||
folio_unlock(folio);
|
||||
return 0;
|
||||
err = 0;
|
||||
fail:
|
||||
folio_set_error(folio);
|
||||
folio_unlock(folio);
|
||||
return -EIO;
|
||||
folio_end_read(folio, err == 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -258,7 +258,6 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
} else {
|
||||
clear_buffer_uptodate(bh);
|
||||
buffer_io_error(bh, ", async page read");
|
||||
folio_set_error(folio);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -391,7 +390,6 @@ static void end_buffer_async_write(struct buffer_head *bh, int uptodate)
|
||||
buffer_io_error(bh, ", lost async page write");
|
||||
mark_buffer_write_io_error(bh);
|
||||
clear_buffer_uptodate(bh);
|
||||
folio_set_error(folio);
|
||||
}
|
||||
|
||||
first = folio_buffers(folio);
|
||||
@ -1960,7 +1958,6 @@ recover:
|
||||
clear_buffer_dirty(bh);
|
||||
}
|
||||
} while ((bh = bh->b_this_page) != head);
|
||||
folio_set_error(folio);
|
||||
BUG_ON(folio_test_writeback(folio));
|
||||
mapping_set_error(folio->mapping, err);
|
||||
folio_start_writeback(folio);
|
||||
@ -2405,10 +2402,8 @@ int block_read_full_folio(struct folio *folio, get_block_t *get_block)
|
||||
if (iblock < lblock) {
|
||||
WARN_ON(bh->b_size != blocksize);
|
||||
err = get_block(inode, iblock, bh, 0);
|
||||
if (err) {
|
||||
folio_set_error(folio);
|
||||
if (err)
|
||||
page_error = true;
|
||||
}
|
||||
}
|
||||
if (!buffer_mapped(bh)) {
|
||||
folio_zero_range(folio, i * blocksize,
|
||||
|
@ -31,15 +31,7 @@ static int coda_symlink_filler(struct file *file, struct folio *folio)
|
||||
cii = ITOC(inode);
|
||||
|
||||
error = venus_readlink(inode->i_sb, &cii->c_fid, p, &len);
|
||||
if (error)
|
||||
goto fail;
|
||||
folio_mark_uptodate(folio);
|
||||
folio_unlock(folio);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
folio_set_error(folio);
|
||||
folio_unlock(folio);
|
||||
folio_end_read(folio, error == 0);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -811,19 +811,19 @@ out:
|
||||
|
||||
static int cramfs_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
struct inode *inode = page->mapping->host;
|
||||
struct inode *inode = folio->mapping->host;
|
||||
u32 maxblock;
|
||||
int bytes_filled;
|
||||
void *pgdata;
|
||||
bool success = false;
|
||||
|
||||
maxblock = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
bytes_filled = 0;
|
||||
pgdata = kmap_local_page(page);
|
||||
pgdata = kmap_local_folio(folio, 0);
|
||||
|
||||
if (page->index < maxblock) {
|
||||
if (folio->index < maxblock) {
|
||||
struct super_block *sb = inode->i_sb;
|
||||
u32 blkptr_offset = OFFSET(inode) + page->index * 4;
|
||||
u32 blkptr_offset = OFFSET(inode) + folio->index * 4;
|
||||
u32 block_ptr, block_start, block_len;
|
||||
bool uncompressed, direct;
|
||||
|
||||
@ -844,7 +844,7 @@ static int cramfs_read_folio(struct file *file, struct folio *folio)
|
||||
if (uncompressed) {
|
||||
block_len = PAGE_SIZE;
|
||||
/* if last block: cap to file length */
|
||||
if (page->index == maxblock - 1)
|
||||
if (folio->index == maxblock - 1)
|
||||
block_len =
|
||||
offset_in_page(inode->i_size);
|
||||
} else {
|
||||
@ -861,7 +861,7 @@ static int cramfs_read_folio(struct file *file, struct folio *folio)
|
||||
* from the previous block's pointer.
|
||||
*/
|
||||
block_start = OFFSET(inode) + maxblock * 4;
|
||||
if (page->index)
|
||||
if (folio->index)
|
||||
block_start = *(u32 *)
|
||||
cramfs_read(sb, blkptr_offset - 4, 4);
|
||||
/* Beware... previous ptr might be a direct ptr */
|
||||
@ -906,17 +906,12 @@ static int cramfs_read_folio(struct file *file, struct folio *folio)
|
||||
}
|
||||
|
||||
memset(pgdata + bytes_filled, 0, PAGE_SIZE - bytes_filled);
|
||||
flush_dcache_page(page);
|
||||
kunmap_local(pgdata);
|
||||
SetPageUptodate(page);
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
flush_dcache_folio(folio);
|
||||
|
||||
success = true;
|
||||
err:
|
||||
kunmap_local(pgdata);
|
||||
ClearPageUptodate(page);
|
||||
SetPageError(page);
|
||||
unlock_page(page);
|
||||
folio_end_read(folio, success);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -14,10 +14,9 @@
|
||||
|
||||
static int efs_symlink_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
char *link = page_address(page);
|
||||
struct buffer_head * bh;
|
||||
struct inode * inode = page->mapping->host;
|
||||
char *link = folio_address(folio);
|
||||
struct buffer_head *bh;
|
||||
struct inode *inode = folio->mapping->host;
|
||||
efs_block_t size = inode->i_size;
|
||||
int err;
|
||||
|
||||
@ -40,12 +39,9 @@ static int efs_symlink_read_folio(struct file *file, struct folio *folio)
|
||||
brelse(bh);
|
||||
}
|
||||
link[size] = '\0';
|
||||
SetPageUptodate(page);
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
err = 0;
|
||||
fail:
|
||||
SetPageError(page);
|
||||
unlock_page(page);
|
||||
folio_end_read(folio, err == 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -432,31 +432,20 @@ static int hostfs_writepage(struct page *page, struct writeback_control *wbc)
|
||||
|
||||
static int hostfs_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
char *buffer;
|
||||
loff_t start = page_offset(page);
|
||||
loff_t start = folio_pos(folio);
|
||||
int bytes_read, ret = 0;
|
||||
|
||||
buffer = kmap_local_page(page);
|
||||
buffer = kmap_local_folio(folio, 0);
|
||||
bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer,
|
||||
PAGE_SIZE);
|
||||
if (bytes_read < 0) {
|
||||
ClearPageUptodate(page);
|
||||
SetPageError(page);
|
||||
if (bytes_read < 0)
|
||||
ret = bytes_read;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read);
|
||||
|
||||
ClearPageError(page);
|
||||
SetPageUptodate(page);
|
||||
|
||||
out:
|
||||
flush_dcache_page(page);
|
||||
else
|
||||
buffer = folio_zero_tail(folio, bytes_read, buffer);
|
||||
kunmap_local(buffer);
|
||||
unlock_page(page);
|
||||
|
||||
folio_end_read(folio, ret == 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -472,9 +472,8 @@ out:
|
||||
|
||||
static int hpfs_symlink_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
char *link = page_address(page);
|
||||
struct inode *i = page->mapping->host;
|
||||
char *link = folio_address(folio);
|
||||
struct inode *i = folio->mapping->host;
|
||||
struct fnode *fnode;
|
||||
struct buffer_head *bh;
|
||||
int err;
|
||||
@ -485,17 +484,9 @@ static int hpfs_symlink_read_folio(struct file *file, struct folio *folio)
|
||||
goto fail;
|
||||
err = hpfs_read_ea(i->i_sb, fnode, "SYMLINK", link, PAGE_SIZE);
|
||||
brelse(bh);
|
||||
if (err)
|
||||
goto fail;
|
||||
hpfs_unlock(i->i_sb);
|
||||
SetPageUptodate(page);
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
hpfs_unlock(i->i_sb);
|
||||
SetPageError(page);
|
||||
unlock_page(page);
|
||||
folio_end_read(folio, err == 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -307,8 +307,6 @@ static void iomap_finish_folio_read(struct folio *folio, size_t off,
|
||||
spin_unlock_irqrestore(&ifs->state_lock, flags);
|
||||
}
|
||||
|
||||
if (error)
|
||||
folio_set_error(folio);
|
||||
if (finished)
|
||||
folio_end_read(folio, uptodate);
|
||||
}
|
||||
@ -461,9 +459,6 @@ int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops)
|
||||
while ((ret = iomap_iter(&iter, ops)) > 0)
|
||||
iter.processed = iomap_readpage_iter(&iter, &ctx, 0);
|
||||
|
||||
if (ret < 0)
|
||||
folio_set_error(folio);
|
||||
|
||||
if (ctx.bio) {
|
||||
submit_bio(ctx.bio);
|
||||
WARN_ON_ONCE(!ctx.cur_folio_in_bio);
|
||||
@ -698,7 +693,6 @@ static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
|
||||
|
||||
if (folio_test_uptodate(folio))
|
||||
return 0;
|
||||
folio_clear_error(folio);
|
||||
|
||||
do {
|
||||
iomap_adjust_read_range(iter->inode, folio, &block_start,
|
||||
@ -1539,8 +1533,6 @@ iomap_finish_ioend(struct iomap_ioend *ioend, int error)
|
||||
|
||||
/* walk all folios in bio, ending page IO on them */
|
||||
bio_for_each_folio_all(fi, bio) {
|
||||
if (error)
|
||||
folio_set_error(fi.folio);
|
||||
iomap_finish_folio_write(inode, fi.folio, fi.length);
|
||||
folio_count++;
|
||||
}
|
||||
|
@ -688,11 +688,10 @@ int parse_rock_ridge_inode(struct iso_directory_record *de, struct inode *inode,
|
||||
*/
|
||||
static int rock_ridge_symlink_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
struct inode *inode = page->mapping->host;
|
||||
struct inode *inode = folio->mapping->host;
|
||||
struct iso_inode_info *ei = ISOFS_I(inode);
|
||||
struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);
|
||||
char *link = page_address(page);
|
||||
char *link = folio_address(folio);
|
||||
unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
|
||||
struct buffer_head *bh;
|
||||
char *rpnt = link;
|
||||
@ -779,9 +778,10 @@ repeat:
|
||||
goto fail;
|
||||
brelse(bh);
|
||||
*rpnt = '\0';
|
||||
SetPageUptodate(page);
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
folio_end_read(folio, ret == 0);
|
||||
return ret;
|
||||
|
||||
/* error exit from macro */
|
||||
out:
|
||||
@ -795,9 +795,8 @@ out_bad_span:
|
||||
fail:
|
||||
brelse(bh);
|
||||
error:
|
||||
SetPageError(page);
|
||||
unlock_page(page);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto end;
|
||||
}
|
||||
|
||||
const struct address_space_operations isofs_symlink_aops = {
|
||||
|
@ -95,13 +95,8 @@ static int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg)
|
||||
ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_SHIFT,
|
||||
PAGE_SIZE);
|
||||
|
||||
if (ret) {
|
||||
ClearPageUptodate(pg);
|
||||
SetPageError(pg);
|
||||
} else {
|
||||
if (!ret)
|
||||
SetPageUptodate(pg);
|
||||
ClearPageError(pg);
|
||||
}
|
||||
|
||||
flush_dcache_page(pg);
|
||||
kunmap(pg);
|
||||
@ -304,10 +299,8 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping,
|
||||
|
||||
kunmap(pg);
|
||||
|
||||
if (ret) {
|
||||
/* There was an error writing. */
|
||||
SetPageError(pg);
|
||||
}
|
||||
if (ret)
|
||||
mapping_set_error(mapping, ret);
|
||||
|
||||
/* Adjust writtenlen for the padding we did, so we don't confuse our caller */
|
||||
writtenlen -= min(writtenlen, (start - aligned_start));
|
||||
@ -330,7 +323,6 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping,
|
||||
it gets reread */
|
||||
jffs2_dbg(1, "%s(): Not all bytes written. Marking page !uptodate\n",
|
||||
__func__);
|
||||
SetPageError(pg);
|
||||
ClearPageUptodate(pg);
|
||||
}
|
||||
|
||||
|
13
fs/mpage.c
13
fs/mpage.c
@ -48,13 +48,8 @@ static void mpage_read_end_io(struct bio *bio)
|
||||
struct folio_iter fi;
|
||||
int err = blk_status_to_errno(bio->bi_status);
|
||||
|
||||
bio_for_each_folio_all(fi, bio) {
|
||||
if (err)
|
||||
folio_set_error(fi.folio);
|
||||
else
|
||||
folio_mark_uptodate(fi.folio);
|
||||
folio_unlock(fi.folio);
|
||||
}
|
||||
bio_for_each_folio_all(fi, bio)
|
||||
folio_end_read(fi.folio, err == 0);
|
||||
|
||||
bio_put(bio);
|
||||
}
|
||||
@ -65,10 +60,8 @@ static void mpage_write_end_io(struct bio *bio)
|
||||
int err = blk_status_to_errno(bio->bi_status);
|
||||
|
||||
bio_for_each_folio_all(fi, bio) {
|
||||
if (err) {
|
||||
folio_set_error(fi.folio);
|
||||
if (err)
|
||||
mapping_set_error(fi.folio->mapping, err);
|
||||
}
|
||||
folio_end_writeback(fi.folio);
|
||||
}
|
||||
|
||||
|
@ -122,8 +122,6 @@ static void nfs_readpage_release(struct nfs_page *req, int error)
|
||||
{
|
||||
struct folio *folio = nfs_page_to_folio(req);
|
||||
|
||||
if (nfs_error_is_fatal_on_server(error) && error != -ETIMEDOUT)
|
||||
folio_set_error(folio);
|
||||
if (nfs_page_group_sync_on_bit(req, PG_UNLOCKPAGE))
|
||||
if (nfs_netfs_folio_unlock(folio))
|
||||
folio_unlock(folio);
|
||||
|
@ -32,15 +32,7 @@ static int nfs_symlink_filler(struct file *file, struct folio *folio)
|
||||
int error;
|
||||
|
||||
error = NFS_PROTO(inode)->readlink(inode, &folio->page, 0, PAGE_SIZE);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
folio_mark_uptodate(folio);
|
||||
folio_unlock(folio);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
folio_set_error(folio);
|
||||
folio_unlock(folio);
|
||||
folio_end_read(folio, error == 0);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -311,7 +311,6 @@ static void nfs_mapping_set_error(struct folio *folio, int error)
|
||||
{
|
||||
struct address_space *mapping = folio_file_mapping(folio);
|
||||
|
||||
folio_set_error(folio);
|
||||
filemap_set_wb_err(mapping, error);
|
||||
if (mapping->host)
|
||||
errseq_set(&mapping->host->i_sb->s_wb_err,
|
||||
|
@ -56,7 +56,6 @@ static int orangefs_writepage_locked(struct page *page,
|
||||
ret = wait_for_direct_io(ORANGEFS_IO_WRITE, inode, &off, &iter, wlen,
|
||||
len, wr, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
SetPageError(page);
|
||||
mapping_set_error(page->mapping, ret);
|
||||
} else {
|
||||
ret = 0;
|
||||
@ -119,7 +118,6 @@ static int orangefs_writepages_work(struct orangefs_writepages *ow,
|
||||
0, &wr, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
for (i = 0; i < ow->npages; i++) {
|
||||
SetPageError(ow->pages[i]);
|
||||
mapping_set_error(ow->pages[i]->mapping, ret);
|
||||
if (PagePrivate(ow->pages[i])) {
|
||||
wrp = (struct orangefs_write_range *)
|
||||
@ -303,15 +301,10 @@ static int orangefs_read_folio(struct file *file, struct folio *folio)
|
||||
iov_iter_zero(~0U, &iter);
|
||||
/* takes care of potential aliasing */
|
||||
flush_dcache_folio(folio);
|
||||
if (ret < 0) {
|
||||
folio_set_error(folio);
|
||||
} else {
|
||||
folio_mark_uptodate(folio);
|
||||
if (ret > 0)
|
||||
ret = 0;
|
||||
}
|
||||
/* unlock the folio after the ->read_folio() routine completes */
|
||||
folio_unlock(folio);
|
||||
return ret;
|
||||
folio_end_read(folio, ret == 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int orangefs_write_begin(struct file *file,
|
||||
|
@ -274,10 +274,8 @@ orangefs_bufmap_map(struct orangefs_bufmap *bufmap,
|
||||
gossip_err("orangefs error: asked for %d pages, only got %d.\n",
|
||||
bufmap->page_count, ret);
|
||||
|
||||
for (i = 0; i < ret; i++) {
|
||||
SetPageError(bufmap->page_array[i]);
|
||||
for (i = 0; i < ret; i++)
|
||||
unpin_user_page(bufmap->page_array[i]);
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -2699,7 +2699,6 @@ fail:
|
||||
}
|
||||
bh = bh->b_this_page;
|
||||
} while (bh != head);
|
||||
folio_set_error(folio);
|
||||
BUG_ON(folio_test_writeback(folio));
|
||||
folio_start_writeback(folio);
|
||||
folio_unlock(folio);
|
||||
|
@ -101,19 +101,15 @@ static struct inode *romfs_iget(struct super_block *sb, unsigned long pos);
|
||||
*/
|
||||
static int romfs_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
struct inode *inode = page->mapping->host;
|
||||
struct inode *inode = folio->mapping->host;
|
||||
loff_t offset, size;
|
||||
unsigned long fillsize, pos;
|
||||
void *buf;
|
||||
int ret;
|
||||
|
||||
buf = kmap(page);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
buf = kmap_local_folio(folio, 0);
|
||||
|
||||
/* 32 bit warning -- but not for us :) */
|
||||
offset = page_offset(page);
|
||||
offset = folio_pos(folio);
|
||||
size = i_size_read(inode);
|
||||
fillsize = 0;
|
||||
ret = 0;
|
||||
@ -125,20 +121,14 @@ static int romfs_read_folio(struct file *file, struct folio *folio)
|
||||
|
||||
ret = romfs_dev_read(inode->i_sb, pos, buf, fillsize);
|
||||
if (ret < 0) {
|
||||
SetPageError(page);
|
||||
fillsize = 0;
|
||||
ret = -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
if (fillsize < PAGE_SIZE)
|
||||
memset(buf + fillsize, 0, PAGE_SIZE - fillsize);
|
||||
if (ret == 0)
|
||||
SetPageUptodate(page);
|
||||
|
||||
flush_dcache_page(page);
|
||||
kunmap(page);
|
||||
unlock_page(page);
|
||||
buf = folio_zero_tail(folio, fillsize, buf);
|
||||
kunmap_local(buf);
|
||||
folio_end_read(folio, ret == 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -188,7 +188,6 @@ Eend:
|
||||
"offset=%lu",
|
||||
dir->i_ino, (page->index<<PAGE_SHIFT)+offs);
|
||||
fail:
|
||||
SetPageError(page);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -228,26 +228,19 @@ const struct inode_operations vboxsf_reg_iops = {
|
||||
|
||||
static int vboxsf_read_folio(struct file *file, struct folio *folio)
|
||||
{
|
||||
struct page *page = &folio->page;
|
||||
struct vboxsf_handle *sf_handle = file->private_data;
|
||||
loff_t off = page_offset(page);
|
||||
loff_t off = folio_pos(folio);
|
||||
u32 nread = PAGE_SIZE;
|
||||
u8 *buf;
|
||||
int err;
|
||||
|
||||
buf = kmap(page);
|
||||
buf = kmap_local_folio(folio, 0);
|
||||
|
||||
err = vboxsf_read(sf_handle->root, sf_handle->handle, off, &nread, buf);
|
||||
if (err == 0) {
|
||||
memset(&buf[nread], 0, PAGE_SIZE - nread);
|
||||
flush_dcache_page(page);
|
||||
SetPageUptodate(page);
|
||||
} else {
|
||||
SetPageError(page);
|
||||
}
|
||||
buf = folio_zero_tail(folio, nread, buf + nread);
|
||||
|
||||
kunmap(page);
|
||||
unlock_page(page);
|
||||
kunmap_local(buf);
|
||||
folio_end_read(folio, err == 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -295,7 +288,6 @@ static int vboxsf_writepage(struct page *page, struct writeback_control *wbc)
|
||||
kref_put(&sf_handle->refcount, vboxsf_handle_release);
|
||||
|
||||
if (err == 0) {
|
||||
ClearPageError(page);
|
||||
/* mtime changed */
|
||||
sf_i->force_restat = 1;
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user