mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
ksmbd: fix incorrect AllocationSize set in smb2_get_info
If filesystem support sparse file, ksmbd should return allocated size using ->i_blocks instead of stat->size. This fix generic/694 xfstests. Cc: stable@vger.kernel.org Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
36322523dd
commit
6cc2268f56
1 changed files with 3 additions and 18 deletions
|
@ -4369,21 +4369,6 @@ static int get_file_basic_info(struct smb2_query_info_rsp *rsp,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long long get_allocation_size(struct inode *inode,
|
||||
struct kstat *stat)
|
||||
{
|
||||
unsigned long long alloc_size = 0;
|
||||
|
||||
if (!S_ISDIR(stat->mode)) {
|
||||
if ((inode->i_blocks << 9) <= stat->size)
|
||||
alloc_size = stat->size;
|
||||
else
|
||||
alloc_size = inode->i_blocks << 9;
|
||||
}
|
||||
|
||||
return alloc_size;
|
||||
}
|
||||
|
||||
static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
|
||||
struct ksmbd_file *fp, void *rsp_org)
|
||||
{
|
||||
|
@ -4398,7 +4383,7 @@ static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
|
|||
sinfo = (struct smb2_file_standard_info *)rsp->Buffer;
|
||||
delete_pending = ksmbd_inode_pending_delete(fp);
|
||||
|
||||
sinfo->AllocationSize = cpu_to_le64(get_allocation_size(inode, &stat));
|
||||
sinfo->AllocationSize = cpu_to_le64(inode->i_blocks << 9);
|
||||
sinfo->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
|
||||
sinfo->NumberOfLinks = cpu_to_le32(get_nlink(&stat) - delete_pending);
|
||||
sinfo->DeletePending = delete_pending;
|
||||
|
@ -4463,7 +4448,7 @@ static int get_file_all_info(struct ksmbd_work *work,
|
|||
file_info->Attributes = fp->f_ci->m_fattr;
|
||||
file_info->Pad1 = 0;
|
||||
file_info->AllocationSize =
|
||||
cpu_to_le64(get_allocation_size(inode, &stat));
|
||||
cpu_to_le64(inode->i_blocks << 9);
|
||||
file_info->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
|
||||
file_info->NumberOfLinks =
|
||||
cpu_to_le32(get_nlink(&stat) - delete_pending);
|
||||
|
@ -4652,7 +4637,7 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
|
|||
file_info->ChangeTime = cpu_to_le64(time);
|
||||
file_info->Attributes = fp->f_ci->m_fattr;
|
||||
file_info->AllocationSize =
|
||||
cpu_to_le64(get_allocation_size(inode, &stat));
|
||||
cpu_to_le64(inode->i_blocks << 9);
|
||||
file_info->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
|
||||
file_info->Reserved = cpu_to_le32(0);
|
||||
rsp->OutputBufferLength =
|
||||
|
|
Loading…
Reference in a new issue