[sheepdog] [PATCH 7/7] sbd: some error handling refinements

Liu Yuan namei.unix at gmail.com
Sat May 24 15:41:43 CEST 2014


From: Liu Yuan <tailai.ly at taobao.com>

- switch sd_rsp->resault for sheep_run_sdreq
- explicitly handle some errors in sheep_handle_reply

We don't handle failure of submit_sheep_request yet. Make it a todo in the
future because auto-reconnect patch will hopefully solve the whole problem.

Also remove -DDEBUG

Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
 sbd/Kbuild  |  2 +-
 sbd/sheep.c | 58 +++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/sbd/Kbuild b/sbd/Kbuild
index 2bf714a..3742004 100644
--- a/sbd/Kbuild
+++ b/sbd/Kbuild
@@ -1,5 +1,5 @@
 MODULE_NAME=sbd
 
-ccflags-y	:= -I$(PWD)/../include -std=gnu99 -DDEBUG
+ccflags-y	:= -I$(PWD)/../include -std=gnu99
 obj-m		:= $(MODULE_NAME).o
 $(MODULE_NAME)-y := sheep_block_device.o sheep.o
diff --git a/sbd/sheep.c b/sbd/sheep.c
index 3d6a3ad..be291c4 100644
--- a/sbd/sheep.c
+++ b/sbd/sheep.c
@@ -191,6 +191,16 @@ static int sheep_run_sdreq(struct socket *sock, struct sd_req *hdr,
 		}
 	}
 
+	switch (rsp->result) {
+	case SD_RES_SUCCESS:
+		break;
+	case SD_RES_NO_OBJ:
+	case SD_RES_NO_VDI:
+		return -ENOENT;
+	default:
+		return -EIO;
+	}
+
 	return 0;
 }
 
@@ -207,12 +217,6 @@ static int lookup_sheep_vdi(struct sbd_device *dev)
 	if (ret < 0)
 		return ret;
 
-	/* XXX switch case */
-	if (rsp->result != SD_RES_SUCCESS) {
-		sbd_debug("Cannot get VDI info for %s\n", dev->vdi.name);
-		return -EIO;
-	}
-
 	dev->vdi.vid = rsp->vdi.vdi_id;
 
 	return 0;
@@ -221,7 +225,6 @@ static int lookup_sheep_vdi(struct sbd_device *dev)
 int sheep_setup_vdi(struct sbd_device *dev)
 {
 	struct sd_req hdr = {};
-	struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
 	struct sd_inode *inode;
 	int ret;
 
@@ -235,23 +238,20 @@ int sheep_setup_vdi(struct sbd_device *dev)
 		goto out;
 
 	ret = lookup_sheep_vdi(dev);
-	if (ret < 0)
+	if (ret < 0) {
+		pr_err("Cannot get VDI for %s, %d\n", dev->vdi.name, ret);
 		goto out_release;
+	}
 
 	hdr.opcode = SD_OP_READ_OBJ;
 	hdr.data_length = SD_INODE_SIZE;
 	hdr.obj.oid = vid_to_vdi_oid(dev->vdi.vid);
 	hdr.obj.offset = 0;
 	ret = sheep_run_sdreq(dev->sock, &hdr, inode);
-	if (ret < 0)
-		goto out_release;
-
-	/* XXX switch case */
-	if (rsp->result != SD_RES_SUCCESS) {
-		ret = -EIO;
+	if (ret < 0) {
+		pr_err("Cannot read inode for %s, %d\n", dev->vdi.name, ret);
 		goto out_release;
 	}
-
 	dev->vdi.inode = inode;
 	pr_info("%s: Associated to %s\n", DRV_NAME, inode->name);
 	return 0;
@@ -263,10 +263,12 @@ out:
 	return ret;
 }
 
-static void submit_sheep_request(struct sheep_request *req)
+/* FIXME: handle submit failure */
+static int submit_sheep_request(struct sheep_request *req)
 {
 	struct sd_req hdr = {};
 	struct sbd_device *dev = sheep_request_to_device(req);
+	int ret;
 
 	hdr.id = req->seq_num;
 	hdr.data_length = req->length;
@@ -286,16 +288,24 @@ static void submit_sheep_request(struct sheep_request *req)
 		else
 			hdr.opcode = SD_OP_WRITE_OBJ;
 		hdr.flags = SD_FLAG_CMD_WRITE | SD_FLAG_CMD_DIRECT;
-		sheep_submit_sdreq(dev->sock, &hdr, req->buf, req->length);
+		ret = sheep_submit_sdreq(dev->sock, &hdr, req->buf,
+					 req->length);
+		if (ret < 0)
+			goto err;
 		break;
 	case SHEEP_READ:
 		hdr.opcode = SD_OP_READ_OBJ;
-		sheep_submit_sdreq(dev->sock, &hdr, NULL, 0);
+		ret = sheep_submit_sdreq(dev->sock, &hdr, NULL, 0);
+		if (ret < 0)
+			goto err;
 		break;
 	}
 	sbd_debug("add oid %llx off %d, len %d, seq %u, type %d\n", req->oid,
 		  req->offset, req->length, req->seq_num, req->type);
 	wake_up(&dev->reaper_wq);
+	return 0;
+err:
+	return ret;
 }
 
 static inline void free_sheep_aiocb(struct sheep_aiocb *aiocb)
@@ -569,6 +579,7 @@ static void submit_blocking_sheep_request(struct sbd_device *dev, uint64_t oid)
 	write_unlock(&dev->blocking_lock);
 }
 
+/* FIXME: add auto-reconnect support */
 int sheep_handle_reply(struct sbd_device *dev)
 {
 	struct sd_rsp rsp = {};
@@ -592,7 +603,8 @@ int sheep_handle_reply(struct sbd_device *dev)
 		ret = socket_read(dev->sock, req->buf, req->length);
 		if (ret < 0) {
 			pr_err("failed to read reply payload %d\n", ret);
-			goto err;
+			req->aiocb->ret = EIO;
+			goto end_request;
 		}
 	}
 
@@ -602,7 +614,8 @@ int sheep_handle_reply(struct sbd_device *dev)
 		new = kmalloc(sizeof(*new), GFP_KERNEL);
 		if (!new) {
 			ret = -ENOMEM;
-			goto err;
+			req->aiocb->ret = EIO;
+			goto end_request;
 		}
 
 		vid = dev->vdi.vid;
@@ -628,11 +641,10 @@ int sheep_handle_reply(struct sbd_device *dev)
 		/* fall thru */
 	case SHEEP_WRITE:
 	case SHEEP_READ:
-		end_sheep_request(req);
 		break;
 	}
-
-	return 0;
+end_request:
+	end_sheep_request(req);
 err:
 	return ret;
 }
-- 
1.8.1.2




More information about the sheepdog mailing list