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 <[email protected]>

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;
 }
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to