Skip to content

Commit

Permalink
exportfs: change connectable argument to bit flags
Browse files Browse the repository at this point in the history
Convert the bool connectable arguemnt into a bit flags argument and
define the EXPORT_FS_CONNECTABLE flag as a requested property of the
file handle.

We are going to add a flag for requesting non-decodeable file handles.

Acked-by: Jeff Layton <jlayton@kernel.org>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Message-Id: <20230502124817.3070545-2-amir73il@gmail.com>
  • Loading branch information
Amir Goldstein authored and Jan Kara committed May 22, 2023
1 parent f1fcbaa commit b528782
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
13 changes: 11 additions & 2 deletions fs/exportfs/expfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,14 +393,23 @@ int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
}
EXPORT_SYMBOL_GPL(exportfs_encode_inode_fh);

/**
* exportfs_encode_fh - encode a file handle from dentry
* @dentry: the object to encode
* @fid: where to store the file handle fragment
* @max_len: maximum length to store there
* @flags: properties of the requested file handle
*
* Returns an enum fid_type or a negative errno.
*/
int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, int *max_len,
int connectable)
int flags)
{
int error;
struct dentry *p = NULL;
struct inode *inode = dentry->d_inode, *parent = NULL;

if (connectable && !S_ISDIR(inode->i_mode)) {
if ((flags & EXPORT_FH_CONNECTABLE) && !S_ISDIR(inode->i_mode)) {
p = dget_parent(dentry);
/*
* note that while p might've ceased to be our parent already,
Expand Down
5 changes: 3 additions & 2 deletions fs/nfsd/nfsfh.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,10 +414,11 @@ static void _fh_update(struct svc_fh *fhp, struct svc_export *exp,
struct fid *fid = (struct fid *)
(fhp->fh_handle.fh_fsid + fhp->fh_handle.fh_size/4 - 1);
int maxsize = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4;
int subtreecheck = !(exp->ex_flags & NFSEXP_NOSUBTREECHECK);
int fh_flags = (exp->ex_flags & NFSEXP_NOSUBTREECHECK) ? 0 :
EXPORT_FH_CONNECTABLE;

fhp->fh_handle.fh_fileid_type =
exportfs_encode_fh(dentry, fid, &maxsize, subtreecheck);
exportfs_encode_fh(dentry, fid, &maxsize, fh_flags);
fhp->fh_handle.fh_size += maxsize * 4;
} else {
fhp->fh_handle.fh_fileid_type = FILEID_ROOT;
Expand Down
6 changes: 4 additions & 2 deletions include/linux/exportfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ struct fid {
};
};

#define EXPORT_FH_CONNECTABLE 0x1 /* Encode file handle with parent */

/**
* struct export_operations - for nfsd to communicate with file systems
* @encode_fh: encode a file handle fragment from a dentry
Expand All @@ -150,7 +152,7 @@ struct fid {
* encode_fh:
* @encode_fh should store in the file handle fragment @fh (using at most
* @max_len bytes) information that can be used by @decode_fh to recover the
* file referred to by the &struct dentry @de. If the @connectable flag is
* file referred to by the &struct dentry @de. If @flag has CONNECTABLE bit
* set, the encode_fh() should store sufficient information so that a good
* attempt can be made to find not only the file but also it's place in the
* filesystem. This typically means storing a reference to de->d_parent in
Expand Down Expand Up @@ -227,7 +229,7 @@ struct export_operations {
extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
int *max_len, struct inode *parent);
extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid,
int *max_len, int connectable);
int *max_len, int flags);
extern struct dentry *exportfs_decode_fh_raw(struct vfsmount *mnt,
struct fid *fid, int fh_len,
int fileid_type,
Expand Down

0 comments on commit b528782

Please sign in to comment.