* [PATCH] erofs: make filesystem exportable
@ 2022-04-24 13:01 Hongnan Li
2022-04-24 14:30 ` kernel test robot
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Hongnan Li @ 2022-04-24 13:01 UTC (permalink / raw)
To: linux-erofs, xiang, chao; +Cc: linux-kernel
Implement export operations in order to make EROFS support accessing
inodes with filehandles so that it can be exported via NFS and used
by overlayfs.
Without this patch, 'exportfs -rv' will report:
exportfs: /root/erofs_mp does not support NFS export
Also tested with unionmount-testsuite and the testcase below passes now:
./run --ov --erofs --verify hard-link
For more details about the testcase, see:
https://github.com/amir73il/unionmount-testsuite/pull/6
Signed-off-by: Hongnan Li <hongnan.li@linux.alibaba.com>
---
fs/erofs/internal.h | 2 +-
fs/erofs/namei.c | 5 ++---
fs/erofs/super.c | 40 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index 5298c4ee277d..12c65f647324 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -509,7 +509,7 @@ int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path,
/* namei.c */
extern const struct inode_operations erofs_dir_iops;
-int erofs_namei(struct inode *dir, struct qstr *name,
+int erofs_namei(struct inode *dir, const struct qstr *name,
erofs_nid_t *nid, unsigned int *d_type);
/* dir.c */
diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
index 554efa363317..fd75506799c4 100644
--- a/fs/erofs/namei.c
+++ b/fs/erofs/namei.c
@@ -165,9 +165,8 @@ static void *find_target_block_classic(struct erofs_buf *target,
return candidate;
}
-int erofs_namei(struct inode *dir,
- struct qstr *name,
- erofs_nid_t *nid, unsigned int *d_type)
+int erofs_namei(struct inode *dir, const struct qstr *name, erofs_nid_t *nid,
+ unsigned int *d_type)
{
int ndirents;
struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index 0c4b41130c2f..17ad271677b6 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -13,6 +13,7 @@
#include <linux/fs_context.h>
#include <linux/fs_parser.h>
#include <linux/dax.h>
+#include <linux/exportfs.h>
#include "xattr.h"
#define CREATE_TRACE_POINTS
@@ -577,6 +578,44 @@ static int erofs_init_managed_cache(struct super_block *sb)
static int erofs_init_managed_cache(struct super_block *sb) { return 0; }
#endif
+static struct inode *erofs_nfs_get_inode(struct super_block *sb,
+ u64 ino, u32 generation)
+{
+ return erofs_iget(sb, ino, false);
+}
+
+static struct dentry *erofs_fh_to_dentry(struct super_block *sb, struct fid *fid,
+ int fh_len, int fh_type)
+{
+ return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
+ erofs_nfs_get_inode);
+}
+
+static struct dentry *erofs_fh_to_parent(struct super_block *sb, struct fid *fid,
+ int fh_len, int fh_type)
+{
+ return generic_fh_to_parent(sb, fid, fh_len, fh_type,
+ erofs_nfs_get_inode);
+}
+
+struct dentry *erofs_get_parent(struct dentry *child)
+{
+ erofs_nid_t nid;
+ unsigned int d_type;
+ int err;
+
+ err = erofs_namei(d_inode(child), &dotdot_name, &nid, &d_type);
+ if (err)
+ return ERR_PTR(err);
+ return d_obtain_alias(erofs_iget(child->d_sb, nid, d_type == FT_DIR));
+}
+
+static const struct export_operations erofs_export_ops = {
+ .fh_to_dentry = erofs_fh_to_dentry,
+ .fh_to_parent = erofs_fh_to_parent,
+ .get_parent = erofs_get_parent,
+};
+
static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
{
struct inode *inode;
@@ -618,6 +657,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_time_gran = 1;
sb->s_op = &erofs_sops;
+ sb->s_export_op = &erofs_export_ops;
sb->s_xattr = erofs_xattr_handlers;
if (test_opt(&sbi->opt, POSIX_ACL))
--
2.19.1.6.gb485710b
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] erofs: make filesystem exportable
2022-04-24 13:01 [PATCH] erofs: make filesystem exportable Hongnan Li
@ 2022-04-24 14:30 ` kernel test robot
2022-04-24 14:40 ` kernel test robot
2022-04-25 4:07 ` [PATCH v2 resend] " Hongnan Li
2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-04-24 14:30 UTC (permalink / raw)
To: Hongnan Li, linux-erofs, xiang, chao; +Cc: llvm, kbuild-all, linux-kernel
Hi Hongnan,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on xiang-erofs/dev-test]
[also build test WARNING on v5.18-rc3 next-20220422]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Hongnan-Li/erofs-make-filesystem-exportable/20220424-211653
base: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git dev-test
config: hexagon-buildonly-randconfig-r005-20220424 (https://download.01.org/0day-ci/archive/20220424/202204242236.0aTl5THK-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 1cddcfdc3c683b393df1a5c9063252eb60e52818)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/c0fc15c5ccc4a5090cc32744ba63bde8ea558ac7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Hongnan-Li/erofs-make-filesystem-exportable/20220424-211653
git checkout c0fc15c5ccc4a5090cc32744ba63bde8ea558ac7
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash fs/erofs/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> fs/erofs/super.c:601:16: warning: no previous prototype for function 'erofs_get_parent' [-Wmissing-prototypes]
struct dentry *erofs_get_parent(struct dentry *child)
^
fs/erofs/super.c:601:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
struct dentry *erofs_get_parent(struct dentry *child)
^
static
1 warning generated.
vim +/erofs_get_parent +601 fs/erofs/super.c
600
> 601 struct dentry *erofs_get_parent(struct dentry *child)
602 {
603 erofs_nid_t nid;
604 unsigned int d_type;
605 int err;
606
607 err = erofs_namei(d_inode(child), &dotdot_name, &nid, &d_type);
608 if (err)
609 return ERR_PTR(err);
610 return d_obtain_alias(erofs_iget(child->d_sb, nid, d_type == FT_DIR));
611 }
612
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] erofs: make filesystem exportable
2022-04-24 13:01 [PATCH] erofs: make filesystem exportable Hongnan Li
2022-04-24 14:30 ` kernel test robot
@ 2022-04-24 14:40 ` kernel test robot
2022-04-25 4:07 ` [PATCH v2 resend] " Hongnan Li
2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-04-24 14:40 UTC (permalink / raw)
To: Hongnan Li, linux-erofs, xiang, chao; +Cc: kbuild-all, linux-kernel
Hi Hongnan,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on xiang-erofs/dev-test]
[also build test WARNING on v5.18-rc3 next-20220422]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Hongnan-Li/erofs-make-filesystem-exportable/20220424-211653
base: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git dev-test
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20220424/202204242223.Hf6HESVt-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/c0fc15c5ccc4a5090cc32744ba63bde8ea558ac7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Hongnan-Li/erofs-make-filesystem-exportable/20220424-211653
git checkout c0fc15c5ccc4a5090cc32744ba63bde8ea558ac7
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash fs/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> fs/erofs/super.c:601:16: warning: no previous prototype for 'erofs_get_parent' [-Wmissing-prototypes]
601 | struct dentry *erofs_get_parent(struct dentry *child)
| ^~~~~~~~~~~~~~~~
vim +/erofs_get_parent +601 fs/erofs/super.c
600
> 601 struct dentry *erofs_get_parent(struct dentry *child)
602 {
603 erofs_nid_t nid;
604 unsigned int d_type;
605 int err;
606
607 err = erofs_namei(d_inode(child), &dotdot_name, &nid, &d_type);
608 if (err)
609 return ERR_PTR(err);
610 return d_obtain_alias(erofs_iget(child->d_sb, nid, d_type == FT_DIR));
611 }
612
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 resend] erofs: make filesystem exportable
2022-04-24 13:01 [PATCH] erofs: make filesystem exportable Hongnan Li
2022-04-24 14:30 ` kernel test robot
2022-04-24 14:40 ` kernel test robot
@ 2022-04-25 4:07 ` Hongnan Li
2022-04-26 4:45 ` Gao Xiang
2022-05-17 15:43 ` Chao Yu
2 siblings, 2 replies; 6+ messages in thread
From: Hongnan Li @ 2022-04-25 4:07 UTC (permalink / raw)
To: linux-erofs, xiang, chao; +Cc: linux-kernel
Implement export operations in order to make EROFS support accessing
inodes with filehandles so that it can be exported via NFS and used
by overlayfs.
Without this patch, 'exportfs -rv' will report:
exportfs: /root/erofs_mp does not support NFS export
Also tested with unionmount-testsuite and the testcase below passes now:
./run --ov --erofs --verify hard-link
For more details about the testcase, see:
https://github.com/amir73il/unionmount-testsuite/pull/6
Signed-off-by: Hongnan Li <hongnan.li@linux.alibaba.com>
---
fs/erofs/internal.h | 2 +-
fs/erofs/namei.c | 5 ++---
fs/erofs/super.c | 40 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index 5298c4ee277d..12c65f647324 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -509,7 +509,7 @@ int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path,
/* namei.c */
extern const struct inode_operations erofs_dir_iops;
-int erofs_namei(struct inode *dir, struct qstr *name,
+int erofs_namei(struct inode *dir, const struct qstr *name,
erofs_nid_t *nid, unsigned int *d_type);
/* dir.c */
diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
index 554efa363317..fd75506799c4 100644
--- a/fs/erofs/namei.c
+++ b/fs/erofs/namei.c
@@ -165,9 +165,8 @@ static void *find_target_block_classic(struct erofs_buf *target,
return candidate;
}
-int erofs_namei(struct inode *dir,
- struct qstr *name,
- erofs_nid_t *nid, unsigned int *d_type)
+int erofs_namei(struct inode *dir, const struct qstr *name, erofs_nid_t *nid,
+ unsigned int *d_type)
{
int ndirents;
struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index 0c4b41130c2f..1c77b7acabd0 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -13,6 +13,7 @@
#include <linux/fs_context.h>
#include <linux/fs_parser.h>
#include <linux/dax.h>
+#include <linux/exportfs.h>
#include "xattr.h"
#define CREATE_TRACE_POINTS
@@ -577,6 +578,44 @@ static int erofs_init_managed_cache(struct super_block *sb)
static int erofs_init_managed_cache(struct super_block *sb) { return 0; }
#endif
+static struct inode *erofs_nfs_get_inode(struct super_block *sb,
+ u64 ino, u32 generation)
+{
+ return erofs_iget(sb, ino, false);
+}
+
+static struct dentry *erofs_fh_to_dentry(struct super_block *sb, struct fid *fid,
+ int fh_len, int fh_type)
+{
+ return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
+ erofs_nfs_get_inode);
+}
+
+static struct dentry *erofs_fh_to_parent(struct super_block *sb, struct fid *fid,
+ int fh_len, int fh_type)
+{
+ return generic_fh_to_parent(sb, fid, fh_len, fh_type,
+ erofs_nfs_get_inode);
+}
+
+static struct dentry *erofs_get_parent(struct dentry *child)
+{
+ erofs_nid_t nid;
+ unsigned int d_type;
+ int err;
+
+ err = erofs_namei(d_inode(child), &dotdot_name, &nid, &d_type);
+ if (err)
+ return ERR_PTR(err);
+ return d_obtain_alias(erofs_iget(child->d_sb, nid, d_type == FT_DIR));
+}
+
+static const struct export_operations erofs_export_ops = {
+ .fh_to_dentry = erofs_fh_to_dentry,
+ .fh_to_parent = erofs_fh_to_parent,
+ .get_parent = erofs_get_parent,
+};
+
static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
{
struct inode *inode;
@@ -618,6 +657,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_time_gran = 1;
sb->s_op = &erofs_sops;
+ sb->s_export_op = &erofs_export_ops;
sb->s_xattr = erofs_xattr_handlers;
if (test_opt(&sbi->opt, POSIX_ACL))
--
2.19.1.6.gb485710b
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 resend] erofs: make filesystem exportable
2022-04-25 4:07 ` [PATCH v2 resend] " Hongnan Li
@ 2022-04-26 4:45 ` Gao Xiang
2022-05-17 15:43 ` Chao Yu
1 sibling, 0 replies; 6+ messages in thread
From: Gao Xiang @ 2022-04-26 4:45 UTC (permalink / raw)
To: Hongnan Li; +Cc: linux-erofs, xiang, chao, linux-kernel
On Mon, Apr 25, 2022 at 12:07:12PM +0800, Hongnan Li wrote:
> Implement export operations in order to make EROFS support accessing
> inodes with filehandles so that it can be exported via NFS and used
> by overlayfs.
>
> Without this patch, 'exportfs -rv' will report:
> exportfs: /root/erofs_mp does not support NFS export
>
> Also tested with unionmount-testsuite and the testcase below passes now:
> ./run --ov --erofs --verify hard-link
>
> For more details about the testcase, see:
> https://github.com/amir73il/unionmount-testsuite/pull/6
>
> Signed-off-by: Hongnan Li <hongnan.li@linux.alibaba.com>
> ---
> fs/erofs/internal.h | 2 +-
> fs/erofs/namei.c | 5 ++---
> fs/erofs/super.c | 40 ++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 43 insertions(+), 4 deletions(-)
>
> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
> index 5298c4ee277d..12c65f647324 100644
> --- a/fs/erofs/internal.h
> +++ b/fs/erofs/internal.h
> @@ -509,7 +509,7 @@ int erofs_getattr(struct user_namespace *mnt_userns, const struct path *path,
> /* namei.c */
> extern const struct inode_operations erofs_dir_iops;
>
> -int erofs_namei(struct inode *dir, struct qstr *name,
> +int erofs_namei(struct inode *dir, const struct qstr *name,
> erofs_nid_t *nid, unsigned int *d_type);
>
> /* dir.c */
> diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
> index 554efa363317..fd75506799c4 100644
> --- a/fs/erofs/namei.c
> +++ b/fs/erofs/namei.c
> @@ -165,9 +165,8 @@ static void *find_target_block_classic(struct erofs_buf *target,
> return candidate;
> }
>
> -int erofs_namei(struct inode *dir,
> - struct qstr *name,
> - erofs_nid_t *nid, unsigned int *d_type)
> +int erofs_namei(struct inode *dir, const struct qstr *name, erofs_nid_t *nid,
> + unsigned int *d_type)
> {
> int ndirents;
> struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
> index 0c4b41130c2f..1c77b7acabd0 100644
> --- a/fs/erofs/super.c
> +++ b/fs/erofs/super.c
> @@ -13,6 +13,7 @@
> #include <linux/fs_context.h>
> #include <linux/fs_parser.h>
> #include <linux/dax.h>
> +#include <linux/exportfs.h>
> #include "xattr.h"
>
> #define CREATE_TRACE_POINTS
> @@ -577,6 +578,44 @@ static int erofs_init_managed_cache(struct super_block *sb)
> static int erofs_init_managed_cache(struct super_block *sb) { return 0; }
> #endif
>
> +static struct inode *erofs_nfs_get_inode(struct super_block *sb,
> + u64 ino, u32 generation)
> +{
> + return erofs_iget(sb, ino, false);
> +}
> +
> +static struct dentry *erofs_fh_to_dentry(struct super_block *sb, struct fid *fid,
> + int fh_len, int fh_type)
> +{
> + return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
> + erofs_nfs_get_inode);
> +}
> +
> +static struct dentry *erofs_fh_to_parent(struct super_block *sb, struct fid *fid,
> + int fh_len, int fh_type)
> +{
> + return generic_fh_to_parent(sb, fid, fh_len, fh_type,
> + erofs_nfs_get_inode);
> +}
> +
> +static struct dentry *erofs_get_parent(struct dentry *child)
> +{
> + erofs_nid_t nid;
> + unsigned int d_type;
> + int err;
> +
> + err = erofs_namei(d_inode(child), &dotdot_name, &nid, &d_type);
> + if (err)
> + return ERR_PTR(err);
> + return d_obtain_alias(erofs_iget(child->d_sb, nid, d_type == FT_DIR));
> +}
> +
> +static const struct export_operations erofs_export_ops = {
> + .fh_to_dentry = erofs_fh_to_dentry,
> + .fh_to_parent = erofs_fh_to_parent,
> + .get_parent = erofs_get_parent,
> +};
> +
> static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
> {
> struct inode *inode;
> @@ -618,6 +657,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
> sb->s_time_gran = 1;
>
> sb->s_op = &erofs_sops;
> + sb->s_export_op = &erofs_export_ops;
I might need to rearrange this part later since it has a slight conflict
with the fscache patchset. Otherwise looks good to me,
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Thanks,
Gao Xiang
> sb->s_xattr = erofs_xattr_handlers;
>
> if (test_opt(&sbi->opt, POSIX_ACL))
> --
> 2.19.1.6.gb485710b
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 resend] erofs: make filesystem exportable
2022-04-25 4:07 ` [PATCH v2 resend] " Hongnan Li
2022-04-26 4:45 ` Gao Xiang
@ 2022-05-17 15:43 ` Chao Yu
1 sibling, 0 replies; 6+ messages in thread
From: Chao Yu @ 2022-05-17 15:43 UTC (permalink / raw)
To: Hongnan Li, linux-erofs, xiang; +Cc: linux-kernel
On 2022/4/25 12:07, Hongnan Li wrote:
> Implement export operations in order to make EROFS support accessing
> inodes with filehandles so that it can be exported via NFS and used
> by overlayfs.
>
> Without this patch, 'exportfs -rv' will report:
> exportfs: /root/erofs_mp does not support NFS export
>
> Also tested with unionmount-testsuite and the testcase below passes now:
> ./run --ov --erofs --verify hard-link
>
> For more details about the testcase, see:
> https://github.com/amir73il/unionmount-testsuite/pull/6
>
> Signed-off-by: Hongnan Li <hongnan.li@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Thanks,
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-05-17 15:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-24 13:01 [PATCH] erofs: make filesystem exportable Hongnan Li
2022-04-24 14:30 ` kernel test robot
2022-04-24 14:40 ` kernel test robot
2022-04-25 4:07 ` [PATCH v2 resend] " Hongnan Li
2022-04-26 4:45 ` Gao Xiang
2022-05-17 15:43 ` Chao Yu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox