diff options
author | Fabian Frederick <fabf@skynet.be> | 2017-04-24 16:12:57 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-04-26 23:54:06 -0400 |
commit | 077e073e8f9ebc6bdd3f3f0324b16db07147a232 (patch) | |
tree | ce16ea16b55fb4fe3a1404bb1c482b1ce53196d6 /fs/affs/file.c | |
parent | a9d6cfb70f71e3d7fb4fe90db40f965e7096bdab (diff) |
fs/affs: bugfix: enable writes on OFS disks
We called unconditionally affs_bread_ino() with create 0 resulting in
"error (device ...): get_block(): strange block request 0"
when trying to write on AFFS OFS format.
This patch adds create parameter to that function.
0 for affs_readpage_ofs()
1 for affs_write_begin_ofs()
Bug was found here:
https://bugzilla.kernel.org/show_bug.cgi?id=114961
Signed-off-by: Fabian Frederick <fabf@skynet.be>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/affs/file.c')
-rw-r--r-- | fs/affs/file.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/affs/file.c b/fs/affs/file.c index 0deec9cc2362..e5c5de6b85e5 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c | |||
@@ -499,7 +499,7 @@ affs_getemptyblk_ino(struct inode *inode, int block) | |||
499 | } | 499 | } |
500 | 500 | ||
501 | static int | 501 | static int |
502 | affs_do_readpage_ofs(struct page *page, unsigned to) | 502 | affs_do_readpage_ofs(struct page *page, unsigned to, int create) |
503 | { | 503 | { |
504 | struct inode *inode = page->mapping->host; | 504 | struct inode *inode = page->mapping->host; |
505 | struct super_block *sb = inode->i_sb; | 505 | struct super_block *sb = inode->i_sb; |
@@ -518,7 +518,7 @@ affs_do_readpage_ofs(struct page *page, unsigned to) | |||
518 | boff = tmp % bsize; | 518 | boff = tmp % bsize; |
519 | 519 | ||
520 | while (pos < to) { | 520 | while (pos < to) { |
521 | bh = affs_bread_ino(inode, bidx, 0); | 521 | bh = affs_bread_ino(inode, bidx, create); |
522 | if (IS_ERR(bh)) | 522 | if (IS_ERR(bh)) |
523 | return PTR_ERR(bh); | 523 | return PTR_ERR(bh); |
524 | tmp = min(bsize - boff, to - pos); | 524 | tmp = min(bsize - boff, to - pos); |
@@ -620,7 +620,7 @@ affs_readpage_ofs(struct file *file, struct page *page) | |||
620 | memset(page_address(page) + to, 0, PAGE_SIZE - to); | 620 | memset(page_address(page) + to, 0, PAGE_SIZE - to); |
621 | } | 621 | } |
622 | 622 | ||
623 | err = affs_do_readpage_ofs(page, to); | 623 | err = affs_do_readpage_ofs(page, to, 0); |
624 | if (!err) | 624 | if (!err) |
625 | SetPageUptodate(page); | 625 | SetPageUptodate(page); |
626 | unlock_page(page); | 626 | unlock_page(page); |
@@ -657,7 +657,7 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping | |||
657 | return 0; | 657 | return 0; |
658 | 658 | ||
659 | /* XXX: inefficient but safe in the face of short writes */ | 659 | /* XXX: inefficient but safe in the face of short writes */ |
660 | err = affs_do_readpage_ofs(page, PAGE_SIZE); | 660 | err = affs_do_readpage_ofs(page, PAGE_SIZE, 1); |
661 | if (err) { | 661 | if (err) { |
662 | unlock_page(page); | 662 | unlock_page(page); |
663 | put_page(page); | 663 | put_page(page); |