On Tue, Jun 27, 2023 at 10:30 AM Christian Brauner <brauner@xxxxxxxxxx> wrote: > > On Tue, Jun 27, 2023 at 10:09:27AM -0700, Suren Baghdasaryan wrote: > > On Tue, Jun 27, 2023 at 1:24 AM Christian Brauner <brauner@xxxxxxxxxx> wrote: > > > > > > On Mon, Jun 26, 2023 at 10:31:49AM -1000, Tejun Heo wrote: > > > > On Mon, Jun 26, 2023 at 01:17:12PM -0700, Suren Baghdasaryan wrote: > > > > > diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h > > > > > index 73f5c120def8..a7e404ff31bb 100644 > > > > > --- a/include/linux/kernfs.h > > > > > +++ b/include/linux/kernfs.h > > > > > @@ -273,6 +273,11 @@ struct kernfs_ops { > > > > > */ > > > > > int (*open)(struct kernfs_open_file *of); > > > > > void (*release)(struct kernfs_open_file *of); > > > > > + /* > > > > > + * Free resources tied to the lifecycle of the file, like a > > > > > + * waitqueue used for polling. > > > > > + */ > > > > > + void (*free)(struct kernfs_open_file *of); > > > > > > > > I think this can use a bit more commenting - ie. explain that release may be > > > > called earlier than the actual freeing of the file and how that can lead to > > > > problems. Othre than that, looks fine to me. > > > > > > It seems the more natural thing to do would be to introduce a ->drain() > > > operation and order it before ->release(), no? > > > > I assume you mean we should add a ->drain() operation and call it when > > kernfs_drain_open_files() causes kernfs_release_file()? That would > > work but if any existing release() handler counts on the current > > behavior (release() being called while draining) then we should find > > and fix these. Hopefully they don't really depend on the current > > behavior but I dunno. > > Before I wrote that I did a naive > > > git grep -A 20 kernfs_ops | grep \\.release > kernel/cgroup/cgroup.c- .release = cgroup_file_release, > kernel/cgroup/cgroup.c- .release = cgroup_file_release, > > which only gave cgroup_release_file(). Might be I'm missing some convoluted > callchains though or macro magic... > > ->release() was added in > > commit 0e67db2f9fe91937e798e3d7d22c50a8438187e1 > kernfs: add kernfs_ops->open/release() callbacks > > Add ->open/release() methods to kernfs_ops. ->open() is called when > the file is opened and ->release() when the file is either released or > severed. These callbacks can be used, for example, to manage > persistent caching objects over multiple seq_file iterations. > > Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> > Acked-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Acked-by: Acked-by: Zefan Li <lizefan@xxxxxxxxxx> > > > which mentions "either releases or severed" which imho already points to > separate methods. Interesting. I guess we can add op->drain() and make all existing handlers of ops->release() to handle ops->drain() with the same handler. That should keep them happy and for my case I'll be releasing resources only inside ops->release(). Does that sound good? > > -- > To unsubscribe from this group and stop receiving emails from it, send an email to kernel-team+unsubscribe@xxxxxxxxxxx. >