[Devel] [PATCH v2] fuse kio: never ignore fuse_req error during PCS_IOC_GETMAP

Anton Nefedov anton.nefedov at virtuozzo.com
Fri Nov 23 15:40:34 MSK 2018


if ioctl returns error its result cannot be interpreted. Propagate
the error into the resulting pcs_ioc_getmap structure unconditionally.

Since VERSION 1.2 fused properly sets fuse_ioctl_out::result (which passed
into work->status)

Signed-off-by: Anton Nefedov <anton.nefedov at virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 6 ++++--
 fs/fuse/kio/pcs/pcs_ioctl.h        | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index d1d3f7f4a256..3b1d819792b2 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -425,8 +425,10 @@ static void fuse_complete_map_work(struct work_struct *w)
 
 	BUG_ON(!m);
 	BUG_ON(!omap);
-	pcs_copy_error_cond(&omap->error, &work->status);
-	if (omap->cs_cnt > MAX_CS_CNT) {
+
+	if (pcs_if_error(&work->status)) {
+		pcs_copy_error(&omap->error, &work->status);
+	} else if (omap->cs_cnt > MAX_CS_CNT) {
 		printk("Corrupted cs_cnt from userspace");
 		pcs_set_local_error(&omap->error, PCS_ERR_PROTOCOL);
 	}
diff --git a/fs/fuse/kio/pcs/pcs_ioctl.h b/fs/fuse/kio/pcs/pcs_ioctl.h
index b36bc653b210..5cf40e35f881 100644
--- a/fs/fuse/kio/pcs/pcs_ioctl.h
+++ b/fs/fuse/kio/pcs/pcs_ioctl.h
@@ -10,7 +10,7 @@
 #include "pcs_map.h"
 #include "pcs_rpc.h"
 
-#define PCS_FAST_PATH_VERSION ((PCS_FAST_PATH_VERSION_T){1, 1})
+#define PCS_FAST_PATH_VERSION ((PCS_FAST_PATH_VERSION_T){1, 2})
 
 #define PCS_FUSE_INO_SPECIAL_ ((unsigned long long)-0x1000)
 
-- 
2.17.1



More information about the Devel mailing list