Provides a per process hook for the acquisition of file descriptors,
despite the method used to obtain the descriptor.
Signed-off-by: Kalesh Singh <[email protected]>
---
Documentation/filesystems/vfs.rst | 5 +++++
fs/file.c | 3 +++
include/linux/fs.h | 1 +
3 files changed, 9 insertions(+)
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index ed17771c212b..95b30142c8d9 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -1123,6 +1123,11 @@ otherwise noted.
``fadvise``
possibly called by the fadvise64() system call.
+``fd_install``
+ called by the VFS when a file descriptor is installed in the
+ process's file descriptor table, regardless how the file descriptor
+ was acquired -- be it via the open syscall, received over IPC, etc.
+
Note that the file operations are implemented by the specific
filesystem in which the inode resides. When opening a device node
(character or block special) most filesystems will call special
diff --git a/fs/file.c b/fs/file.c
index abb8b7081d7a..f5db8622b851 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -616,6 +616,9 @@ void __fd_install(struct files_struct *files, unsigned int fd,
void fd_install(unsigned int fd, struct file *file)
{
__fd_install(current->files, fd, file);
+
+ if (file->f_op->fd_install)
+ file->f_op->fd_install(fd, file);
}
EXPORT_SYMBOL(fd_install);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f5abba86107d..b976fbe8c902 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1864,6 +1864,7 @@ struct file_operations {
struct file *file_out, loff_t pos_out,
loff_t len, unsigned int remap_flags);
int (*fadvise)(struct file *, loff_t, loff_t, int);
+ void (*fd_install)(int, struct file *);
} __randomize_layout;
struct inode_operations {
--
2.28.0.163.g6104cc2f0b6-goog
On Mon, Aug 03, 2020 at 02:47:18PM +0000, Kalesh Singh wrote:
> Provides a per process hook for the acquisition of file descriptors,
> despite the method used to obtain the descriptor.
>
> Signed-off-by: Kalesh Singh <[email protected]>
I strongly disagree with this. The file operation has no business
hooking into installing the fd.
On Mon, Aug 03, 2020 at 05:34:29PM +0100, Christoph Hellwig wrote:
> On Mon, Aug 03, 2020 at 02:47:18PM +0000, Kalesh Singh wrote:
> > Provides a per process hook for the acquisition of file descriptors,
> > despite the method used to obtain the descriptor.
> >
> > Signed-off-by: Kalesh Singh <[email protected]>
>
> I strongly disagree with this. The file operation has no business
> hooking into installing the fd.
Hi Christoph. I am exploring the alternative suggested by Matthew in
Patch 2/2. Thanks :)
On Mon, Aug 03, 2020 at 02:47:18PM +0000, Kalesh Singh wrote:
> Provides a per process hook for the acquisition of file descriptors,
> despite the method used to obtain the descriptor.
No, with the side of Fuck, No.
Driver has no possible reason to watch know the descriptors involved.
Moreover, it has no possible way to track that information _and_
no locking that could make that viable.
NAKed with extreme prejudice - never bring that idea back.
On Mon, Aug 3, 2020 at 10:47 AM 'Kalesh Singh' via kernel-team
<[email protected]> wrote:
>
> Provides a per process hook for the acquisition of file descriptors,
> despite the method used to obtain the descriptor.
>
Hi,
So apart from all of the comments received, I think it is hard to
understand what the problem is, what the front-end looks like etc.
Your commit message is 1 line only.
I do remember some of the challenges discussed before, but it would
describe the problem in the commit message in detail and then discuss
why this solution is fit. Please read submitting-patches.rst
especially "2) Describe your changes".
thanks,
- Joel
> Signed-off-by: Kalesh Singh <[email protected]>
> ---
> Documentation/filesystems/vfs.rst | 5 +++++
> fs/file.c | 3 +++
> include/linux/fs.h | 1 +
> 3 files changed, 9 insertions(+)
>
> diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
> index ed17771c212b..95b30142c8d9 100644
> --- a/Documentation/filesystems/vfs.rst
> +++ b/Documentation/filesystems/vfs.rst
> @@ -1123,6 +1123,11 @@ otherwise noted.
> ``fadvise``
> possibly called by the fadvise64() system call.
>
> +``fd_install``
> + called by the VFS when a file descriptor is installed in the
> + process's file descriptor table, regardless how the file descriptor
> + was acquired -- be it via the open syscall, received over IPC, etc.
> +
> Note that the file operations are implemented by the specific
> filesystem in which the inode resides. When opening a device node
> (character or block special) most filesystems will call special
> diff --git a/fs/file.c b/fs/file.c
> index abb8b7081d7a..f5db8622b851 100644
> --- a/fs/file.c
> +++ b/fs/file.c
> @@ -616,6 +616,9 @@ void __fd_install(struct files_struct *files, unsigned int fd,
> void fd_install(unsigned int fd, struct file *file)
> {
> __fd_install(current->files, fd, file);
> +
> + if (file->f_op->fd_install)
> + file->f_op->fd_install(fd, file);
> }
>
> EXPORT_SYMBOL(fd_install);
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index f5abba86107d..b976fbe8c902 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1864,6 +1864,7 @@ struct file_operations {
> struct file *file_out, loff_t pos_out,
> loff_t len, unsigned int remap_flags);
> int (*fadvise)(struct file *, loff_t, loff_t, int);
> + void (*fd_install)(int, struct file *);
> } __randomize_layout;
>
> struct inode_operations {
> --
> 2.28.0.163.g6104cc2f0b6-goog
>
> --
> To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
>
On Mon, Aug 03, 2020 at 08:30:59PM -0400, Joel Fernandes wrote:
> On Mon, Aug 3, 2020 at 10:47 AM 'Kalesh Singh' via kernel-team
> <[email protected]> wrote:
> >
> > Provides a per process hook for the acquisition of file descriptors,
> > despite the method used to obtain the descriptor.
> >
>
> Hi,
> So apart from all of the comments received, I think it is hard to
> understand what the problem is, what the front-end looks like etc.
> Your commit message is 1 line only.
>
> I do remember some of the challenges discussed before, but it would
> describe the problem in the commit message in detail and then discuss
> why this solution is fit. Please read submitting-patches.rst
> especially "2) Describe your changes".
>
> thanks,
>
> - Joel
Thanks for the advice Joel :)
>
>
> > Signed-off-by: Kalesh Singh <[email protected]>
> > ---
> > Documentation/filesystems/vfs.rst | 5 +++++
> > fs/file.c | 3 +++
> > include/linux/fs.h | 1 +
> > 3 files changed, 9 insertions(+)
> >
> > diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
> > index ed17771c212b..95b30142c8d9 100644
> > --- a/Documentation/filesystems/vfs.rst
> > +++ b/Documentation/filesystems/vfs.rst
> > @@ -1123,6 +1123,11 @@ otherwise noted.
> > ``fadvise``
> > possibly called by the fadvise64() system call.
> >
> > +``fd_install``
> > + called by the VFS when a file descriptor is installed in the
> > + process's file descriptor table, regardless how the file descriptor
> > + was acquired -- be it via the open syscall, received over IPC, etc.
> > +
> > Note that the file operations are implemented by the specific
> > filesystem in which the inode resides. When opening a device node
> > (character or block special) most filesystems will call special
> > diff --git a/fs/file.c b/fs/file.c
> > index abb8b7081d7a..f5db8622b851 100644
> > --- a/fs/file.c
> > +++ b/fs/file.c
> > @@ -616,6 +616,9 @@ void __fd_install(struct files_struct *files, unsigned int fd,
> > void fd_install(unsigned int fd, struct file *file)
> > {
> > __fd_install(current->files, fd, file);
> > +
> > + if (file->f_op->fd_install)
> > + file->f_op->fd_install(fd, file);
> > }
> >
> > EXPORT_SYMBOL(fd_install);
> > diff --git a/include/linux/fs.h b/include/linux/fs.h
> > index f5abba86107d..b976fbe8c902 100644
> > --- a/include/linux/fs.h
> > +++ b/include/linux/fs.h
> > @@ -1864,6 +1864,7 @@ struct file_operations {
> > struct file *file_out, loff_t pos_out,
> > loff_t len, unsigned int remap_flags);
> > int (*fadvise)(struct file *, loff_t, loff_t, int);
> > + void (*fd_install)(int, struct file *);
> > } __randomize_layout;
> >
> > struct inode_operations {
> > --
> > 2.28.0.163.g6104cc2f0b6-goog
> >
> > --
> > To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
> >