Commit 2cd42d19 authored by David Howells's avatar David Howells

afs: Fix setting of i_blocks

The setting of i_blocks, which is calculated from i_size, has got
accidentally misordered relative to the setting of i_size when initially
setting up an inode.  Further, i_blocks isn't updated by afs_apply_status()
when the size is updated.

To fix this, break the i_size/i_blocks setting out into a helper function
and call it from both places.

Fixes: a58823ac ("afs: Fix application of status and callback to be under same lock")
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 90fa9b64
...@@ -55,6 +55,16 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren ...@@ -55,6 +55,16 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren
dump_stack(); dump_stack();
} }
/*
* Set the file size and block count. Estimate the number of 512 bytes blocks
* used, rounded up to nearest 1K for consistency with other AFS clients.
*/
static void afs_set_i_size(struct afs_vnode *vnode, u64 size)
{
i_size_write(&vnode->vfs_inode, size);
vnode->vfs_inode.i_blocks = ((size + 1023) >> 10) << 1;
}
/* /*
* Initialise an inode from the vnode status. * Initialise an inode from the vnode status.
*/ */
...@@ -124,12 +134,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key, ...@@ -124,12 +134,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key,
return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type); return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type);
} }
/* afs_set_i_size(vnode, status->size);
* Estimate 512 bytes blocks used, rounded up to nearest 1K
* for consistency with other AFS clients.
*/
inode->i_blocks = ((i_size_read(inode) + 1023) >> 10) << 1;
i_size_write(&vnode->vfs_inode, status->size);
vnode->invalid_before = status->data_version; vnode->invalid_before = status->data_version;
inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
...@@ -232,7 +237,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, ...@@ -232,7 +237,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc,
if (data_changed) { if (data_changed) {
inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
i_size_write(&vnode->vfs_inode, status->size); afs_set_i_size(vnode, status->size);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment