Re: [PATCH v2 10/11] fhandle, pidfs: support open_by_handle_at() purely based on file handle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 24, 2025 at 11:30:42AM +0200, Jan Kara wrote:
> On Tue 24-06-25 10:29:13, Christian Brauner wrote:
> > Various filesystems such as pidfs (and likely drm in the future) have a
> > use-case to support opening files purely based on the handle without
> > having to require a file descriptor to another object. That's especially
> > the case for filesystems that don't do any lookup whatsoever and there's
> > zero relationship between the objects. Such filesystems are also
> > singletons that stay around for the lifetime of the system meaning that
> > they can be uniquely identified and accessed purely based on the file
> > handle type. Enable that so that userspace doesn't have to allocate an
> > object needlessly especially if they can't do that for whatever reason.
> > 
> > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
> > ---
> >  fs/fhandle.c | 22 ++++++++++++++++++++--
> >  fs/pidfs.c   |  5 ++++-
> >  2 files changed, 24 insertions(+), 3 deletions(-)
> > 
> > diff --git a/fs/fhandle.c b/fs/fhandle.c
> > index ab4891925b52..54081e19f594 100644
> > --- a/fs/fhandle.c
> > +++ b/fs/fhandle.c
> > @@ -173,7 +173,7 @@ SYSCALL_DEFINE5(name_to_handle_at, int, dfd, const char __user *, name,
> >  	return err;
> >  }
> >  
> > -static int get_path_anchor(int fd, struct path *root)
> > +static int get_path_anchor(int fd, struct path *root, int handle_type)
> >  {
> >  	if (fd >= 0) {
> >  		CLASS(fd, f)(fd);
> > @@ -193,6 +193,24 @@ static int get_path_anchor(int fd, struct path *root)
> >  		return 0;
> >  	}
> >  
> > +	/*
> > +	 * Only autonomous handles can be decoded without a file
> > +	 * descriptor.
> > +	 */
> > +	if (!(handle_type & FILEID_IS_AUTONOMOUS))
> > +		return -EOPNOTSUPP;
> 
> This somewhat ties to my comment to patch 5 that if someone passed invalid
> fd < 0 before, we'd be returning -EBADF and now we'd be returning -EINVAL
> or -EOPNOTSUPP based on FILEID_IS_AUTONOMOUS setting. I don't care that
> much about it so feel free to ignore me but I think the following might be
> more sensible error codes:
> 
> 	if (!(handle_type & FILEID_IS_AUTONOMOUS)) {
> 		if (fd == FD_INVALID)
> 			return -EOPNOTSUPP;
> 		return -EBADF;
> 	}

Yes, that makes sense. I'll take the suggestion.

> 
> 	if (fd != FD_INVALID)
> 		return -EBADF; (or -EINVAL no strong preference here)
> 
> Since I don't care that much feel free to add:
> 
> Reviewed-by: Jan Kara <jack@xxxxxxx>
> 
> 								Honza
> 
> > +
> > +	if (fd != FD_INVALID)
> > +		return -EINVAL;
> > +
> > +	switch (handle_type & ~FILEID_USER_FLAGS_MASK) {
> > +	case FILEID_PIDFS:
> > +		pidfs_get_root(root);
> > +		break;
> > +	default:
> > +		return -EINVAL;
> > +	}
> > +
> >  	return 0;
> >  }
> >  
> > @@ -347,7 +365,7 @@ static int handle_to_path(int mountdirfd, struct file_handle __user *ufh,
> >  	    FILEID_USER_FLAGS(f_handle.handle_type) & ~FILEID_VALID_USER_FLAGS)
> >  		return -EINVAL;
> >  
> > -	retval = get_path_anchor(mountdirfd, &ctx.root);
> > +	retval = get_path_anchor(mountdirfd, &ctx.root, f_handle.handle_type);
> >  	if (retval)
> >  		return retval;
> >  
> > diff --git a/fs/pidfs.c b/fs/pidfs.c
> > index 69b0541042b5..2ab9b47fbfae 100644
> > --- a/fs/pidfs.c
> > +++ b/fs/pidfs.c
> > @@ -747,7 +747,7 @@ static int pidfs_encode_fh(struct inode *inode, u32 *fh, int *max_len,
> >  
> >  	*max_len = 2;
> >  	*(u64 *)fh = pid->ino;
> > -	return FILEID_KERNFS;
> > +	return FILEID_PIDFS;
> >  }
> >  
> >  static int pidfs_ino_find(const void *key, const struct rb_node *node)
> > @@ -802,6 +802,8 @@ static struct dentry *pidfs_fh_to_dentry(struct super_block *sb,
> >  		return NULL;
> >  
> >  	switch (fh_type) {
> > +	case FILEID_PIDFS:
> > +		fallthrough;
> >  	case FILEID_KERNFS:
> >  		pid_ino = *(u64 *)fid;
> >  		break;
> > @@ -860,6 +862,7 @@ static const struct export_operations pidfs_export_operations = {
> >  	.fh_to_dentry	= pidfs_fh_to_dentry,
> >  	.open		= pidfs_export_open,
> >  	.permission	= pidfs_export_permission,
> > +	.flags		= EXPORT_OP_AUTONOMOUS_HANDLES,
> >  };
> >  
> >  static int pidfs_init_inode(struct inode *inode, void *data)
> > 
> > -- 
> > 2.47.2
> > 
> -- 
> Jan Kara <jack@xxxxxxxx>
> SUSE Labs, CR




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux