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 <[email protected]>
Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
Fixes: dfaf653dc415 ("exportfs: make ->encode_fh() a mandatory method for NFS export")
Suggested-by: Arnd Bergmann <[email protected]>
Signed-off-by: Amir Goldstein <[email protected]>
---
Christian,
Soaking f_fsid in linux-next started to bring goodies.
Please feel free to apply the fix as is or squash it.
Thanks,
Amir.
fs/exportfs/expfs.c | 41 ----------------------------------------
fs/libfs.c | 41 ++++++++++++++++++++++++++++++++++++++++
include/linux/exportfs.h | 9 ++-------
3 files changed, 43 insertions(+), 48 deletions(-)
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
index 7d9fdcc187b7..3ae0154c5680 100644
--- a/fs/exportfs/expfs.c
+++ b/fs/exportfs/expfs.c
@@ -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
/**
diff --git a/fs/libfs.c b/fs/libfs.c
index 8117b24b929d..38950cce135b 100644
--- a/fs/libfs.c
+++ b/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
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h
index 21bae8bfeef1..e0e69dafaa43 100644
--- a/include/linux/exportfs.h
+++ b/include/linux/exportfs.h
@@ -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));
--
2.34.1
On Thu, Oct 26, 2023, at 22:45, Amir Goldstein wrote:
> 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 <[email protected]>
> Closes:
> https://lore.kernel.org/oe-kbuild-all/[email protected]/
> Fixes: dfaf653dc415 ("exportfs: make ->encode_fh() a mandatory method
> for NFS export")
> Suggested-by: Arnd Bergmann <[email protected]>
> Signed-off-by: Amir Goldstein <[email protected]>
> ---
>
> Christian,
>
> Soaking f_fsid in linux-next started to bring goodies.
> Please feel free to apply the fix as is or squash it.
I just confirmed that this fixes all the build regressions I
see with your series, as expected, thanks for the fix
Tested-by: Arnd Bergmann <[email protected]>
On Thu, 26 Oct 2023 23:45:40 +0300, Amir Goldstein wrote:
> 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.
>
>
> [...]
Applied to the vfs.f_fsid branch of the vfs/vfs.git tree.
Patches in the vfs.f_fsid branch should appear in linux-next soon.
Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.
It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.
Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs.f_fsid
[1/1] fs: fix build error with CONFIG_EXPORTFS=m or not defined
https://git.kernel.org/vfs/vfs/c/45ac7f1910db