MacOS Ventura, compounded flush and close, and io_uring woes
Jeremy Allison
jra at samba.org
Thu Sep 22 16:53:12 UTC 2022
On Thu, Sep 22, 2022 at 09:49:52AM -0400, Andrew Walker via samba-technical wrote:
>Hey all,
>
>I've been seeing some issues with the MacOS Ventura beta.
>
>```
>485 15.031755 192.168.0.164 192.168.0.160 SMB2 246 Flush Request File:
>Screen Shot 2022-08-12 at 11.05.32 AM.png;Close Request File: Screen Shot
>2022-08-12 at 11.05.32 AM.png
>```
>Ventura compounds FLUSH and CLOSE requests
>
>```
>486 15.032381 192.168.0.160 192.168.0.164 SMB2 278 Flush Response, Error:
>STATUS_INTERNAL_ERROR;Close Response
>```
>We fail with STATUS_INTERNAL_ERROR on FLUSH request because we hit this:
>```
> if (req->in.vector_count > req->current_idx +
>SMBD_SMB2_NUM_IOV_PER_REQ) {
> /*
> * We're trying to go async in a compound request
> * chain. This is only allowed for opens that cause an
> * oplock break or for the last operation in the
> * chain, otherwise it is not allowed. See
> * [MS-SMB2].pdf note <206> on Section 3.3.5.2.7.
> */
> const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req);
>
> if (SVAL(inhdr, SMB2_HDR_OPCODE) != SMB2_OP_CREATE) {
> /*
> * Cancel the outstanding request.
> */
> bool ok = tevent_req_cancel(req->subreq);
> if (ok) {
> return NT_STATUS_OK;
> }
> TALLOC_FREE(req->subreq);
> return smbd_smb2_request_error(req,
> NT_STATUS_INTERNAL_ERROR);
> }
> }
>```
>
>The TALLOC_FREE() here triggers the
>vfs_io_uring_request_state_deny_destructor which destroys the uring config,
>and closes the ring_fd. Needless to say this is slightly less than
>felicitous.
>
>I have two questions regarding this:
>
>1) Are we sure this is the correct behavior vis-a-vis compounded requests?
>C.F. MS-SMB2 note:
>https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/a64e55aa-1152-48e4-8206-edd96444e7f7#Appendix_A_245
>```
><245> Section 3.3.5.2.7: In Windows Vista and Windows Server 2008, when an
>operation in a compound request requires asynchronous processing,
>Windows-based servers fail them with STATUS_INTERNAL_ERROR except for the
>following two cases: when a create request in the compound request triggers
>an oplock break, or when the operation is last in the compound request.
>```
>The above appears to be something specific to Windows Vista and Server 2008.
The behavior of going async inside a compound request is less than
well documented. This statement:
https://lists.samba.org/archive/cifs-protocol/2017-July/003064.html
is incorrect, as my early test code run against Windows 2022 shows.
I'm planning on raising a dochelp request to get this clarified.
The MacOS client coders are aware of this issue and I believe
(but cannot speak for them) that they're planning on removing
this behavior before general release.
More information about the samba-technical
mailing list