Patch "cifs: Fix rmdir failure due to ongoing I/O on deleted file" has been added to the 6.12-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    cifs: Fix rmdir failure due to ongoing I/O on deleted file

to the 6.12-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     cifs-fix-rmdir-failure-due-to-ongoing-i-o-on-deleted.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5b830ec5229762b4d7ff782b009aff28ad97fc16
Author: David Howells <dhowells@xxxxxxxxxx>
Date:   Fri Dec 6 11:06:32 2024 +0000

    cifs: Fix rmdir failure due to ongoing I/O on deleted file
    
    [ Upstream commit bb57c81e97e0082abfb0406ed6f67c615c3d206c ]
    
    The cifs_io_request struct (a wrapper around netfs_io_request) holds open
    the file on the server, even beyond the local Linux file being closed.
    This can cause problems with Windows-based filesystems as the file's name
    still exists after deletion until the file is closed, preventing the parent
    directory from being removed and causing spurious test failures in xfstests
    due to inability to remove a directory.  The symptom looks something like
    this in the test output:
    
       rm: cannot remove '/mnt/scratch/test/p0/d3': Directory not empty
       rm: cannot remove '/mnt/scratch/test/p1/dc/dae': Directory not empty
    
    Fix this by waiting in unlink and rename for any outstanding I/O requests
    to be completed on the target file before removing that file.
    
    Note that this doesn't prevent Linux from trying to start new requests
    after deletion if it still has the file open locally - something that's
    perfectly acceptable on a UNIX system.
    
    Note also that whilst I've marked this as fixing the commit to make cifs
    use netfslib, I don't know that it won't occur before that.
    
    Fixes: 3ee1a1fc3981 ("cifs: Cut over to using netfslib")
    Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
    Acked-by: Paulo Alcantara (Red Hat) <pc@xxxxxxxxxxxxx>
    cc: Jeff Layton <jlayton@xxxxxxxxxx>
    cc: linux-cifs@xxxxxxxxxxxxxxx
    cc: netfs@xxxxxxxxxxxxxxx
    cc: linux-fsdevel@xxxxxxxxxxxxxxx
    Signed-off-by: Steve French <stfrench@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
index b35fe1075503..fafc07e38663 100644
--- a/fs/smb/client/inode.c
+++ b/fs/smb/client/inode.c
@@ -1925,6 +1925,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)
 		goto unlink_out;
 	}
 
+	netfs_wait_for_outstanding_io(inode);
 	cifs_close_deferred_file_under_dentry(tcon, full_path);
 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 	if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
@@ -2442,8 +2443,10 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
 	}
 
 	cifs_close_deferred_file_under_dentry(tcon, from_name);
-	if (d_inode(target_dentry) != NULL)
+	if (d_inode(target_dentry) != NULL) {
+		netfs_wait_for_outstanding_io(d_inode(target_dentry));
 		cifs_close_deferred_file_under_dentry(tcon, to_name);
+	}
 
 	rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
 			    to_name);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux