mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
cifs: Fix FALLOC_FL_ZERO_RANGE by setting i_size if EOF moved
commit 83d5518b124dfd605f10a68128482c839a239f9d upstream.
Fix the cifs filesystem implementations of FALLOC_FL_ZERO_RANGE, in
smb3_zero_range(), to set i_size after extending the file on the server.
Fixes: 72c419d9b0 ("cifs: fix smb3_zero_range so it can expand the file-size when required")
Cc: stable@vger.kernel.org
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Paulo Alcantara <pc@manguebit.com>
cc: Shyam Prasad N <nspmangalore@gmail.com>
cc: Rohith Surabattula <rohiths.msft@gmail.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: linux-mm@kvack.org
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c6114c8459
commit
6406cce4b2
@@ -3424,6 +3424,7 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
|
|||||||
struct inode *inode = file_inode(file);
|
struct inode *inode = file_inode(file);
|
||||||
struct cifsInodeInfo *cifsi = CIFS_I(inode);
|
struct cifsInodeInfo *cifsi = CIFS_I(inode);
|
||||||
struct cifsFileInfo *cfile = file->private_data;
|
struct cifsFileInfo *cfile = file->private_data;
|
||||||
|
unsigned long long new_size;
|
||||||
long rc;
|
long rc;
|
||||||
unsigned int xid;
|
unsigned int xid;
|
||||||
__le64 eof;
|
__le64 eof;
|
||||||
@@ -3454,10 +3455,15 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
|
|||||||
/*
|
/*
|
||||||
* do we also need to change the size of the file?
|
* do we also need to change the size of the file?
|
||||||
*/
|
*/
|
||||||
if (keep_size == false && i_size_read(inode) < offset + len) {
|
new_size = offset + len;
|
||||||
eof = cpu_to_le64(offset + len);
|
if (keep_size == false && (unsigned long long)i_size_read(inode) < new_size) {
|
||||||
|
eof = cpu_to_le64(new_size);
|
||||||
rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
|
rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
|
||||||
cfile->fid.volatile_fid, cfile->pid, &eof);
|
cfile->fid.volatile_fid, cfile->pid, &eof);
|
||||||
|
if (rc >= 0) {
|
||||||
|
truncate_setsize(inode, new_size);
|
||||||
|
fscache_resize_cookie(cifs_inode_cookie(inode), new_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zero_range_exit:
|
zero_range_exit:
|
||||||
|
|||||||
Reference in New Issue
Block a user