cifs: don't use CREATE_DELETE_ON_CLOSE in cifs_rename_pending_delete
cifs: don't use CREATE_DELETE_ON_CLOSE in cifs_rename_pending_delete CREATE_DELETE_ON_CLOSE apparently has different semantics than when you set the DELETE_ON_CLOSE bit after opening the file. Setting it in the open says "delete this file as soon as this filehandle is closed". That's not what we want for cifs_rename_pending_delete. Don't set this bit in the CreateFlags. Experimentation shows that setting this flag in the SET_FILE_INFO call has no effect. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									469ee614aa
								
							
						
					
					
						commit
						dd1db2dedc
					
				@ -784,8 +784,7 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
 | 
			
		||||
	FILE_BASIC_INFO *info_buf;
 | 
			
		||||
 | 
			
		||||
	rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
 | 
			
		||||
			 DELETE|FILE_WRITE_ATTRIBUTES,
 | 
			
		||||
			 CREATE_NOT_DIR|CREATE_DELETE_ON_CLOSE,
 | 
			
		||||
			 DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
 | 
			
		||||
			 &netfid, &oplock, NULL, cifs_sb->local_nls,
 | 
			
		||||
			 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
 | 
			
		||||
	if (rc != 0)
 | 
			
		||||
@ -810,17 +809,23 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
 | 
			
		||||
		goto out_close;
 | 
			
		||||
	cifsInode->cifsAttrs = dosattr;
 | 
			
		||||
 | 
			
		||||
	/* silly-rename the file */
 | 
			
		||||
	CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
 | 
			
		||||
	/* rename the file */
 | 
			
		||||
	rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
 | 
			
		||||
				   cifs_sb->mnt_cifs_flags &
 | 
			
		||||
					    CIFS_MOUNT_MAP_SPECIAL_CHR);
 | 
			
		||||
	if (rc != 0)
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	/* set DELETE_ON_CLOSE */
 | 
			
		||||
	rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * some samba versions return -ENOENT when we try to set the file
 | 
			
		||||
	 * disposition here. Likely a samba bug, but work around it for now
 | 
			
		||||
	 * disposition here. Likely a samba bug, but work around it for now.
 | 
			
		||||
	 * This means that some cifsXXX files may hang around after they
 | 
			
		||||
	 * shouldn't.
 | 
			
		||||
	 *
 | 
			
		||||
	 * BB: remove this once fixed samba servers are in the field
 | 
			
		||||
	 */
 | 
			
		||||
	if (rc == -ENOENT)
 | 
			
		||||
		rc = 0;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user