[RFC,2/2] fs/fuse kio: synchronize pcs_cc_process_ireq_ioreq() with userspace

Submitted by Pavel Butsykin on June 5, 2019, 10:35 a.m.

Details

Message ID 20190605103540.14775-2-pbutsykin@virtuozzo.com
State New
Series "Series without cover letter"
Headers show

Commit Message

Pavel Butsykin June 5, 2019, 10:35 a.m.
This patch is aimed at eliminating discrepancies between fpath and current
vstorage userspace client. In the long run, this will help avoid confusion
and ease backporting patches.

Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_cluster.c | 122 ++++++++++++++++++------------------------
 fs/fuse/kio/pcs/pcs_map.c     |  23 +++-----
 2 files changed, 61 insertions(+), 84 deletions(-)

Patch hide | download patch | download mbox

diff --git a/fs/fuse/kio/pcs/pcs_cluster.c b/fs/fuse/kio/pcs/pcs_cluster.c
index 082acea9affa..a0bb9ecb4684 100644
--- a/fs/fuse/kio/pcs/pcs_cluster.c
+++ b/fs/fuse/kio/pcs/pcs_cluster.c
@@ -336,84 +336,45 @@  void pcs_cc_process_ireq_chunk(struct pcs_int_request *ireq)
 	map_submit(map, ireq);
 }
 
-/* TODO Remove noinline in production */
-static noinline void __pcs_cc_process_ireq_rw(struct pcs_int_request *ireq)
+static void process_varchunk_request(struct pcs_int_request *ireq,
+				     struct pcs_flow_node *fl, u64 pos, u64 sz)
 {
 	struct pcs_dentry_info *di = ireq->dentry;
-	u64 pos = ireq->apireq.req->pos;
-	unsigned int sz = ireq->apireq.req->size;
-	unsigned int dio_offset = 0;
-	struct pcs_flow_node *fl;
+	struct pcs_int_request *sreq;
 
-	if (di->fileinfo.sys.map_type != PCS_MAP_PLAIN) {
-		BUG_ON(1);
+	sreq = ireq_alloc(di);
+	if (!sreq) {
+		pcs_set_local_error(&ireq->error, PCS_ERR_NOMEM);
 		return;
 	}
 
-	TRACE(DENTRY_FMT " %p op=%d at %llu [%llu]\n", DENTRY_ARGS(di), ireq, ireq->apireq.req->type,
-	      (unsigned long long)ireq->apireq.req->pos, (unsigned long long)ireq->apireq.req->size);
-
-
-	atomic_set(&ireq->iocount, 1);
-	ireq->flags |= IREQ_F_CACHED;
-
-	fl =  pcs_flow_record(&di->mapping.ftab, ireq->apireq.req->type == PCS_REQ_T_WRITE,
-			      pos, sz, &di->cluster->maps.ftab);
-
-	while (sz) {
-		struct pcs_int_request *sreq;
-		unsigned int len;
-		u64 rpos, chunk, end_pos;
-
-		rpos = map_file_to_chunk(pos, di->fileinfo.sys.chunk_size_lo, di->fileinfo.sys.stripe_depth, di->fileinfo.sys.strip_width);
-
-		chunk = rpos & ~((u64)di->fileinfo.sys.chunk_size_lo - 1);
-		end_pos = ((rpos / di->fileinfo.sys.strip_width) + 1) * (u64)di->fileinfo.sys.strip_width;
-
-		sreq = ireq_alloc(di);
-		if (!sreq) {
-			pcs_set_local_error(&ireq->error, PCS_ERR_NOMEM);
-			break;
-		}
-
-		sreq->dentry = di;
-		sreq->type = PCS_IREQ_IOCHUNK;
-		INIT_LIST_HEAD(&sreq->tok_list);
-		sreq->tok_reserved = 0;
-		sreq->tok_serno = 0;
-		sreq->iochunk.map = NULL;
-		sreq->iochunk.flow = pcs_flow_get(fl);
-		sreq->iochunk.cmd = ireq->apireq.req->type;
-		sreq->iochunk.cs_index = 0;
-		sreq->iochunk.chunk = chunk;
-		sreq->iochunk.offset = rpos % di->fileinfo.sys.chunk_size_lo;
-		sreq->iochunk.dio_offset = dio_offset;
-		len = di->fileinfo.sys.chunk_size_lo - sreq->iochunk.offset;
-		if (len > sz)
-			len = sz;
-		if (rpos + len > end_pos)
-			len = end_pos - rpos;
-		sreq->iochunk.size = len;
-		sreq->iochunk.csl = NULL;
-		sreq->iochunk.banned_cs.val = 0;
-		sreq->iochunk.msg.destructor = NULL;
-		sreq->iochunk.msg.rpc = NULL;
-
-		pcs_sreq_attach(sreq, ireq);
-		sreq->complete_cb = pcs_sreq_complete;
-		pcs_cc_process_ireq_chunk(sreq);
-
-		pos += len;
-		sz -= len;
-		dio_offset += len;
-	}
-	pcs_flow_put(fl, &di->cluster->maps.ftab);
-	if (atomic_dec_and_test(&ireq->iocount))
-		ireq_complete(ireq);
+	sreq->dentry = di;
+	sreq->type = PCS_IREQ_IOCHUNK;
+	INIT_LIST_HEAD(&sreq->tok_list);
+	sreq->tok_reserved = 0;
+	sreq->tok_serno = 0;
+	sreq->iochunk.map = NULL;
+	sreq->iochunk.flow = pcs_flow_get(fl);
+	sreq->iochunk.cmd = ireq->apireq.req->type;
+	sreq->iochunk.cs_index = 0;
+	sreq->iochunk.chunk = pos;
+	sreq->iochunk.offset = 0;
+	sreq->iochunk.dio_offset = 0;
+	sreq->iochunk.size = sz;
+	sreq->iochunk.csl = NULL;
+	sreq->iochunk.banned_cs.val = 0;
+	sreq->iochunk.msg.destructor = NULL;
+	sreq->iochunk.msg.rpc = NULL;
+
+	pcs_sreq_attach(sreq, ireq);
+	sreq->complete_cb = pcs_sreq_complete;
+	pcs_cc_process_ireq_chunk(sreq);
 }
 
 static void pcs_cc_process_ireq_ioreq(struct pcs_int_request *ireq)
 {
+	struct pcs_dentry_info *di = ireq->dentry;
+
 	if (ireq->apireq.req->type == PCS_REQ_T_SYNC) {
 		map_inject_flush_req(ireq);
 		return;
@@ -432,7 +393,30 @@  static void pcs_cc_process_ireq_ioreq(struct pcs_int_request *ireq)
 		ireq_complete(ireq);
 		return;
 	}
-	return __pcs_cc_process_ireq_rw(ireq);
+
+	if (di->fileinfo.sys.map_type == PCS_MAP_PLAIN) {
+		u64 pos = ireq->apireq.req->pos;
+		u64 sz = ireq->apireq.req->size;
+		struct pcs_flow_node *fl;
+
+		TRACE(DENTRY_FMT " %p op=%d at %llu [%llu]\n", DENTRY_ARGS(di),
+		      ireq, ireq->apireq.req->type, (u64)ireq->apireq.req->pos,
+		      (u64)ireq->apireq.req->size);
+
+		atomic_set(&ireq->iocount, 1);
+		ireq->flags |= IREQ_F_CACHED;
+
+		fl =  pcs_flow_record(&di->mapping.ftab,
+				      pcs_req_direction(ireq->apireq.req->type),
+				      pos, sz, &di->cluster->maps.ftab);
+
+		BUG_ON(di->fileinfo.sys.stripe_depth != 1);
+		process_varchunk_request(ireq, fl, pos, sz);
+		pcs_flow_put(fl, &di->cluster->maps.ftab);
+		if (atomic_dec_and_test(&ireq->iocount))
+			ireq_complete(ireq);
+	} else
+		BUG_ON(1);
 }
 
 static void process_ireq_token(struct pcs_int_request * ireq)
diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
index 70be51b025d9..273697b840ff 100644
--- a/fs/fuse/kio/pcs/pcs_map.c
+++ b/fs/fuse/kio/pcs/pcs_map.c
@@ -2337,29 +2337,22 @@  void map_submit(struct pcs_map_entry * m, struct pcs_int_request *ireq)
 
 		if (ireq->type != PCS_IREQ_FLUSH && !(ireq->flags & IREQ_F_MAPPED)) {
 			u64 pos = ireq->iochunk.chunk + ireq->iochunk.offset;
-			u64 len = map_end - pos;
-
-			/*
-			 * For non variable chunks all alligment should be done
-			 * inside pcs_cc_process_ireq_ioreq();
-			 */
 			BUG_ON(pos < map_start);
-			BUG_ON(ireq->iochunk.chunk != map_start);
-			BUG_ON(ireq->iochunk.offset != pos - ireq->iochunk.chunk);
-			if (ireq->iochunk.size > len) {
+			ireq->iochunk.chunk = map_start;
+			ireq->iochunk.offset = pos - ireq->iochunk.chunk;
+			if (pos + ireq->iochunk.size > map_end) {
 				if (ireq->iochunk.cmd == PCS_REQ_T_FIEMAP) {
-					pcs_api_iorequest_t * ar = ireq->completion_data.parent->apireq.req;
-					ireq->iochunk.size = len;
+					pcs_api_iorequest_t *ar = ireq->completion_data.parent->apireq.req;
+					ireq->iochunk.size = map_end - pos;
 					ar->size = ireq->iochunk.size;
 				} else {
-					struct pcs_int_request * sreq;
-
-					sreq = pcs_ireq_split(ireq, len, 0);
+					struct pcs_int_request *sreq;
+					sreq = pcs_ireq_split(ireq, map_end - pos, 0);
 					if (ireq->iochunk.map) {
 						pcs_map_put(ireq->iochunk.map);
 						ireq->iochunk.map = NULL;
 					}
-					ireq->iochunk.chunk = map_end;
+					ireq->iochunk.chunk += ireq->iochunk.offset;
 					ireq->iochunk.offset = 0;
 					pcs_cc_submit(ireq->dentry->cluster, ireq);
 					ireq = sreq;