|
@@ -878,9 +878,13 @@ retry:
|
|
|
|
|
|
if (mdev->cram_hmac_tfm) {
|
|
|
/* drbd_request_state(mdev, NS(conn, WFAuth)); */
|
|
|
- if (!drbd_do_auth(mdev)) {
|
|
|
+ switch (drbd_do_auth(mdev)) {
|
|
|
+ case -1:
|
|
|
dev_err(DEV, "Authentication of peer failed\n");
|
|
|
return -1;
|
|
|
+ case 0:
|
|
|
+ dev_err(DEV, "Authentication of peer failed, trying again.\n");
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1201,10 +1205,11 @@ static int receive_Barrier(struct drbd_conf *mdev, struct p_header *h)
|
|
|
|
|
|
case WO_bdev_flush:
|
|
|
case WO_drain_io:
|
|
|
- D_ASSERT(rv == FE_STILL_LIVE);
|
|
|
- set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &mdev->current_epoch->flags);
|
|
|
- drbd_wait_ee_list_empty(mdev, &mdev->active_ee);
|
|
|
- rv = drbd_flush_after_epoch(mdev, mdev->current_epoch);
|
|
|
+ if (rv == FE_STILL_LIVE) {
|
|
|
+ set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &mdev->current_epoch->flags);
|
|
|
+ drbd_wait_ee_list_empty(mdev, &mdev->active_ee);
|
|
|
+ rv = drbd_flush_after_epoch(mdev, mdev->current_epoch);
|
|
|
+ }
|
|
|
if (rv == FE_RECYCLED)
|
|
|
return TRUE;
|
|
|
|
|
@@ -2865,7 +2870,7 @@ static int receive_sizes(struct drbd_conf *mdev, struct p_header *h)
|
|
|
|
|
|
/* Never shrink a device with usable data during connect.
|
|
|
But allow online shrinking if we are connected. */
|
|
|
- if (drbd_new_dev_size(mdev, mdev->ldev) <
|
|
|
+ if (drbd_new_dev_size(mdev, mdev->ldev, 0) <
|
|
|
drbd_get_capacity(mdev->this_bdev) &&
|
|
|
mdev->state.disk >= D_OUTDATED &&
|
|
|
mdev->state.conn < C_CONNECTED) {
|
|
@@ -2880,7 +2885,7 @@ static int receive_sizes(struct drbd_conf *mdev, struct p_header *h)
|
|
|
#undef min_not_zero
|
|
|
|
|
|
if (get_ldev(mdev)) {
|
|
|
- dd = drbd_determin_dev_size(mdev);
|
|
|
+ dd = drbd_determin_dev_size(mdev, 0);
|
|
|
put_ldev(mdev);
|
|
|
if (dd == dev_size_error)
|
|
|
return FALSE;
|
|
@@ -3830,10 +3835,17 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
{
|
|
|
dev_err(DEV, "This kernel was build without CONFIG_CRYPTO_HMAC.\n");
|
|
|
dev_err(DEV, "You need to disable 'cram-hmac-alg' in drbd.conf.\n");
|
|
|
- return 0;
|
|
|
+ return -1;
|
|
|
}
|
|
|
#else
|
|
|
#define CHALLENGE_LEN 64
|
|
|
+
|
|
|
+/* Return value:
|
|
|
+ 1 - auth succeeded,
|
|
|
+ 0 - failed, try again (network error),
|
|
|
+ -1 - auth failed, don't try again.
|
|
|
+*/
|
|
|
+
|
|
|
static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
{
|
|
|
char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */
|
|
@@ -3854,7 +3866,7 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
(u8 *)mdev->net_conf->shared_secret, key_len);
|
|
|
if (rv) {
|
|
|
dev_err(DEV, "crypto_hash_setkey() failed with %d\n", rv);
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3877,14 +3889,14 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
|
|
|
if (p.length > CHALLENGE_LEN*2) {
|
|
|
dev_err(DEV, "expected AuthChallenge payload too big.\n");
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
peers_ch = kmalloc(p.length, GFP_NOIO);
|
|
|
if (peers_ch == NULL) {
|
|
|
dev_err(DEV, "kmalloc of peers_ch failed\n");
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3900,7 +3912,7 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
response = kmalloc(resp_size, GFP_NOIO);
|
|
|
if (response == NULL) {
|
|
|
dev_err(DEV, "kmalloc of response failed\n");
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3910,7 +3922,7 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
rv = crypto_hash_digest(&desc, &sg, sg.length, response);
|
|
|
if (rv) {
|
|
|
dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv);
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3944,9 +3956,9 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
}
|
|
|
|
|
|
right_response = kmalloc(resp_size, GFP_NOIO);
|
|
|
- if (response == NULL) {
|
|
|
+ if (right_response == NULL) {
|
|
|
dev_err(DEV, "kmalloc of right_response failed\n");
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3955,7 +3967,7 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
rv = crypto_hash_digest(&desc, &sg, sg.length, right_response);
|
|
|
if (rv) {
|
|
|
dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv);
|
|
|
- rv = 0;
|
|
|
+ rv = -1;
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
@@ -3964,6 +3976,8 @@ static int drbd_do_auth(struct drbd_conf *mdev)
|
|
|
if (rv)
|
|
|
dev_info(DEV, "Peer authenticated using %d bytes of '%s' HMAC\n",
|
|
|
resp_size, mdev->net_conf->cram_hmac_alg);
|
|
|
+ else
|
|
|
+ rv = -1;
|
|
|
|
|
|
fail:
|
|
|
kfree(peers_ch);
|