Merge branch 'for-jens' of http://git.drbd.org/linux-2.6-drbd into for-linus

+40 -22
+3 -4
drivers/block/drbd/drbd_int.h
··· 1275 1275 #if DRBD_MAX_SECTORS_BM < DRBD_MAX_SECTORS_32 1276 1276 #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_BM 1277 1277 #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_BM 1278 - #elif !defined(CONFIG_LBD) && BITS_PER_LONG == 32 1278 + #elif !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32 1279 1279 #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_32 1280 1280 #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32 1281 1281 #else ··· 1371 1371 extern void drbd_suspend_io(struct drbd_conf *mdev); 1372 1372 extern void drbd_resume_io(struct drbd_conf *mdev); 1373 1373 extern char *ppsize(char *buf, unsigned long long size); 1374 - extern sector_t drbd_new_dev_size(struct drbd_conf *, 1375 - struct drbd_backing_dev *); 1374 + extern sector_t drbd_new_dev_size(struct drbd_conf *, struct drbd_backing_dev *, int); 1376 1375 enum determine_dev_size { dev_size_error = -1, unchanged = 0, shrunk = 1, grew = 2 }; 1377 - extern enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *) __must_hold(local); 1376 + extern enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *, int force) __must_hold(local); 1378 1377 extern void resync_after_online_grow(struct drbd_conf *); 1379 1378 extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local); 1380 1379 extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role,
+11 -6
drivers/block/drbd/drbd_nl.c
··· 510 510 * Returns 0 on success, negative return values indicate errors. 511 511 * You should call drbd_md_sync() after calling this function. 512 512 */ 513 - enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *mdev) __must_hold(local) 513 + enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *mdev, int force) __must_hold(local) 514 514 { 515 515 sector_t prev_first_sect, prev_size; /* previous meta location */ 516 516 sector_t la_size; ··· 541 541 /* TODO: should only be some assert here, not (re)init... */ 542 542 drbd_md_set_sector_offsets(mdev, mdev->ldev); 543 543 544 - size = drbd_new_dev_size(mdev, mdev->ldev); 544 + size = drbd_new_dev_size(mdev, mdev->ldev, force); 545 545 546 546 if (drbd_get_capacity(mdev->this_bdev) != size || 547 547 drbd_bm_capacity(mdev) != size) { ··· 596 596 } 597 597 598 598 sector_t 599 - drbd_new_dev_size(struct drbd_conf *mdev, struct drbd_backing_dev *bdev) 599 + drbd_new_dev_size(struct drbd_conf *mdev, struct drbd_backing_dev *bdev, int assume_peer_has_space) 600 600 { 601 601 sector_t p_size = mdev->p_size; /* partner's disk size. */ 602 602 sector_t la_size = bdev->md.la_size_sect; /* last agreed size. */ ··· 605 605 sector_t size = 0; 606 606 607 607 m_size = drbd_get_max_capacity(bdev); 608 + 609 + if (mdev->state.conn < C_CONNECTED && assume_peer_has_space) { 610 + dev_warn(DEV, "Resize while not connected was forced by the user!\n"); 611 + p_size = m_size; 612 + } 608 613 609 614 if (p_size && m_size) { 610 615 size = min_t(sector_t, p_size, m_size); ··· 970 965 971 966 /* Prevent shrinking of consistent devices ! */ 972 967 if (drbd_md_test_flag(nbc, MDF_CONSISTENT) && 973 - drbd_new_dev_size(mdev, nbc) < nbc->md.la_size_sect) { 968 + drbd_new_dev_size(mdev, nbc, 0) < nbc->md.la_size_sect) { 974 969 dev_warn(DEV, "refusing to truncate a consistent device\n"); 975 970 retcode = ERR_DISK_TO_SMALL; 976 971 goto force_diskless_dec; ··· 1057 1052 !drbd_md_test_flag(mdev->ldev, MDF_CONNECTED_IND)) 1058 1053 set_bit(USE_DEGR_WFC_T, &mdev->flags); 1059 1054 1060 - dd = drbd_determin_dev_size(mdev); 1055 + dd = drbd_determin_dev_size(mdev, 0); 1061 1056 if (dd == dev_size_error) { 1062 1057 retcode = ERR_NOMEM_BITMAP; 1063 1058 goto force_diskless_dec; ··· 1509 1504 } 1510 1505 1511 1506 mdev->ldev->dc.disk_size = (sector_t)rs.resize_size; 1512 - dd = drbd_determin_dev_size(mdev); 1507 + dd = drbd_determin_dev_size(mdev, rs.resize_force); 1513 1508 drbd_md_sync(mdev); 1514 1509 put_ldev(mdev); 1515 1510 if (dd == dev_size_error) {
+24 -11
drivers/block/drbd/drbd_receiver.c
··· 878 878 879 879 if (mdev->cram_hmac_tfm) { 880 880 /* drbd_request_state(mdev, NS(conn, WFAuth)); */ 881 - if (!drbd_do_auth(mdev)) { 881 + switch (drbd_do_auth(mdev)) { 882 + case -1: 882 883 dev_err(DEV, "Authentication of peer failed\n"); 883 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 ··· 2870 2866 2871 2867 /* Never shrink a device with usable data during connect. 2872 2868 But allow online shrinking if we are connected. */ 2873 - if (drbd_new_dev_size(mdev, mdev->ldev) < 2869 + if (drbd_new_dev_size(mdev, mdev->ldev, 0) < 2874 2870 drbd_get_capacity(mdev->this_bdev) && 2875 2871 mdev->state.disk >= D_OUTDATED && 2876 2872 mdev->state.conn < C_CONNECTED) { ··· 2885 2881 #undef min_not_zero 2886 2882 2887 2883 if (get_ldev(mdev)) { 2888 - dd = drbd_determin_dev_size(mdev); 2884 + dd = drbd_determin_dev_size(mdev, 0); 2889 2885 put_ldev(mdev); 2890 2886 if (dd == dev_size_error) 2891 2887 return FALSE; ··· 3835 3831 { 3836 3832 dev_err(DEV, "This kernel was build without CONFIG_CRYPTO_HMAC.\n"); 3837 3833 dev_err(DEV, "You need to disable 'cram-hmac-alg' in drbd.conf.\n"); 3838 - return 0; 3834 + return -1; 3839 3835 } 3840 3836 #else 3841 3837 #define CHALLENGE_LEN 64 3838 + 3839 + /* Return value: 3840 + 1 - auth succeeded, 3841 + 0 - failed, try again (network error), 3842 + -1 - auth failed, don't try again. 3843 + */ 3844 + 3842 3845 static int drbd_do_auth(struct drbd_conf *mdev) 3843 3846 { 3844 3847 char my_challenge[CHALLENGE_LEN]; /* 64 Bytes... */ ··· 3866 3855 (u8 *)mdev->net_conf->shared_secret, key_len); 3867 3856 if (rv) { 3868 3857 dev_err(DEV, "crypto_hash_setkey() failed with %d\n", rv); 3869 - rv = 0; 3858 + rv = -1; 3870 3859 goto fail; 3871 3860 } 3872 3861 ··· 3889 3878 3890 3879 if (p.length > CHALLENGE_LEN*2) { 3891 3880 dev_err(DEV, "expected AuthChallenge payload too big.\n"); 3892 - rv = 0; 3881 + rv = -1; 3893 3882 goto fail; 3894 3883 } 3895 3884 3896 3885 peers_ch = kmalloc(p.length, GFP_NOIO); 3897 3886 if (peers_ch == NULL) { 3898 3887 dev_err(DEV, "kmalloc of peers_ch failed\n"); 3899 - rv = 0; 3888 + rv = -1; 3900 3889 goto fail; 3901 3890 } 3902 3891 ··· 3912 3901 response = kmalloc(resp_size, GFP_NOIO); 3913 3902 if (response == NULL) { 3914 3903 dev_err(DEV, "kmalloc of response failed\n"); 3915 - rv = 0; 3904 + rv = -1; 3916 3905 goto fail; 3917 3906 } 3918 3907 ··· 3922 3911 rv = crypto_hash_digest(&desc, &sg, sg.length, response); 3923 3912 if (rv) { 3924 3913 dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); 3925 - rv = 0; 3914 + rv = -1; 3926 3915 goto fail; 3927 3916 } 3928 3917 ··· 3958 3947 right_response = kmalloc(resp_size, GFP_NOIO); 3959 3948 if (right_response == NULL) { 3960 3949 dev_err(DEV, "kmalloc of right_response failed\n"); 3961 - rv = 0; 3950 + rv = -1; 3962 3951 goto fail; 3963 3952 } 3964 3953 ··· 3967 3956 rv = crypto_hash_digest(&desc, &sg, sg.length, right_response); 3968 3957 if (rv) { 3969 3958 dev_err(DEV, "crypto_hash_digest() failed with %d\n", rv); 3970 - rv = 0; 3959 + rv = -1; 3971 3960 goto fail; 3972 3961 } 3973 3962 ··· 3976 3965 if (rv) 3977 3966 dev_info(DEV, "Peer authenticated using %d bytes of '%s' HMAC\n", 3978 3967 resp_size, mdev->net_conf->cram_hmac_alg); 3968 + else 3969 + rv = -1; 3979 3970 3980 3971 fail: 3981 3972 kfree(peers_ch);
+1 -1
include/linux/drbd.h
··· 53 53 54 54 55 55 extern const char *drbd_buildtag(void); 56 - #define REL_VERSION "8.3.6" 56 + #define REL_VERSION "8.3.7" 57 57 #define API_VERSION 88 58 58 #define PRO_VERSION_MIN 86 59 59 #define PRO_VERSION_MAX 91
+1
include/linux/drbd_nl.h
··· 69 69 70 70 NL_PACKET(resize, 7, 71 71 NL_INT64( 29, T_MAY_IGNORE, resize_size) 72 + NL_BIT( 68, T_MAY_IGNORE, resize_force) 72 73 ) 73 74 74 75 NL_PACKET(syncer_conf, 8,