linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Vivek Goyal <vgoyal@redhat.com>
Cc: Ioannis Angelakopoulos <iangelak@redhat.com>,
	Stef Bon <stefbon@gmail.com>, Jan Kara <jack@suse.cz>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	virtio-fs-list <virtio-fs@redhat.com>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Miklos Szeredi <miklos@szeredi.hu>,
	Steve French <sfrench@samba.org>,
	Nathan Youngman <git@nathany.com>
Subject: Re: [RFC PATCH 0/7] Inotify support in FUSE and virtiofs
Date: Sat, 18 Dec 2021 10:28:35 +0200	[thread overview]
Message-ID: <CAOQ4uxiWL8bc6f1qY+uzr3_FyN3S3o7sMToqy08G8okHOX-LEQ@mail.gmail.com> (raw)
In-Reply-To: <YbybZQHaSxV5MXkI@redhat.com>

> > >
> > > > 2. For FS_RENAME, will we be able to pass 4 buffers in iov?
> > > >     src_fuse_notify_fsnotify_out, src_name,
> > > >     dst_fuse_notify_fsnotify_out, dst_name
> > >
> > > So it is sort of two fsnotify events travelling in same event. We will
> > > have to have some sort of information in the src_fuse_notify_fsnotify_out
> > > which signals that another fsnotify_out is following. May be that's
> > > where fsnotify_flags->field can be used. Set a bit to signal another
> > > fsnotify_out is part of same event and this will also mean first one
> > > is src and second one is dst.
> > >
> > > Challenge I see is "src_name" and "dst_name", especially in the context
> > > of virtio queues.
> > >
> > > So we have a notification queue and for each notification, driver
> > > allocates a fixed amount of memory for each element and queues these
> > > elements in virtqueue. Server side pops these elements, places
> > > notification info in this vq element and sends back.
> > >
> > > So basically size of notification buffer needs to be known in advance,
> > > because these are allocated by driver (and not device/server). And
> > > that's the reason virtio spec has added a new filed "notify_buf_size"
> > > in device configuration space. Using this field device lets the driver
> > > know how much memory to allocate for each notification element.
> > >
> > > IOW, we can put variable sized elements in notifiation but max size
> > > of that variable length needs to be fixed in advance and needs to
> > > be told to driver at device initialization time.
> > >
> > > So what can be the max length of "src_name" and "dst_name"? Is it fair
> > > to use NAME_MAX to determine max length of name. So say "255" bytes
> > > (not including null) for each name. That means notify_buf_size will
> > > be.
> > >
> > > notify_buf_size = 2 * 255 + 2 * sizeof(struct fuse_notify_fsnotify_out);
> > >
> >
> > Can you push two subsequent elements to the events queue atomically?
> > If you can, then it is not a problem to queue the FS_MOVED_FROM
> > event (with one name) followed by FS_MOVED_TO event with
> > a self generated cookie in response to FAN_RENAME event on virtiofsd
> > server and rejoin them in virtiofs client.
>
> Hmm..., so basically break down FAN_RENAME event into two events joined
> by cookie and send them separately. I guess sounds reasonable because
> it helps reduce the max size of event.
>
> What do you mean by "atomically"? Do you mean strict ordering and these
> two events are right after each other. But if they are joined by cookie,
> we don't have to enforce it. Driver should be able to maintain an internal
> list and queue the event and wait for pair event to arrive. This also

This is what I would consider repeating mistakes of past APIs (i.e. inotify).
Why should the driver work hard to join events that were already joint before
the queue? Is there really a technical challenge in queueing the two events
together?

> means that these broken down events will have to be joined back, possibly
> by some fsnotify helper.
>

Currently, for local events, fsnotify() gets from vfs old dir inode and old name
and the moved dentry, from which fanotify extracts all other information.
Same for events on child (e.g. FS_OPEN).

Getting that moved (or opened) fuse dentry may be a challenge.
Driver can look for a dentry with the parent dir and child inode and name,
but there may not be such an entry in dcache or no such entry at all,
by the time the event is read by the driver.

I guess in that case, we could allow passing a disconnected dentry
and teach fanotify how to deal with it and not report the NEW_DFID
record or the child FID record, so I think it's doable.

> We will probably need a flag to differentiate whether its the case of
> broken down FAN_RENAME or not. Because in this case driver will wait
> for second event to arrive. But if it is regular FS_MOVED_FROM event,
> then don't wait and deliver it to user space.
>

Yes, a "multi part event" flag.

> Driver will have to be careful to not block actual event queue event
> while waiting for pair event to arrive. It should create a copy and
> add virtqueue element back to notification queue. Otherwise deadlock
> is possible where all elements in virtqueue are being used to wait for
> pair event and no free elements are available to actually send paired
> event.
>

See, this is the unneeded complexity I am talking about.
Letting the server wait until there are swo slots available in the queue
and always queue the two parts together seems a lot easier, unless
I am missing something?

> >
> > You see, I don't mind using the rename cookie API as long as rejoining
> > the disjoint events is possible for reporting the joint event to fanotify user.
>
> Right this will allow server to join independent FAN_MOVED_FROM and
> FAN_MOVED_TO if need be.
>

Yes, if the server wants, it can work harder to join independent inotify events,
but it is not a must.

> >
> > In case virtiofsd backend is implemented with inotify, it will receive and
> > report only disjoint events and in that case, FAN_RENAME cannot be
> > requested by fanotify user which is fine, as long as it will be possible
> > with another implementation of virtiofsd server down the road.
>
> Fair enough. In simplest form, virtiofsd will support FAN_RENAME only if
> host kernel fanotify supports FAN_RENAME.

Correct.
Or as I wrote before, a multi-client server can also report FS_RENAME
after executing a rename request from another client.
You need to think of the remote fsnotify service in a manner that is completely
detached from the backend facility used to provide the notifications.

>
> In more advanced form, virtiofsd (or other server) can wait for two
> events and then join and report as FAN_RENAME with user space generated
> cookie.
>

Yeh, that's possible.

> I think I like this idea of reporting two events joined by cookie to
> reduce the size of event. Will give it a try.
>

I am glad we seem to be converging :)

Thanks,
Amir.

  reply	other threads:[~2021-12-18  8:28 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-25 20:46 [RFC PATCH 0/7] Inotify support in FUSE and virtiofs Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 1/7] FUSE: Add the fsnotify opcode and in/out structs to FUSE Ioannis Angelakopoulos
2021-10-26 14:56   ` Amir Goldstein
2021-10-26 18:28     ` Amir Goldstein
     [not found]     ` <CAO17o20+jiij64y7b3eKoCjG5b_mLZj6o1LSnZ7+8exN3dFYEg@mail.gmail.com>
2021-10-27  5:46       ` Amir Goldstein
2021-10-27 21:46     ` Vivek Goyal
2021-10-28  4:13       ` Amir Goldstein
2021-10-28 14:20         ` Vivek Goyal
2021-10-25 20:46 ` [RFC PATCH 2/7] FUSE: Add the remote inotify support capability " Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 3/7] FUSE,Inotify,Fsnotify,VFS: Add the fuse_fsnotify_update_mark inode operation Ioannis Angelakopoulos
2021-10-26 15:06   ` Amir Goldstein
2021-11-01 17:49     ` Vivek Goyal
2021-11-02  7:34       ` Amir Goldstein
2021-10-25 20:46 ` [RFC PATCH 4/7] FUSE: Add the fuse_fsnotify_send_request to FUSE Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 5/7] Fsnotify: Add a wrapper around the fsnotify function Ioannis Angelakopoulos
2021-10-26 14:37   ` Amir Goldstein
2021-10-26 15:38     ` Vivek Goyal
2021-10-25 20:46 ` [RFC PATCH 6/7] FUSE,Fsnotify: Add the fuse_fsnotify_event inode operation Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 7/7] virtiofs: Add support for handling the remote fsnotify notifications Ioannis Angelakopoulos
2021-10-26 15:23 ` [RFC PATCH 0/7] Inotify support in FUSE and virtiofs Amir Goldstein
2021-10-26 15:52   ` Vivek Goyal
2021-10-26 18:19     ` Amir Goldstein
2021-10-26 16:18   ` Vivek Goyal
2021-10-26 17:59     ` Amir Goldstein
2021-10-26 18:27       ` Vivek Goyal
2021-10-26 19:04         ` Amir Goldstein
     [not found]         ` <CAO17o20sdKAWQN6w7Oe0Ze06qcK+J=6rrmA_aWGnY__MRVDCKw@mail.gmail.com>
2021-10-27  5:59           ` Amir Goldstein
2021-10-27 13:23             ` Jan Kara
2021-10-27 20:29               ` Vivek Goyal
2021-10-27 20:37                 ` Vivek Goyal
2021-11-02 11:09                 ` Jan Kara
2021-11-02 12:54                   ` Amir Goldstein
2021-11-02 20:34                     ` Vivek Goyal
2021-11-03  7:31                       ` Amir Goldstein
2021-11-03 22:29                         ` Vivek Goyal
2021-11-04  5:19                           ` Amir Goldstein
2021-11-03 10:09                     ` Jan Kara
2021-11-03 11:17                       ` Amir Goldstein
2021-11-03 22:36                         ` Vivek Goyal
2021-11-04  5:29                           ` Amir Goldstein
2021-11-04 10:03                           ` Jan Kara
2021-11-05 14:30                             ` Vivek Goyal
2021-11-10  6:28                               ` Amir Goldstein
2021-11-11 17:30                                 ` Jan Kara
2021-11-11 20:52                                   ` Amir Goldstein
2021-11-16  5:09                                     ` Stef Bon
     [not found]                                       ` <CAO17o21YVczE2-BTAVg-0HJU6gjSUkzUSqJVs9k-_t7mYFNHaA@mail.gmail.com>
2021-11-17  6:40                                         ` Amir Goldstein
2021-11-30 15:27                                           ` Vivek Goyal
     [not found]                                             ` <CAO17o21uh3fJHd0gMu-SmZei5et6HJo91DiLk_YyfUqrtHy2pQ@mail.gmail.com>
2021-12-15  7:10                                               ` Amir Goldstein
2021-12-15 16:44                                                 ` Vivek Goyal
2021-12-15 17:29                                                   ` Amir Goldstein
2021-12-15 19:20                                                     ` Vivek Goyal
2021-12-15 19:54                                                       ` Amir Goldstein
2021-12-16 11:03                                                         ` Amir Goldstein
2021-12-16 16:24                                                           ` Vivek Goyal
2021-12-16 18:22                                                             ` Amir Goldstein
2021-12-16 22:24                                                               ` Vivek Goyal
2021-12-17  4:21                                                                 ` Amir Goldstein
2021-12-17 14:15                                                                   ` Vivek Goyal
2021-12-18  8:28                                                                     ` Amir Goldstein [this message]
2021-12-20 16:41                                                                       ` Vivek Goyal
2021-12-20 18:22                                                                         ` Amir Goldstein
2022-01-06 23:37                                             ` Steve French
2021-11-30 15:36                                       ` Vivek Goyal
2021-10-27 20:24             ` Vivek Goyal
2021-10-28  5:11               ` Amir Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOQ4uxiWL8bc6f1qY+uzr3_FyN3S3o7sMToqy08G8okHOX-LEQ@mail.gmail.com \
    --to=amir73il@gmail.com \
    --cc=git@nathany.com \
    --cc=iangelak@redhat.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=sfrench@samba.org \
    --cc=stefbon@gmail.com \
    --cc=vgoyal@redhat.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=virtio-fs@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).