[sheepdog] [PATCH] sheep: cleanup do_recover_object

Christoph Hellwig hch at infradead.org
Tue Jun 5 14:16:32 CEST 2012


Use a switch statement to deal with the different return values from
recover_object_from_replica, and move the switch to and older epoch directly
into the case label where it is required instead of using an obsfucating
control flow.

Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/sheep/recovery.c b/sheep/recovery.c
index 2597126..17f6038 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -177,7 +177,7 @@ static int is_invalid_vnode(struct sd_vnode *entry, struct sd_node *nodes,
  */
 static int do_recover_object(struct recovery_work *rw)
 {
-	struct vnode_info *old;
+	struct vnode_info *old, *new_old;
 	uint64_t oid = rw->oids[rw->done];
 	uint32_t epoch = rw->epoch, tgt_epoch = rw->epoch - 1;
 	int nr_copies, ret, i;
@@ -198,38 +198,37 @@ again:
 			continue;
 		ret = recover_object_from_replica(oid, tgt_vnode,
 						  epoch, tgt_epoch);
-		if (ret == 0) {
+		switch (ret) {
+		case 0:
 			/* Succeed */
-			break;
-		} else if (SD_RES_OLD_NODE_VER == ret) {
+			goto out;
+		case SD_RES_OLD_NODE_VER:
 			rw->stop = 1;
-			goto err;
-		} else
-			ret = -1;
-	}
-
-	/* No luck, roll back to an older configuration and try again */
-	if (ret < 0) {
-		struct vnode_info *new_old;
+			goto out;
+		default:
+			/*
+			 * No luck, roll back to an older configuration and
+			 * try again.
+			 */
+			tgt_epoch--;
+			if (tgt_epoch < 1) {
+				eprintf("can not recover oid %"PRIx64"\n", oid);
+				ret = SD_RES_EIO;
+				goto out;
+			}
 
-		tgt_epoch--;
-		if (tgt_epoch < 1) {
-			eprintf("can not recover oid %"PRIx64"\n", oid);
-			ret = -1;
-			goto err;
-		}
+			new_old = get_vnodes_from_epoch(tgt_epoch);
+			if (!new_old) {
+				ret = SD_RES_EIO;
+				goto out;
+			}
 
-		new_old = get_vnodes_from_epoch(tgt_epoch);
-		if (!new_old) {
-			ret = -1;
-			goto err;
+			put_vnode_info(old);
+			old = new_old;
+			goto again;
 		}
-
-		put_vnode_info(old);
-		old = new_old;
-		goto again;
 	}
-err:
+out:
 	put_vnode_info(old);
 	return ret;
 }



More information about the sheepdog mailing list