From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from hr2.samba.org ([144.76.82.148]:36776 "EHLO hr2.samba.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726833AbeH1Wd5 (ORCPT ); Tue, 28 Aug 2018 18:33:57 -0400 Date: Tue, 28 Aug 2018 11:40:57 -0700 From: Jeremy Allison To: Steve French Cc: Theodore Tso , Matthew Wilcox , Al Viro , linux-fsdevel , ebiggers@kernel.org, samba-technical Subject: Re: Streams support in Linux Message-ID: <20180828184057.GB97108@jra3> Reply-To: Jeremy Allison References: <20180825180026.GR6515@ZenIV.linux.org.uk> <20180825205716.GA2664@bombadil.infradead.org> <20180825223615.GS6515@ZenIV.linux.org.uk> <20180827170531.GC217636@jra3> <20180827182143.GB24544@bombadil.infradead.org> <20180828004523.GB2304@thunk.org> <20180828181245.GE41380@jra3> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Tue, Aug 28, 2018 at 01:32:39PM -0500, Steve French wrote: > On Tue, Aug 28, 2018 at 1:12 PM Jeremy Allison wrote: > > > > On Mon, Aug 27, 2018 at 08:07:35PM -0500, Steve French wrote: > > > > > > Given that streams need to be read to backup Macs and Windows > > > (and for a few features of these servers mentioned earlier) > > > and would be exposed in ntfs (and SMB3 remotely) locally on Linux, > > > seems useful to me to have some consistent way to open and read > > > them on Linux even if we don't want to generalize it to other local fs. > > > The protocol supports it fine (just a file with a reserved character > > > ':' in it) but a little tricky to avoid name conflict with posix ':' > > > in filenames > > > > This sounds like a case for a couple of ioctls. One to enumerate > > the streams on an open fd, one to open a given stream name on an > > open fd. > > We already have a (cifs.ko) ioctl to enumerate streams, but I was > less comfortable with how to structure an ioctl to read/write a > stream (other than $DATA of course). Ideas on what a "read stream" > ioctl might look like? You shouldn't need a read stream ioctl. You only need 3 I think. struct open_stream { const char *stream_name; int open_flags, int stream_fd; }; struct open_stream os = { "MyStreamName", O_CREAT, -1 }; 1). ioctl(file_or_dir_fd, FIO_OPEN_STREAM, &os); Now read/write the os->stream_fd for the created stream as desired. Use O_RDONLY|O_WRONLY|O_RDWR in the flags field as needed. 2). ioctl(file_or_dir_fd, FIO_ENUM_STREAMS_DIR, &new_fd); Now use readdir() to get the list. 3). ioctl(stream_fd, FIO_DELETE_STREAM, 0); Delete the stream opened on stream_fd. Doesn't that cover everything ?