[05/15] fs/fuse kio: make interface pcs_kio_req_list() for listing kio reqs

Submitted by Pavel Butsykin on May 17, 2019, 1:20 p.m.

Details

Message ID 20190517132048.13162-6-pbutsykin@virtuozzo.com
State New
Series "Statistics for vstorage kernel fast-path"
Headers show

Commit Message

Pavel Butsykin May 17, 2019, 1:20 p.m.
This is preparation patch that implements common interface pcs_kio_req_list(),
which will be needed to collect kio requests statistics.

Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 27 +++++++++++++++++++++++++++
 fs/fuse/kio/pcs/pcs_req.h          |  3 +++
 2 files changed, 30 insertions(+)

Patch hide | download patch | download mbox

diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index 2060ef3b1fc4..796d8db05aba 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -1533,6 +1533,33 @@  void pcs_kio_file_list(struct fuse_conn *fc, kio_file_itr kfile_cb, void *ctx)
 	}
 }
 
+struct kreq_list_ctx {
+	kio_req_itr cb;
+	void *ctx;
+};
+
+static void kpcs_req_list_itr(struct fuse_file *ff, struct pcs_dentry_info *di,
+			      void *ctx)
+{
+	struct fuse_req *req;
+	struct kreq_list_ctx *kreq_ctx = ctx;
+
+	spin_lock(&di->kq_lock);
+	list_for_each_entry(req, &di->kq, list) {
+		kreq_ctx->cb(ff, req, kreq_ctx->ctx);
+	}
+	spin_unlock(&di->kq_lock);
+}
+
+void pcs_kio_req_list(struct fuse_conn *fc, kio_req_itr kreq_cb, void *ctx)
+{
+	struct kreq_list_ctx kreq_ctx = {
+		.cb = kreq_cb,
+		.ctx = ctx,
+	};
+	pcs_kio_file_list(fc, kpcs_req_list_itr, &kreq_ctx);
+}
+
 static void kpcs_kill_lreq_itr(struct fuse_file *ff, struct pcs_dentry_info *di,
 			       void *ctx)
 {
diff --git a/fs/fuse/kio/pcs/pcs_req.h b/fs/fuse/kio/pcs/pcs_req.h
index a1c7e372f297..ce73fe45bd86 100644
--- a/fs/fuse/kio/pcs/pcs_req.h
+++ b/fs/fuse/kio/pcs/pcs_req.h
@@ -332,5 +332,8 @@  void pcs_ireq_queue_fail(struct list_head *queue, int error);
 typedef void (*kio_file_itr)(struct fuse_file *ff, struct pcs_dentry_info *di,
 			     void *ctx);
 void pcs_kio_file_list(struct fuse_conn *fc, kio_file_itr kfile_cb, void *ctx);
+typedef void (*kio_req_itr)(struct fuse_file *ff, struct fuse_req *req,
+			    void *ctx);
+void pcs_kio_req_list(struct fuse_conn *fc, kio_req_itr kreq_cb, void *ctx);
 
 #endif /* _PCS_REQ_H_ */