On Tue, Aug 28, 2018 at 01:32:39PM -0500, Steve French wrote: > On Tue, Aug 28, 2018 at 1:12 PM Jeremy Allison <jra@xxxxxxxxx> 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 ?