* -o shadow=<shadowpath> * -o daxdev=<daxdev> Signed-off-by: John Groves <j...@groves.net> --- fs/fuse/fuse_i.h | 8 +++++++- fs/fuse/inode.c | 28 +++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index a592c1002861..f4ee61046578 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -583,9 +583,11 @@ struct fuse_fs_context { unsigned int blksize; const char *subtype; - /* DAX device, may be NULL */ + /* DAX device for virtiofs, may be NULL */ struct dax_device *dax_dev; + const char *shadow; /* famfs - null if not famfs */ + /* fuse_dev pointer to fill in, should contain NULL on entry */ void **fudptr; }; @@ -941,6 +943,10 @@ struct fuse_conn { /** uring connection information*/ struct fuse_ring *ring; #endif + +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + char *shadow; +#endif }; /* diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index e48e11c3f9f3..a7e1cf8257b0 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -766,6 +766,9 @@ enum { OPT_ALLOW_OTHER, OPT_MAX_READ, OPT_BLKSIZE, +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + OPT_SHADOW, +#endif OPT_ERR }; @@ -780,6 +783,9 @@ static const struct fs_parameter_spec fuse_fs_parameters[] = { fsparam_u32 ("max_read", OPT_MAX_READ), fsparam_u32 ("blksize", OPT_BLKSIZE), fsparam_string ("subtype", OPT_SUBTYPE), +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + fsparam_string("shadow", OPT_SHADOW), +#endif {} }; @@ -875,6 +881,15 @@ static int fuse_parse_param(struct fs_context *fsc, struct fs_parameter *param) ctx->blksize = result.uint_32; break; +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + case OPT_SHADOW: + if (ctx->shadow) + return invalfc(fsc, "Multiple shadows specified"); + ctx->shadow = param->string; + param->string = NULL; + break; +#endif + default: return -EINVAL; } @@ -888,6 +903,7 @@ static void fuse_free_fsc(struct fs_context *fsc) if (ctx) { kfree(ctx->subtype); + kfree(ctx->shadow); kfree(ctx); } } @@ -919,7 +935,10 @@ static int fuse_show_options(struct seq_file *m, struct dentry *root) else if (fc->dax_mode == FUSE_DAX_INODE_USER) seq_puts(m, ",dax=inode"); #endif - +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + if (fc->shadow) + seq_printf(m, ",shadow=%s", fc->shadow); +#endif return 0; } @@ -1017,6 +1036,9 @@ void fuse_conn_put(struct fuse_conn *fc) } if (IS_ENABLED(CONFIG_FUSE_PASSTHROUGH)) fuse_backing_files_free(fc); +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + kfree(fc->shadow); +#endif call_rcu(&fc->rcu, delayed_release); } } @@ -1834,6 +1856,10 @@ int fuse_fill_super_common(struct super_block *sb, struct fuse_fs_context *ctx) sb->s_root = root_dentry; if (ctx->fudptr) *ctx->fudptr = fud; + +#if IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) + fc->shadow = kstrdup(ctx->shadow, GFP_KERNEL); +#endif mutex_unlock(&fuse_mutex); return 0; -- 2.49.0