diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-06-11 05:26:34 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2010-10-14 08:59:21 -0400 |
commit | 43a5182cccae5850f7590f78dd9651bd407be440 (patch) | |
tree | b3bed34cdd96b8272134f3b00441f109193292af /drivers/block/drbd/drbd_main.c | |
parent | 87f7be4cf88e93069f4cc63baf2ce70fdfc59c63 (diff) |
drbd: Delayed creation of current-UUID
When a fencing policy of "resource-and-stonith" is configured,
and DRBD looses connection to it's peer, we can delay the
creation of a new current-UUID until IO gets thawed.
That allows one to deploy fence-peer handlers that actually
commit suicide on the machine they get started.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 40baddd94a5b..440b1d5dcfe2 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -1252,12 +1252,23 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | if (fp == FP_STONITH && ns.susp) { | 1254 | if (fp == FP_STONITH && ns.susp) { |
1255 | /* case1: The outdate peer handler is successful: | 1255 | /* case1: The outdate peer handler is successful: */ |
1256 | * case2: The connection was established again: */ | 1256 | if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) { |
1257 | if ((os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) || | ||
1258 | (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED)) { | ||
1259 | tl_clear(mdev); | 1257 | tl_clear(mdev); |
1258 | if (test_bit(NEW_CUR_UUID, &mdev->flags)) { | ||
1259 | drbd_uuid_new_current(mdev); | ||
1260 | clear_bit(NEW_CUR_UUID, &mdev->flags); | ||
1261 | drbd_md_sync(mdev); | ||
1262 | } | ||
1263 | spin_lock_irq(&mdev->req_lock); | ||
1264 | _drbd_set_state(_NS(mdev, susp, 0), CS_VERBOSE, NULL); | ||
1265 | spin_unlock_irq(&mdev->req_lock); | ||
1266 | } | ||
1267 | /* case2: The connection was established again: */ | ||
1268 | if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED) { | ||
1269 | clear_bit(NEW_CUR_UUID, &mdev->flags); | ||
1260 | spin_lock_irq(&mdev->req_lock); | 1270 | spin_lock_irq(&mdev->req_lock); |
1271 | _tl_restart(mdev, resend); | ||
1261 | _drbd_set_state(_NS(mdev, susp, 0), CS_VERBOSE, NULL); | 1272 | _drbd_set_state(_NS(mdev, susp, 0), CS_VERBOSE, NULL); |
1262 | spin_unlock_irq(&mdev->req_lock); | 1273 | spin_unlock_irq(&mdev->req_lock); |
1263 | } | 1274 | } |
@@ -1280,8 +1291,12 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
1280 | if (get_ldev(mdev)) { | 1291 | if (get_ldev(mdev)) { |
1281 | if ((ns.role == R_PRIMARY || ns.peer == R_PRIMARY) && | 1292 | if ((ns.role == R_PRIMARY || ns.peer == R_PRIMARY) && |
1282 | mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { | 1293 | mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { |
1283 | drbd_uuid_new_current(mdev); | 1294 | if (mdev->state.susp) { |
1284 | drbd_send_uuids(mdev); | 1295 | set_bit(NEW_CUR_UUID, &mdev->flags); |
1296 | } else { | ||
1297 | drbd_uuid_new_current(mdev); | ||
1298 | drbd_send_uuids(mdev); | ||
1299 | } | ||
1285 | } | 1300 | } |
1286 | put_ldev(mdev); | 1301 | put_ldev(mdev); |
1287 | } | 1302 | } |