[Samba] Direct I/O

Jeremy Allison jra at samba.org
Tue Jan 25 01:30:33 UTC 2022


On Mon, Jan 24, 2022 at 05:51:04PM -0700, Christof Schmitt via samba wrote:
>On Mon, Jan 24, 2022 at 05:50:06PM -0700, Christof Schmitt wrote:
>> On Mon, Jan 24, 2022 at 10:43:11AM -0800, Jeremy Allison via samba wrote:
>> > On Mon, Jan 24, 2022 at 07:21:05PM +0100, Ralph Boehme wrote:
>> > > On 1/24/22 18:39, Jeremy Allison via samba wrote:
>> > > > No, we don't currently use O_DIRECT on Linux.
>> > > >
>> > > > It doesn't match to SMB2+ semantics.
>> > >
>> > > I think it does (SMB2_WRITEFLAG_WRITE_UNBUFFERED), but we don't yet
>> > > implement it correctly. We check the flag and basically skip an fsync()
>> > > done in some cases, but we don't pass it to the OS. I guess the problem
>> > > is that in SMB the unbuffered is requested per *write* whereas we can
>> > > only request unbuffered IO per *handle* with O_DIRECT. But I may be
>> > > missing something.
>> >
>> > Oh, good catch. I missed that flag. However I think there's another
>> > missmatch. O_DIRECT has alignment restrictions on where the
>> > IO can be performed. I think it mandates 512 byte boundaries.
>>
>> FWIW, preadv2() has RWF_DSYNC and RWF_SYNC which provide O_DSYNC and
>> O_SYNC semantics per write. Maybe one of those aligns more closely with
>> WRITE_UNBUFFERED.
>
>pwritev2() of course...

Boy I'm learning a lot from this thread :-). We currently map
SMB2_WRITEFLAG_WRITE_UNBUFFERED to 'state->write_through'
in the SMB2 server code. We'd need to update the VFS to
preadv2_send/recv in order to pass in the 'flags' field
I think.



More information about the samba mailing list