[cifs-protocol] MS-SMB2: write-through and unbuffered IO - TrackingID#2502270040011252

Ralph Boehme slow at samba.org
Fri Mar 14 12:23:11 UTC 2025


Hi Kristian,

thanks, makes sense.

On a related note: from SDC presentations and from memory, for SMB3 
Persistent Handles the server must ensure that IO is persisted on stable 
storage before sending a response to the client, iow force 
SMB2_WRITEFLAG_WRITE_THROUGH for all IO requests on Persistent Handles.

<https://www.snia.org/educational-library/smb-22-bigger-faster-scalier-parts-1-and-2-2011>

Page 42:

"All modifications made via the handle are persisted to stable
storage before the I/O is completed."

However, I fail to find any protocol documentation corresponding to this 
requirement. Can you please point me at the relevant section(s)?

Thanks!
-slow

On 3/13/25 10:50 PM, Kristian Smith wrote:
> Hi Slow,
> 
> Thanks again for your patience while I researched this. I have confirmed that the per-request write-through flag is only supported for unbuffered writes. There is a discrepancy, however, in the wording of the doc such that the AND in the following quote:
> 
> "If Connection.Dialect is "3.0.2" or "3.1.1", SMB2_WRITEFLAG_WRITE_THROUGH is set in the Flags field of the request, SMB2_WRITEFLAG_WRITE_UNBUFFERED is not set in the Flags field of the request, and Open.CreateOptions doesn't include the FILE_NO_INTERMEDIATE_BUFFERING bit, the server MUST fail the request with STATUS_INVALID_PARAMETER."
> 
> Should be an OR as seen below:
> 
> " If Connection.Dialect is "3.0.2" or "3.1.1", SMB2_WRITEFLAG_WRITE_THROUGH is set in the Flags field of the request, SMB2_WRITEFLAG_WRITE_UNBUFFERED is not set in the Flags field of the request, OR Open.CreateOptions doesn't include the FILE_NO_INTERMEDIATE_BUFFERING bit, the server MUST fail the request with STATUS_INVALID_PARAMETER."
> 
> You should see this change in a future release of the document. Please let me know if you have any other questions or concerns.
> 
> Regards,
> Kristian Smith
> Support Escalation Engineer | Microsoft® Corporation
> Email: kristian.smith at microsoft.com
> 
> -----Original Message-----
> From: Kristian Smith
> Sent: Tuesday, March 11, 2025 8:43 AM
> To: Ralph Boehme <slow at samba.org>
> Cc: cifs-protocol at lists.samba.org; Microsoft Support <supportmail at microsoft.com>
> Subject: RE: MS-SMB2: write-through and unbuffered IO - TrackingID#2502270040011252
> 
> Hi Slow,
> 
> Apologies for the delayed response on this question. I've been researching the code on this issue and should have findings soon.
> 
> Thank you for your patience.
> 
> Regards,
> Kristian Smith
> Support Escalation Engineer | Microsoft® Corporation
> Email: kristian.smith at microsoft.com
> 
> -----Original Message-----
> From: Obaid Farooqi <obaidf at microsoft.com>
> Sent: Thursday, February 27, 2025 9:47 AM
> To: Ralph Boehme <slow at samba.org>
> Cc: cifs-protocol at lists.samba.org; Microsoft Support <supportmail at microsoft.com>
> Subject: MS-SMB2: write-through and unbuffered IO - TrackingID#2502270040011252
> 
> Hi Ralph:
> Thanks for contacting Microsoft. I have created a case to track this issue. A member of the open specifications team will be in touch soon.
> 
> Regards,
> Obaid Farooqi
> Escalation Engineer | Microsoft
> 
> -----Original Message-----
> From: Ralph Boehme <slow at samba.org>
> Sent: Thursday, February 27, 2025 8:42 AM
> To: Interoperability Documentation Help <dochelp at microsoft.com>
> Cc: cifs-protocol at lists.samba.org
> Subject: [EXTERNAL] MS-SMB2: write-through and unbuffered IO
> 
> Hello dochelp,
> 
> I'm doing some research on the expected server behaviour wrt to write-through and unbuffered IO, driven by working on the Persistent Handles implementation in Samba.
> 
> As per MS-SMB2 the protocol offers knobs to request these
> 
> 1) at open time, and
> 2) per write
> 
> For 1) there are
> 
> FILE_WRITE_THROUGH
> FILE_NO_INTERMEDIATE_BUFFERING
> 
> and for 2) there are
> 
> SMB2_WRITEFLAG_WRITE_THROUGH
> SMB2_WRITEFLAG_WRITE_UNBUFFERED
> 
> The protocol documentation (also when read together with MS-FSA and
> MS-CIFS) seems to be a bit vague wrt to dependencies between per-open behaviour and per-write behaviour.
> 
> ---8<---
> 3.3.5.13 "Receiving an SMB2 WRITE Request"
> 
> If Connection.Dialect is "3.0.2" or "3.1.1", SMB2_WRITEFLAG_WRITE_THROUGH is set in the Flags field of the request, SMB2_WRITEFLAG_WRITE_UNBUFFERED is not set in the Flags field of the request, and Open.CreateOptions doesn't include the FILE_NO_INTERMEDIATE_BUFFERING bit, the server MUST fail the request with STATUS_INVALID_PARAMETER.
> 
> If Connection.Dialect is "2.1" or "3.0", SMB2_WRITEFLAG_WRITE_THROUGH is set in the Flags field of the request, and Open.CreateOptions doesn't include the FILE_NO_INTERMEDIATE_BUFFERING bit, the server MUST fail the request with STATUS_INVALID_PARAMETER.
> ---8<---
> 
> If my reading of the above paragraph is correct, it is not possible to to request per-write write-through IO without requesting unbuffered IO on the handle.
> 
> Is this true? Am I missing something? Can you please clarify?
> 
> Thanks!
> -slow
> 




More information about the cifs-protocol mailing list