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