aboutsummaryrefslogtreecommitdiffstats
path: root/fs/afs/write.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2021-09-08 21:55:19 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-09-30 10:11:01 +0200
commit22538c1bde2793ffeac21c8bc5c22832ed838d29 (patch)
treea7dfaf7f9db1f3b0bed1fa4fa2fa6cb18a78bf05 /fs/afs/write.c
parent55352944b497ba567e4e5ed5c9bd0927c3f3542d (diff)
downloadkernel_replicant_linux-22538c1bde2793ffeac21c8bc5c22832ed838d29.tar.gz
kernel_replicant_linux-22538c1bde2793ffeac21c8bc5c22832ed838d29.tar.bz2
kernel_replicant_linux-22538c1bde2793ffeac21c8bc5c22832ed838d29.zip
afs: Fix updating of i_blocks on file/dir extension
[ Upstream commit 9d37e1cab2a9d2cee2737973fa455e6f89eee46a ] When an afs file or directory is modified locally such that the total file size is extended, i_blocks needs to be recalculated too. Fix this by making afs_write_end() and afs_edit_dir_add() call afs_set_i_size() rather than setting inode->i_size directly as that also recalculates inode->i_blocks. This can be tested by creating and writing into directories and files and then examining them with du. Without this change, directories show a 4 blocks (they start out at 2048 bytes) and files show 0 blocks; with this change, they should show a number of blocks proportional to the file size rounded up to 1024. Fixes: 31143d5d515e ("AFS: implement basic file write support") Fixes: 63a4681ff39c ("afs: Locally edit directory data for mkdir/create/unlink/...") Reported-by: Markus Suvanto <markus.suvanto@gmail.com> Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Marc Dionne <marc.dionne@auristor.com> Tested-by: Markus Suvanto <markus.suvanto@gmail.com> cc: linux-afs@lists.infradead.org Link: https://lore.kernel.org/r/163113612442.352844.11162345591911691150.stgit@warthog.procyon.org.uk/ Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs/afs/write.c')
-rw-r--r--fs/afs/write.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/afs/write.c b/fs/afs/write.c
index d37b5cfcf28f..be60cf110382 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -184,7 +184,7 @@ int afs_write_end(struct file *file, struct address_space *mapping,
write_seqlock(&vnode->cb_lock);
i_size = i_size_read(&vnode->vfs_inode);
if (maybe_i_size > i_size)
- i_size_write(&vnode->vfs_inode, maybe_i_size);
+ afs_set_i_size(vnode, maybe_i_size);
write_sequnlock(&vnode->cb_lock);
}