FAILED: patch "[PATCH] smb3: missing inode locks in punch hole" failed to apply to 5.10-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From ba0803050d610d5072666be727bca5e03e55b242 Mon Sep 17 00:00:00 2001
From: David Howells <[email protected]>
Date: Tue, 23 Aug 2022 02:10:56 -0500
Subject: [PATCH] smb3: missing inode locks in punch hole
smb3 fallocate punch hole was not grabbing the inode or filemap_invalidate locks so could have race with pagemap reinstantiating the page.
Signed-off-by David Howells <[email protected]>
Signed-off-by Steve French <[email protected]>
fs/cifs/smb2ops.c +6 -6
@@ -3384,7 +3384,7 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,static long smb3_punch_hole (struct file *file,struct cifs_tcon *tcon,loff_t offset,loff_t len) { -struct inode *inode; +struct inode *inode =file_inode (file);struct cifsFileInfo *cfile = file->private_data;struct file_zero_data_information fsctl_buf;long rc;
@@ -3393,14 +3393,12 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, xid =get_xid (); - inode =d_inode (cfile->dentry); - +inode_lock (inode);/* Need to make file sparse, if not already, before freeing range. */ /* Consider adding equivalent for compressed since it could also work */ if (!smb2_set_sparse (xid, tcon, cfile, inode, set_sparse)) { rc = -EOPNOTSUPP ; -free_xid (xid); -return rc; + goto out; }filemap_invalidate_lock (inode->i_mapping);
@@ -3420,8 +3418,10 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, (char *)&fsctl_buf,sizeof (struct file_zero_data_information ), CIFSMaxBufSize, NULL, NULL); -free_xid (xid);filemap_invalidate_unlock (inode->i_mapping); +out: +inode_unlock (inode); +free_xid (xid);return rc; }