Re: Streams support in Linux

Jeremy Allison
2018-08-28T22:33:57Z

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@samba.org> 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 ?