[PATCH]: Fix a delete on close divergence from windows and the
associated torture test
Tim Prouty
tprouty at samba.org
Sun Dec 7 02:30:10 GMT 2008
Hi Jeremy,
While working on the OneFS SMB_VFS_CREATE_FILE implementation, I
discovered what looks like a bug in the delete on close semantics in
master, and probably prior releases. To get you up to speed, I've
been spending time analyzing your addition of the
SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE flag (commit:
dbfd6bf8c8cc9945c4ba7e22ac44b1f33f9c7ce6).
The issue that got me started on this is that smbtorture4 BASE-DELETE
is failing for me when I run it against win2k3, win2k8, and winXPsp2.
They all fail on deltest17. Winxp also fails two other tests which I
believe is due to an implementation difference between the two, and I
have added comments in the associated tests in the patches linked to
below.
deltest17 does the following:
1. open file -> file is created
2. closes file
3. open file with DOC -> fnum1
4. check that DOC is not reported as being set from fnum1
5. opens file again Read Only -> fnum2
6. check that DOC is not reported as being set from either file handle
7. close fnum1 (the file handle that requested DOC to be set)
8. check if DOC is reported as being set from fnum2
* This is where windows and samba begin to diverge. Windows reports
that the DOC bit is set, while samba reports that it is not set.
9. close fnum2 (the last remaining open handle for the file)
10. See if the file has been deleted.
* On samba the file still exists. On windows the file was deleted.
The way open_file_ntcreate is written now, if an open has the DOC bit
set on the wire, DOC (fsp->initial_delete_on_close) is not set unless:
a. the open creates the file, or
b. there is an open file handle with a share_entry in the struct lck
that has the SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE bit set (let's
call it SM_AIDOC).
My understanding of SM_AIDOC is that it was added to differentiate
between DOC being set on an open that creates a file vs an open that
opens an existing. As described in step 8/10 above, it appears that
windows does not make this differentiation. Have you seen evidence to
support that this isn't the case?
To resolve this issue I have written two patches:
http://git.samba.org/?p=tprouty/samba.git;a=shortlog;h=refs/heads/delete_on_close_bug
.
The first patch is a simple proof of concept change that is sufficient
to fix the bug. It removes the differentiation in
open_file_ntcreate, and updates deltest17 to allow it to pass against
win2k3/xp. This makes open_file_ntcreate more closely match the
semantics in open_directory and rename_internals_fsp. This change
also does not break any other tests in BASE-DELETE or "make test".
Specifically test deltest20b which verifies the CIFSFS rename DOC
semantics still passes :).
The second patch cleans up by removing all of the code that is made
obsolete by the first patch. It should cause no functional changes.
I know the DOC on close semantics are complicated and delicate, so I
would love some feedback before I push these patches.
-Tim
More information about the samba-technical
mailing list