Not specifying FILE_SHARE_DELETE wasn't done intentionally. Not setting the flag
triggers the following problem:
* client sends a CREATE with delete access
* this triggers a call to open_streams_for_delete() where we check for
conflicting opens on any of the streams of the file or directory
* if the file (or directory) has a stream like ":com.apple.quarantine" the
stream is opened with DELETE_ACCESS and kept open when the next step might:
* if the file (or directory) has a Mac specific :AFP_AfpInfo stream, the
ad_convert() routine in fruit_create_file() is triggered
* ad_convert() checks if the file (or ...) has a sidecar ._ AppleDouble file, if
it has:
* in ad_convert_xattr() we unpack any set of xattrs encoded in the AppleDouble
file and recreate them as streams with the VFS. Now, if any of these xattrs
happens to be converted to a stream that we still have open in
open_streams_for_delete() (see above) we get a NT_STATUS_SHARING_VIOLATION
This error gets passed up the stack back to open_streams_for_delete() so the
client CREATE request fails and the client is unhappy.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15378
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
+++ /dev/null
-^samba3.vfs.fruit metadata_netatalk.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit metadata_stream.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit streams_depot.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit fruit_delete_empty_adfiles.delete_trigger_convert_sharing_violation\(nt4_dc\)
NULL, /* dirfsp */
stream_name, /* fname */
FILE_GENERIC_WRITE, /* access_mask */
- FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, /* share_access */
FILE_OPEN_IF, /* create_disposition */
0, /* create_options */
0, /* file_attributes */