Commit b379c41e authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 9d05e7c4
...@@ -864,6 +864,7 @@ struct drbd_tconn { /* is a resource from the config file */ ...@@ -864,6 +864,7 @@ struct drbd_tconn { /* is a resource from the config file */
spinlock_t epoch_lock; spinlock_t epoch_lock;
unsigned int epochs; unsigned int epochs;
enum write_ordering_e write_ordering; enum write_ordering_e write_ordering;
atomic_t current_tle_nr; /* transfer log epoch number */
unsigned long last_reconnect_jif; unsigned long last_reconnect_jif;
struct drbd_thread receiver; struct drbd_thread receiver;
......
...@@ -208,7 +208,7 @@ static int tl_init(struct drbd_tconn *tconn) ...@@ -208,7 +208,7 @@ static int tl_init(struct drbd_tconn *tconn)
INIT_LIST_HEAD(&b->requests); INIT_LIST_HEAD(&b->requests);
INIT_LIST_HEAD(&b->w.list); INIT_LIST_HEAD(&b->w.list);
b->next = NULL; b->next = NULL;
b->br_number = 4711; b->br_number = atomic_inc_return(&tconn->current_tle_nr);
b->n_writes = 0; b->n_writes = 0;
b->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ b->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */
...@@ -241,16 +241,13 @@ static void tl_cleanup(struct drbd_tconn *tconn) ...@@ -241,16 +241,13 @@ static void tl_cleanup(struct drbd_tconn *tconn)
*/ */
void _tl_add_barrier(struct drbd_tconn *tconn, struct drbd_tl_epoch *new) 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->requests);
INIT_LIST_HEAD(&new->w.list); INIT_LIST_HEAD(&new->w.list);
new->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ new->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */
new->next = NULL; new->next = NULL;
new->n_writes = 0; new->n_writes = 0;
newest_before = tconn->newest_tle; new->br_number = atomic_inc_return(&tconn->current_tle_nr);
new->br_number = newest_before->br_number+1;
if (tconn->newest_tle != new) { if (tconn->newest_tle != new) {
tconn->newest_tle->next = new; tconn->newest_tle->next = new;
tconn->newest_tle = new; tconn->newest_tle = new;
...@@ -406,7 +403,7 @@ void _tl_restart(struct drbd_tconn *tconn, enum drbd_req_event what) ...@@ -406,7 +403,7 @@ void _tl_restart(struct drbd_tconn *tconn, enum drbd_req_event what)
list_splice(&carry_reads, &b->requests); list_splice(&carry_reads, &b->requests);
INIT_LIST_HEAD(&b->w.list); INIT_LIST_HEAD(&b->w.list);
b->w.cb = NULL; b->w.cb = NULL;
b->br_number = net_random(); b->br_number = atomic_inc_return(&tconn->current_tle_nr);
b->n_writes = 0; b->n_writes = 0;
*pn = b; *pn = b;
......
...@@ -187,7 +187,7 @@ static void _about_to_complete_local_write(struct drbd_conf *mdev, ...@@ -187,7 +187,7 @@ static void _about_to_complete_local_write(struct drbd_conf *mdev,
*/ */
if (mdev->state.conn >= C_CONNECTED && if (mdev->state.conn >= C_CONNECTED &&
(s & RQ_NET_SENT) != 0 && (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); queue_barrier(mdev);
} }
...@@ -518,7 +518,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, ...@@ -518,7 +518,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
* just after it grabs the req_lock */ * just after it grabs the req_lock */
D_ASSERT(test_bit(CREATE_BARRIER, &mdev->tconn->flags) == 0); 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 */ /* increment size of current epoch */
mdev->tconn->newest_tle->n_writes++; mdev->tconn->newest_tle->n_writes++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment