diff options
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 1 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 9 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 4 |
3 files changed, 6 insertions, 8 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 5b1789af6cdf..d7ca76ce00cb 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -864,6 +864,7 @@ struct drbd_tconn { /* is a resource from the config file */ | |||
864 | spinlock_t epoch_lock; | 864 | spinlock_t epoch_lock; |
865 | unsigned int epochs; | 865 | unsigned int epochs; |
866 | enum write_ordering_e write_ordering; | 866 | enum write_ordering_e write_ordering; |
867 | atomic_t current_tle_nr; /* transfer log epoch number */ | ||
867 | 868 | ||
868 | unsigned long last_reconnect_jif; | 869 | unsigned long last_reconnect_jif; |
869 | struct drbd_thread receiver; | 870 | struct drbd_thread receiver; |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 843d0af68f96..bfe6975ef94c 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -208,7 +208,7 @@ static int tl_init(struct drbd_tconn *tconn) | |||
208 | INIT_LIST_HEAD(&b->requests); | 208 | INIT_LIST_HEAD(&b->requests); |
209 | INIT_LIST_HEAD(&b->w.list); | 209 | INIT_LIST_HEAD(&b->w.list); |
210 | b->next = NULL; | 210 | b->next = NULL; |
211 | b->br_number = 4711; | 211 | b->br_number = atomic_inc_return(&tconn->current_tle_nr); |
212 | b->n_writes = 0; | 212 | b->n_writes = 0; |
213 | b->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ | 213 | b->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ |
214 | 214 | ||
@@ -241,16 +241,13 @@ static void tl_cleanup(struct drbd_tconn *tconn) | |||
241 | */ | 241 | */ |
242 | void _tl_add_barrier(struct drbd_tconn *tconn, struct drbd_tl_epoch *new) | 242 | void _tl_add_barrier(struct drbd_tconn *tconn, struct drbd_tl_epoch *new) |
243 | { | 243 | { |
244 | struct drbd_tl_epoch *newest_before; | ||
245 | |||
246 | INIT_LIST_HEAD(&new->requests); | 244 | INIT_LIST_HEAD(&new->requests); |
247 | INIT_LIST_HEAD(&new->w.list); | 245 | INIT_LIST_HEAD(&new->w.list); |
248 | new->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ | 246 | new->w.cb = NULL; /* if this is != NULL, we need to dec_ap_pending in tl_clear */ |
249 | new->next = NULL; | 247 | new->next = NULL; |
250 | new->n_writes = 0; | 248 | new->n_writes = 0; |
251 | 249 | ||
252 | newest_before = tconn->newest_tle; | 250 | new->br_number = atomic_inc_return(&tconn->current_tle_nr); |
253 | new->br_number = newest_before->br_number+1; | ||
254 | if (tconn->newest_tle != new) { | 251 | if (tconn->newest_tle != new) { |
255 | tconn->newest_tle->next = new; | 252 | tconn->newest_tle->next = new; |
256 | tconn->newest_tle = new; | 253 | tconn->newest_tle = new; |
@@ -406,7 +403,7 @@ void _tl_restart(struct drbd_tconn *tconn, enum drbd_req_event what) | |||
406 | list_splice(&carry_reads, &b->requests); | 403 | list_splice(&carry_reads, &b->requests); |
407 | INIT_LIST_HEAD(&b->w.list); | 404 | INIT_LIST_HEAD(&b->w.list); |
408 | b->w.cb = NULL; | 405 | b->w.cb = NULL; |
409 | b->br_number = net_random(); | 406 | b->br_number = atomic_inc_return(&tconn->current_tle_nr); |
410 | b->n_writes = 0; | 407 | b->n_writes = 0; |
411 | 408 | ||
412 | *pn = b; | 409 | *pn = b; |
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 34e791dfaf81..a131174b6677 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
@@ -187,7 +187,7 @@ static void _about_to_complete_local_write(struct drbd_conf *mdev, | |||
187 | */ | 187 | */ |
188 | if (mdev->state.conn >= C_CONNECTED && | 188 | if (mdev->state.conn >= C_CONNECTED && |
189 | (s & RQ_NET_SENT) != 0 && | 189 | (s & RQ_NET_SENT) != 0 && |
190 | req->epoch == mdev->tconn->newest_tle->br_number) | 190 | req->epoch == atomic_read(&mdev->tconn->current_tle_nr)) |
191 | queue_barrier(mdev); | 191 | queue_barrier(mdev); |
192 | } | 192 | } |
193 | 193 | ||
@@ -518,7 +518,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
518 | * just after it grabs the req_lock */ | 518 | * just after it grabs the req_lock */ |
519 | D_ASSERT(test_bit(CREATE_BARRIER, &mdev->tconn->flags) == 0); | 519 | D_ASSERT(test_bit(CREATE_BARRIER, &mdev->tconn->flags) == 0); |
520 | 520 | ||
521 | req->epoch = mdev->tconn->newest_tle->br_number; | 521 | req->epoch = atomic_read(&mdev->tconn->current_tle_nr); |
522 | 522 | ||
523 | /* increment size of current epoch */ | 523 | /* increment size of current epoch */ |
524 | mdev->tconn->newest_tle->n_writes++; | 524 | mdev->tconn->newest_tle->n_writes++; |