Skip to content

Commit

Permalink
smb3: update allocation size more accurately on write completion
Browse files Browse the repository at this point in the history
Changes to allocation size are approximated for extending writes of cached
files until the server returns the actual value (on SMB3 close or query info
for example), but it was setting the estimated value for number of blocks
to larger than the file size even if the file is likely sparse which
breaks various xfstests (e.g. generic/129, 130, 221, 228).

When i_size and i_blocks are updated in write completion do not increase
allocation size more than what was written (rounded up to 512 bytes).

Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Steve French committed Mar 11, 2024
1 parent 13c2e30 commit dbfdff4
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion fs/smb/client/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -3094,8 +3094,15 @@ static int cifs_write_end(struct file *file, struct address_space *mapping,
if (rc > 0) {
spin_lock(&inode->i_lock);
if (pos > inode->i_size) {
loff_t additional_blocks = (512 - 1 + copied) >> 9;

i_size_write(inode, pos);
inode->i_blocks = (512 - 1 + pos) >> 9;
/*
* Estimate new allocation size based on the amount written.
* This will be updated from server on close (and on queryinfo)
*/
inode->i_blocks = min_t(blkcnt_t, (512 - 1 + pos) >> 9,
inode->i_blocks + additional_blocks);
}
spin_unlock(&inode->i_lock);
}
Expand Down

0 comments on commit dbfdff4

Please sign in to comment.