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>
This commit is contained in:
parent
9d05e7c4e7
commit
b379c41ed7
@ -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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
* 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++;
|
||||||
|
Loading…
Reference in New Issue
Block a user