This allows farm to reuse the node list used during recovery instead of
rereading it.

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

diff --git a/sheep/farm/farm.c b/sheep/farm/farm.c
index e2e7522..161a8bc 100644
--- a/sheep/farm/farm.c
+++ b/sheep/farm/farm.c
@@ -528,31 +528,25 @@ out:
 	return ret;
 }
 
-static int farm_end_recover(struct siocb *iocb)
+static int farm_end_recover(int epoch, struct vnode_info *cur,
+		struct vnode_info *old)
 {
 	unsigned char snap_sha1[SHA1_LEN];
 	unsigned char trunk_sha1[SHA1_LEN];
-	uint32_t epoch = iocb->epoch - 1;
-	struct sd_node nodes[SD_MAX_NODES];
-	int nr_nodes;
+	uint32_t old_epoch = epoch;
 
-	if (epoch == 0)
+	if (old_epoch == 0)
 		return SD_RES_SUCCESS;
 
-	nr_nodes = epoch_log_read_nr(epoch, (char *)nodes, sizeof(nodes));
-	if (nr_nodes < 0) {
-		dprintf("failed to read nodes for epoch %d\n", epoch);
-		return SD_RES_EIO;
-	}
-
-	dprintf("epoch %d\n", iocb->epoch);
+	dprintf("epoch %d\n", epoch);
 	if (trunk_file_write_recovery(trunk_sha1) < 0)
 		return SD_RES_EIO;
 
-	if (snap_file_write(epoch, nodes, nr_nodes, trunk_sha1, snap_sha1) < 0)
+	if (snap_file_write(old_epoch, old->nodes, old->nr_nodes,
+			    trunk_sha1, snap_sha1) < 0)
 		return SD_RES_EIO;
 
-	if (snap_log_write(epoch, snap_sha1, 0) < 0)
+	if (snap_log_write(old_epoch, snap_sha1, 0) < 0)
 		return SD_RES_EIO;
 
 	return SD_RES_SUCCESS;
diff --git a/sheep/recovery.c b/sheep/recovery.c
index fb8395f..b9aa686 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -398,9 +398,9 @@ static void do_recover_main(struct work *work)
 	recovering_work = NULL;
 
 	sys->recovered_epoch = rw->epoch;
-	free_recovery_work(rw);
 
 	if (next_rw) {
+		free_recovery_work(rw);
 		rw = next_rw;
 		next_rw = NULL;
 
@@ -410,10 +410,10 @@ static void do_recover_main(struct work *work)
 		queue_work(sys->recovery_wqueue, &rw->work);
 	} else {
 		if (sd_store->end_recover) {
-			struct siocb iocb = { 0 };
-			iocb.epoch = sys->epoch;
-			sd_store->end_recover(&iocb);
+			sd_store->end_recover(sys->epoch, rw->cur_vnodes,
+					      rw->old_vnodes);
 		}
+		free_recovery_work(rw);
 	}
 
 	resume_pending_requests();
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 0d05c65..e5068de 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -165,7 +165,8 @@ struct store_driver {
 	int (*link)(uint64_t oid, struct siocb *, uint32_t tgt_epoch);
 	int (*atomic_put)(uint64_t oid, struct siocb *);
 	int (*begin_recover)(struct siocb *);
-	int (*end_recover)(struct siocb *);
+	int (*end_recover)(int epoch, struct vnode_info *cur,
+			   struct vnode_info *old);
 	int (*purge_obj)(void);
 	/* Operations for snapshot */
 	int (*snapshot)(struct siocb *);


