diff options
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index a6d266ee7e2a..d065c646b35a 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -878,9 +878,13 @@ retry: | |||
878 | 878 | ||
879 | if (mdev->cram_hmac_tfm) { | 879 | if (mdev->cram_hmac_tfm) { |
880 | /* drbd_request_state(mdev, NS(conn, WFAuth)); */ | 880 | /* drbd_request_state(mdev, NS(conn, WFAuth)); */ |
881 | if (!drbd_do_auth(mdev)) { | 881 | switch (drbd_do_auth(mdev)) { |
882 | case -1: | ||
882 | dev_err(DEV, "Authentication of peer failed\n"); | 883 | dev_err(DEV, "Authentication of peer failed\n"); |
883 | return -1; | 884 | return -1; |
885 | case 0: | ||
886 | dev_err(DEV, "Authentication of peer failed, trying again.\n"); | ||
887 | return 0; | ||
884 | } | 888 | } |
885 | } | 889 | } |
886 | 890 | ||
@@ -1220,7 +1224,7 @@ static int receive_Barrier(struct drbd_conf *mdev, struct p_header *h) | |||
1220 | epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO); | 1224 | epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO); |
1221 | if (!epoch) { | 1225 | if (!epoch) { |
1222 | dev_warn(DEV, "Allocation of an epoch failed, slowing down\n"); | 1226 | dev_warn(DEV, "Allocation of an epoch failed, slowing down\n"); |
1223 | issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &epoch->flags); | 1227 | issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &mdev->current_epoch->flags); |
1224 | drbd_wait_ee_list_empty(mdev, &mdev->active_ee); | 1228 | drbd_wait_ee_list_empty(mdev, &mdev->active_ee); |
1225 | if (issue_flush) { | 1229 | if (issue_flush) { |
1226 | rv = drbd_flush_after_epoch(mdev, mdev->current_epoch); | 1230 | rv = drbd_flush_after_epoch(mdev, mdev->current_epoch); |
@@ -2866,7 +2870,7 @@ static int receive_sizes(struct drbd_conf *mdev, struct p_header *h) | |||
2866 | 2870 | ||
2867 | /* Never shrink a device with usable data during connect. | 2871 | /* Never shrink a device with usable data during connect. |
2868 | But allow online shrinking if we are connected. */ | 2872 | But allow online shrinking if we are connected. */ |
2869 | if (drbd_new_dev_size(mdev, mdev->ldev) < | 2873 | if (drbd_new_dev_size(mdev, mdev->ldev, 0) < |
2870 | drbd_get_capacity(mdev->this_bdev) && | 2874 | drbd_get_capacity(mdev->this_bdev) && |
2871 | mdev->state.disk >= D_OUTDATED && | 2875 | mdev->state.disk >= D_OUTDATED && |
2872 | mdev->state.conn < C_CONNECTED) { | 2876 | mdev->state.conn < C_CONNECTED) { |
@@ -2881,7 +2885,7 @@ static int receive_sizes(struct drbd_conf *mdev, struct p_header *h) | |||
2881 | #undef min_not_zero | 2885 | #undef min_not_zero |
2882 | 2886 | ||
2883 | if (get_ldev(mdev)) { | 2887 | if (get_ldev(mdev)) { |
2884 | dd = drbd_determin_dev_size(mdev); | 2888 | dd = drbd_determin_dev_size(mdev, 0); |
2885 | put_ldev(mdev); | 2889 | put_ldev(mdev); |
2886 | if (dd == dev_size_error) | 2890 | if (dd == dev_size_error) |
2887 | return FALSE; | 2891 | return FALSE; |
@@ -3831,10 +3835,17 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3831 | { | 3835 | { |
3832 | dev_err(DEV, "This kernel was build without CONFIG_CRYPTO_HMAC.\n"); | 3836 | dev_err(DEV, "This kernel was build without CONFIG_CRYPTO_HMAC.\n"); |
3833 | dev_err(DEV, "You need to disable 'cram-hmac-alg' in drbd.conf.\n"); | 3837 | dev_err(DEV, "You need to disable 'cram-hmac-alg' in drbd.conf.\n"); |
3834 | return 0; | 3838 | return -1; |
3835 | } | 3839 | } |
3836 | #else | 3840 | #else |
3837 | #define CHALLENGE_LEN 64 | 3841 | #define CHALLENGE_LEN 64 |
3842 | |||
3843 | /* Return value: | ||
3844 | 1 - auth succeeded, | ||
3845 | 0 - failed, try again (network error), | ||
3846 | -1 - auth failed, don't try again. | ||
3847 | */ | ||
3848 | |||
3838 | static int drbd_do_auth(struct drbd_conf *mdev) | 3849 | static int drbd_do_auth(struct drbd_conf *mdev) |
3839 | { | 3850 | { |
3840 | char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */ | 3851 | char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */ |
@@ -3855,7 +3866,7 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3855 | (u8 *)mdev->net_conf->shared_secret, key_len); | 3866 | (u8 *)mdev->net_conf->shared_secret, key_len); |
3856 | if (rv) { | 3867 | if (rv) { |
3857 | dev_err(DEV, "crypto_hash_setkey() failed with %d\n", rv); | 3868 | dev_err(DEV, "crypto_hash_setkey() failed with %d\n", rv); |
3858 | rv = 0; | 3869 | rv = -1; |
3859 | goto fail; | 3870 | goto fail; |
3860 | } | 3871 | } |
3861 | 3872 | ||
@@ -3878,14 +3889,14 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3878 | 3889 | ||
3879 | if (p.length > CHALLENGE_LEN*2) { | 3890 | if (p.length > CHALLENGE_LEN*2) { |
3880 | dev_err(DEV, "expected AuthChallenge payload too big.\n"); | 3891 | dev_err(DEV, "expected AuthChallenge payload too big.\n"); |
3881 | rv = 0; | 3892 | rv = -1; |
3882 | goto fail; | 3893 | goto fail; |
3883 | } | 3894 | } |
3884 | 3895 | ||
3885 | peers_ch = kmalloc(p.length, GFP_NOIO); | 3896 | peers_ch = kmalloc(p.length, GFP_NOIO); |
3886 | if (peers_ch == NULL) { | 3897 | if (peers_ch == NULL) { |
3887 | dev_err(DEV, "kmalloc of peers_ch failed\n"); | 3898 | dev_err(DEV, "kmalloc of peers_ch failed\n"); |
3888 | rv = 0; | 3899 | rv = -1; |
3889 | goto fail; | 3900 | goto fail; |
3890 | } | 3901 | } |
3891 | 3902 | ||
@@ -3901,7 +3912,7 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3901 | response = kmalloc(resp_size, GFP_NOIO); | 3912 | response = kmalloc(resp_size, GFP_NOIO); |
3902 | if (response == NULL) { | 3913 | if (response == NULL) { |
3903 | dev_err(DEV, "kmalloc of response failed\n"); | 3914 | dev_err(DEV, "kmalloc of response failed\n"); |
3904 | rv = 0; | 3915 | rv = -1; |
3905 | goto fail; | 3916 | goto fail; |
3906 | } | 3917 | } |
3907 | 3918 | ||
@@ -3911,7 +3922,7 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3911 | rv = crypto_hash_digest(&desc, &sg, sg.length, response); | 3922 | rv = crypto_hash_digest(&desc, &sg, sg.length, response); |
3912 | if (rv) { | 3923 | if (rv) { |
3913 | dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); | 3924 | dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); |
3914 | rv = 0; | 3925 | rv = -1; |
3915 | goto fail; | 3926 | goto fail; |
3916 | } | 3927 | } |
3917 | 3928 | ||
@@ -3945,9 +3956,9 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3945 | } | 3956 | } |
3946 | 3957 | ||
3947 | right_response = kmalloc(resp_size, GFP_NOIO); | 3958 | right_response = kmalloc(resp_size, GFP_NOIO); |
3948 | if (response == NULL) { | 3959 | if (right_response == NULL) { |
3949 | dev_err(DEV, "kmalloc of right_response failed\n"); | 3960 | dev_err(DEV, "kmalloc of right_response failed\n"); |
3950 | rv = 0; | 3961 | rv = -1; |
3951 | goto fail; | 3962 | goto fail; |
3952 | } | 3963 | } |
3953 | 3964 | ||
@@ -3956,7 +3967,7 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3956 | rv = crypto_hash_digest(&desc, &sg, sg.length, right_response); | 3967 | rv = crypto_hash_digest(&desc, &sg, sg.length, right_response); |
3957 | if (rv) { | 3968 | if (rv) { |
3958 | dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); | 3969 | dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); |
3959 | rv = 0; | 3970 | rv = -1; |
3960 | goto fail; | 3971 | goto fail; |
3961 | } | 3972 | } |
3962 | 3973 | ||
@@ -3965,6 +3976,8 @@ static int drbd_do_auth(struct drbd_conf *mdev) | |||
3965 | if (rv) | 3976 | if (rv) |
3966 | dev_info(DEV, "Peer authenticated using %d bytes of '%s' HMAC\n", | 3977 | dev_info(DEV, "Peer authenticated using %d bytes of '%s' HMAC\n", |
3967 | resp_size, mdev->net_conf->cram_hmac_alg); | 3978 | resp_size, mdev->net_conf->cram_hmac_alg); |
3979 | else | ||
3980 | rv = -1; | ||
3968 | 3981 | ||
3969 | fail: | 3982 | fail: |
3970 | kfree(peers_ch); | 3983 | kfree(peers_ch); |