mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
fs: fix build error with CONFIG_EXPORTFS=m or not defined
Many of the filesystems that call the generic exportfs helpers do not select the EXPORTFS config. Move generic_encode_ino32_fh() to libfs.c, same as generic_fh_to_*() to avoid having to fix all those config dependencies. Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202310262151.renqMvme-lkp@intel.com/ Fixes: dfaf653dc415 ("exportfs: make ->encode_fh() a mandatory method for NFS export") Suggested-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Amir Goldstein <amir73il@gmail.com> Link: https://lore.kernel.org/r/20231026204540.143217-1-amir73il@gmail.com Tested-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
ceb3388043
commit
d9e5d9221d
@ -342,47 +342,6 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* generic_encode_ino32_fh - generic export_operations->encode_fh function
|
||||
* @inode: the object to encode
|
||||
* @fh: where to store the file handle fragment
|
||||
* @max_len: maximum length to store there (in 4 byte units)
|
||||
* @parent: parent directory inode, if wanted
|
||||
*
|
||||
* This generic encode_fh function assumes that the 32 inode number
|
||||
* is suitable for locating an inode, and that the generation number
|
||||
* can be used to check that it is still valid. It places them in the
|
||||
* filehandle fragment where export_decode_fh expects to find them.
|
||||
*/
|
||||
int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len,
|
||||
struct inode *parent)
|
||||
{
|
||||
struct fid *fid = (void *)fh;
|
||||
int len = *max_len;
|
||||
int type = FILEID_INO32_GEN;
|
||||
|
||||
if (parent && (len < 4)) {
|
||||
*max_len = 4;
|
||||
return FILEID_INVALID;
|
||||
} else if (len < 2) {
|
||||
*max_len = 2;
|
||||
return FILEID_INVALID;
|
||||
}
|
||||
|
||||
len = 2;
|
||||
fid->i32.ino = inode->i_ino;
|
||||
fid->i32.gen = inode->i_generation;
|
||||
if (parent) {
|
||||
fid->i32.parent_ino = parent->i_ino;
|
||||
fid->i32.parent_gen = parent->i_generation;
|
||||
len = 4;
|
||||
type = FILEID_INO32_GEN_PARENT;
|
||||
}
|
||||
*max_len = len;
|
||||
return type;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(generic_encode_ino32_fh);
|
||||
|
||||
#define FILEID_INO64_GEN_LEN 3
|
||||
|
||||
/**
|
||||
|
41
fs/libfs.c
41
fs/libfs.c
@ -1310,6 +1310,47 @@ ssize_t simple_attr_write_signed(struct file *file, const char __user *buf,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_attr_write_signed);
|
||||
|
||||
/**
|
||||
* generic_encode_ino32_fh - generic export_operations->encode_fh function
|
||||
* @inode: the object to encode
|
||||
* @fh: where to store the file handle fragment
|
||||
* @max_len: maximum length to store there (in 4 byte units)
|
||||
* @parent: parent directory inode, if wanted
|
||||
*
|
||||
* This generic encode_fh function assumes that the 32 inode number
|
||||
* is suitable for locating an inode, and that the generation number
|
||||
* can be used to check that it is still valid. It places them in the
|
||||
* filehandle fragment where export_decode_fh expects to find them.
|
||||
*/
|
||||
int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len,
|
||||
struct inode *parent)
|
||||
{
|
||||
struct fid *fid = (void *)fh;
|
||||
int len = *max_len;
|
||||
int type = FILEID_INO32_GEN;
|
||||
|
||||
if (parent && (len < 4)) {
|
||||
*max_len = 4;
|
||||
return FILEID_INVALID;
|
||||
} else if (len < 2) {
|
||||
*max_len = 2;
|
||||
return FILEID_INVALID;
|
||||
}
|
||||
|
||||
len = 2;
|
||||
fid->i32.ino = inode->i_ino;
|
||||
fid->i32.gen = inode->i_generation;
|
||||
if (parent) {
|
||||
fid->i32.parent_ino = parent->i_ino;
|
||||
fid->i32.parent_gen = parent->i_generation;
|
||||
len = 4;
|
||||
type = FILEID_INO32_GEN_PARENT;
|
||||
}
|
||||
*max_len = len;
|
||||
return type;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(generic_encode_ino32_fh);
|
||||
|
||||
/**
|
||||
* generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
|
||||
* @sb: filesystem to do the file handle conversion on
|
||||
|
@ -294,17 +294,12 @@ extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
|
||||
/*
|
||||
* Generic helpers for filesystems.
|
||||
*/
|
||||
#ifdef CONFIG_EXPORTFS
|
||||
int generic_encode_ino32_fh(struct inode *inode, __u32 *fh, int *max_len,
|
||||
struct inode *parent);
|
||||
#else
|
||||
#define generic_encode_ino32_fh NULL
|
||||
#endif
|
||||
|
||||
extern struct dentry *generic_fh_to_dentry(struct super_block *sb,
|
||||
struct dentry *generic_fh_to_dentry(struct super_block *sb,
|
||||
struct fid *fid, int fh_len, int fh_type,
|
||||
struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
|
||||
extern struct dentry *generic_fh_to_parent(struct super_block *sb,
|
||||
struct dentry *generic_fh_to_parent(struct super_block *sb,
|
||||
struct fid *fid, int fh_len, int fh_type,
|
||||
struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user