Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ce86d5a authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

cifs: work around samba returning -ENOENT on SetFileDisposition call



cifs: work around samba returning -ENOENT on SetFileDisposition call

Samba seems to return STATUS_OBJECT_NAME_NOT_FOUND when we try to set
the delete on close bit after doing a rename by filehandle. This looks
like a samba bug to me, but a lot of servers will do this. For now,
pretend an -ENOENT return is a success.

Samba does however seem to respect the CREATE_DELETE_ON_CLOSE bit
when opening files that already exist. Windows will ignore it, but
so adding it to the open flags should be harmless.

We're also currently ignoring the return code on the rename by
filehandle, so no need to set rc based on it.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 74553b1b
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -778,7 +778,8 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
	FILE_BASIC_INFO *info_buf;
	FILE_BASIC_INFO *info_buf;


	rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
	rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
			 DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
			 DELETE|FILE_WRITE_ATTRIBUTES,
			 CREATE_NOT_DIR|CREATE_DELETE_ON_CLOSE,
			 &netfid, &oplock, NULL, cifs_sb->local_nls,
			 &netfid, &oplock, NULL, cifs_sb->local_nls,
			 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
			 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
	if (rc != 0)
	if (rc != 0)
@@ -803,13 +804,20 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
		goto out_close;
		goto out_close;


	/* silly-rename the file */
	/* silly-rename the file */
	rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
	CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
				   cifs_sb->mnt_cifs_flags &
				   cifs_sb->mnt_cifs_flags &
					    CIFS_MOUNT_MAP_SPECIAL_CHR);
					    CIFS_MOUNT_MAP_SPECIAL_CHR);


	/* set DELETE_ON_CLOSE */
	/* set DELETE_ON_CLOSE */
	rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid);
	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
	 */
	if (rc == -ENOENT)
		rc = 0;

out_close:
out_close:
	CIFSSMBClose(xid, tcon, netfid);
	CIFSSMBClose(xid, tcon, netfid);
out:
out: