This patch implements the interfaces for initialize/finalize kio stat subsystem and adds the creation of stat directory. The sysfs directory will be created separately for each point.
Signed-off-by: Pavel Butsykin <pbutsy...@virtuozzo.com> --- fs/fuse/Makefile | 3 +- fs/fuse/control.c | 3 +- fs/fuse/inode.c | 1 + fs/fuse/kio/pcs/fuse_stat.c | 83 ++++++++++++++++++++++++++++++++++++++ fs/fuse/kio/pcs/fuse_stat.h | 11 +++++ fs/fuse/kio/pcs/pcs_cluster_core.c | 3 ++ fs/fuse/kio/pcs/pcs_req.h | 2 + 7 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 fs/fuse/kio/pcs/fuse_stat.c create mode 100644 fs/fuse/kio/pcs/fuse_stat.h diff --git a/fs/fuse/Makefile b/fs/fuse/Makefile index 3eb06648da2c..87f655c596e6 100644 --- a/fs/fuse/Makefile +++ b/fs/fuse/Makefile @@ -24,6 +24,7 @@ fuse_kio_pcs-objs := kio/pcs/pcs_fuse_kdirect.o \ kio/pcs/pcs_cluster.o \ kio/pcs/pcs_cluster_core.o \ kio/pcs/pcs_cs.o \ - kio/pcs/fuse_io.o + kio/pcs/fuse_io.o \ + kio/pcs/fuse_stat.o fuse-objs := dev.o dir.o file.o inode.o control.o diff --git a/fs/fuse/control.c b/fs/fuse/control.c index 5ea8ab2165cf..e9734d597419 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c @@ -18,7 +18,8 @@ * This is non-NULL when the single instance of the control filesystem * exists. Protected by fuse_mutex */ -static struct super_block *fuse_control_sb; +struct super_block *fuse_control_sb; +EXPORT_SYMBOL_GPL(fuse_control_sb); static struct fuse_conn *fuse_ctl_file_conn_get(struct file *file) { diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 25f6e0ceac37..ff3fbc0a779b 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -31,6 +31,7 @@ static struct kmem_cache *fuse_inode_cachep; static LIST_HEAD(fuse_kios_list); struct list_head fuse_conn_list; DEFINE_MUTEX(fuse_mutex); +EXPORT_SYMBOL_GPL(fuse_mutex); static int fuse_ve_odirect; diff --git a/fs/fuse/kio/pcs/fuse_stat.c b/fs/fuse/kio/pcs/fuse_stat.c new file mode 100644 index 000000000000..da8428ebe600 --- /dev/null +++ b/fs/fuse/kio/pcs/fuse_stat.c @@ -0,0 +1,83 @@ +#include <net/sock.h> +#include <linux/types.h> + +#include "fuse_stat.h" +#include "pcs_cluster.h" + +extern struct super_block *fuse_control_sb; + +static struct dentry *fuse_kio_add_dentry(struct dentry *parent, + struct fuse_conn *fc, + const char *name, + int mode, int nlink, + const struct inode_operations *iop, + const struct file_operations *fop, + void *ctx) +{ + struct inode *inode; + struct dentry *dentry = d_alloc_name(parent, name); + + if (!dentry) + return NULL; + + inode = new_inode(fc->sb); + if (!inode) { + dput(dentry); + return NULL; + } + + inode->i_ino = get_next_ino(); + inode->i_mode = mode; + inode->i_uid = fc->user_id; + inode->i_gid = fc->group_id; + inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; + if (iop) + inode->i_op = iop; + inode->i_fop = fop; + set_nlink(inode, nlink); + inode->i_private = ctx; + d_add(dentry, inode); + + return dentry; +} + +static void fuse_kio_rm_dentry(struct dentry *dentry) +{ + d_inode(dentry)->i_private = NULL; + d_drop(dentry); + dput(dentry); +} + +void pcs_fuse_stat_init(struct pcs_fuse_stat *stat) +{ + struct fuse_conn *fc = + container_of(stat, struct pcs_fuse_cluster, cc.stat)->fc; + + mutex_lock(&fuse_mutex); + if (!fuse_control_sb) + goto out; + + stat->kio_stat = fuse_kio_add_dentry(fc->conn_ctl, fc, "kio_stat", + S_IFDIR | S_IXUSR, 2, + &simple_dir_inode_operations, + &simple_dir_operations, fc); + if (!stat->kio_stat) { + pr_err("kio: can't create kio stat directory"); + goto out; + } + + /* Stat initialize */ +out: + mutex_unlock(&fuse_mutex); +} + +void pcs_fuse_stat_fini(struct pcs_fuse_stat *stat) +{ + if (!stat->kio_stat) + return; + + mutex_lock(&fuse_mutex); + if (fuse_control_sb) + fuse_kio_rm_dentry(stat->kio_stat); + mutex_unlock(&fuse_mutex); +} diff --git a/fs/fuse/kio/pcs/fuse_stat.h b/fs/fuse/kio/pcs/fuse_stat.h new file mode 100644 index 000000000000..14687ffd83f2 --- /dev/null +++ b/fs/fuse/kio/pcs/fuse_stat.h @@ -0,0 +1,11 @@ +#ifndef _FUSE_STAT_H_ +#define _FUSE_STAT_H_ 1 + +struct pcs_fuse_stat { + struct dentry *kio_stat; +}; + +void pcs_fuse_stat_init(struct pcs_fuse_stat *stat); +void pcs_fuse_stat_fini(struct pcs_fuse_stat *stat); + +#endif /* _FUSE_STAT_H_ */ \ No newline at end of file diff --git a/fs/fuse/kio/pcs/pcs_cluster_core.c b/fs/fuse/kio/pcs/pcs_cluster_core.c index d1379c99ac6a..aa54ca8d6b45 100644 --- a/fs/fuse/kio/pcs/pcs_cluster_core.c +++ b/fs/fuse/kio/pcs/pcs_cluster_core.c @@ -151,6 +151,8 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq, * pcs_srandomdev(&cc->rng); */ + pcs_fuse_stat_init(&cc->stat); + memset(&cc->cfg, 0, sizeof(cc->cfg)); memset(&cc->op, 0, sizeof(cc->op)); @@ -177,6 +179,7 @@ void pcs_cc_fini(struct pcs_cluster_core *cc) pcs_csset_fini(&cc->css); pcs_mapset_fini(&cc->maps); pcs_rpc_engine_fini(&cc->eng); + pcs_fuse_stat_fini(&cc->stat); BUG_ON(!list_empty(&cc->completion_queue)); BUG_ON(!list_empty(&cc->work_queue)); diff --git a/fs/fuse/kio/pcs/pcs_req.h b/fs/fuse/kio/pcs/pcs_req.h index e668e55f0b71..3a9534b1a5af 100644 --- a/fs/fuse/kio/pcs/pcs_req.h +++ b/fs/fuse/kio/pcs/pcs_req.h @@ -8,6 +8,7 @@ #include "pcs_cs_prot.h" #include "pcs_rpc.h" #include "pcs_cs.h" +#include "fuse_stat.h" /////////////////////////// @@ -207,6 +208,7 @@ struct pcs_cluster_core //// struct pcs_ratelimit rlim; /* Rate limiter */ //// struct pcs_rng rng; /* <SKIP */ + struct pcs_fuse_stat stat; struct { struct pcs_clnt_config def; -- 2.15.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel