drbd: transfer log epoch numbers are now per resource

cherry-picked from drbd 9 devel branch.

In preparation of multiple connections, the "barrier number" or
"epoch number" needs to be tracked per-resource, not per connection.
The sequence number space will not be reset anymore.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 5b1789a..d7ca76c 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -864,6 +864,7 @@
 	spinlock_t epoch_lock;
 	unsigned int epochs;
 	enum write_ordering_e write_ordering;
+	atomic_t current_tle_nr;	/* transfer log epoch number */
 
 	unsigned long last_reconnect_jif;
 	struct drbd_thread receiver;
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 843d0af..bfe6975 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -208,7 +208,7 @@
 	INIT_LIST_HEAD(&b->requests);
 	INIT_LIST_HEAD(&b->w.list);
 	b->next = NULL;
-	b->br_number = 4711;
+	b->br_number = atomic_inc_return(&tconn->current_tle_nr);
 	b->n_writes = 0;
 	b->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */
 
@@ -241,16 +241,13 @@
  */
 void _tl_add_barrier(struct drbd_tconn *tconn, struct drbd_tl_epoch *new)
 {
-	struct drbd_tl_epoch *newest_before;
-
 	INIT_LIST_HEAD(&new->requests);
 	INIT_LIST_HEAD(&new->w.list);
 	new->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */
 	new->next = NULL;
 	new->n_writes = 0;
 
-	newest_before = tconn->newest_tle;
-	new->br_number = newest_before->br_number+1;
+	new->br_number = atomic_inc_return(&tconn->current_tle_nr);
 	if (tconn->newest_tle != new) {
 		tconn->newest_tle->next = new;
 		tconn->newest_tle = new;
@@ -406,7 +403,7 @@
 				list_splice(&carry_reads, &b->requests);
 				INIT_LIST_HEAD(&b->w.list);
 				b->w.cb = NULL;
-				b->br_number = net_random();
+				b->br_number = atomic_inc_return(&tconn->current_tle_nr);
 				b->n_writes = 0;
 
 				*pn = b;
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index 34e791d..a131174 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -187,7 +187,7 @@
 	 */
 	if (mdev->state.conn >= C_CONNECTED &&
 	    (s & RQ_NET_SENT) != 0 &&
-	    req->epoch == mdev->tconn->newest_tle->br_number)
+	    req->epoch == atomic_read(&mdev->tconn->current_tle_nr))
 		queue_barrier(mdev);
 }
 
@@ -518,7 +518,7 @@
 		 * just after it grabs the req_lock */
 		D_ASSERT(test_bit(CREATE_BARRIER, &mdev->tconn->flags) == 0);
 
-		req->epoch = mdev->tconn->newest_tle->br_number;
+		req->epoch = atomic_read(&mdev->tconn->current_tle_nr);
 
 		/* increment size of current epoch */
 		mdev->tconn->newest_tle->n_writes++;