diff options
Diffstat (limited to 'drivers/block/drbd/drbd_nl.c')
| -rw-r--r-- | drivers/block/drbd/drbd_nl.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 4df3b40b1057..6429d2b19e06 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
| @@ -285,8 +285,8 @@ int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) | |||
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | if (r == SS_NO_UP_TO_DATE_DISK && force && | 287 | if (r == SS_NO_UP_TO_DATE_DISK && force && |
| 288 | (mdev->state.disk == D_INCONSISTENT || | 288 | (mdev->state.disk < D_UP_TO_DATE && |
| 289 | mdev->state.disk == D_OUTDATED)) { | 289 | mdev->state.disk >= D_INCONSISTENT)) { |
| 290 | mask.disk = D_MASK; | 290 | mask.disk = D_MASK; |
| 291 | val.disk = D_UP_TO_DATE; | 291 | val.disk = D_UP_TO_DATE; |
| 292 | forced = 1; | 292 | forced = 1; |
| @@ -407,7 +407,7 @@ static int drbd_nl_primary(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp, | |||
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | reply->ret_code = | 409 | reply->ret_code = |
| 410 | drbd_set_role(mdev, R_PRIMARY, primary_args.overwrite_peer); | 410 | drbd_set_role(mdev, R_PRIMARY, primary_args.primary_force); |
| 411 | 411 | ||
| 412 | return 0; | 412 | return 0; |
| 413 | } | 413 | } |
| @@ -941,6 +941,25 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
| 941 | 941 | ||
| 942 | drbd_md_set_sector_offsets(mdev, nbc); | 942 | drbd_md_set_sector_offsets(mdev, nbc); |
| 943 | 943 | ||
| 944 | /* allocate a second IO page if logical_block_size != 512 */ | ||
| 945 | logical_block_size = bdev_logical_block_size(nbc->md_bdev); | ||
| 946 | if (logical_block_size == 0) | ||
| 947 | logical_block_size = MD_SECTOR_SIZE; | ||
| 948 | |||
| 949 | if (logical_block_size != MD_SECTOR_SIZE) { | ||
| 950 | if (!mdev->md_io_tmpp) { | ||
| 951 | struct page *page = alloc_page(GFP_NOIO); | ||
| 952 | if (!page) | ||
| 953 | goto force_diskless_dec; | ||
| 954 | |||
| 955 | dev_warn(DEV, "Meta data's bdev logical_block_size = %d != %d\n", | ||
| 956 | logical_block_size, MD_SECTOR_SIZE); | ||
| 957 | dev_warn(DEV, "Workaround engaged (has performance impact).\n"); | ||
| 958 | |||
| 959 | mdev->md_io_tmpp = page; | ||
| 960 | } | ||
| 961 | } | ||
| 962 | |||
| 944 | if (!mdev->bitmap) { | 963 | if (!mdev->bitmap) { |
| 945 | if (drbd_bm_init(mdev)) { | 964 | if (drbd_bm_init(mdev)) { |
| 946 | retcode = ERR_NOMEM; | 965 | retcode = ERR_NOMEM; |
| @@ -980,25 +999,6 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
| 980 | goto force_diskless_dec; | 999 | goto force_diskless_dec; |
| 981 | } | 1000 | } |
| 982 | 1001 | ||
| 983 | /* allocate a second IO page if logical_block_size != 512 */ | ||
| 984 | logical_block_size = bdev_logical_block_size(nbc->md_bdev); | ||
| 985 | if (logical_block_size == 0) | ||
| 986 | logical_block_size = MD_SECTOR_SIZE; | ||
| 987 | |||
| 988 | if (logical_block_size != MD_SECTOR_SIZE) { | ||
| 989 | if (!mdev->md_io_tmpp) { | ||
| 990 | struct page *page = alloc_page(GFP_NOIO); | ||
| 991 | if (!page) | ||
| 992 | goto force_diskless_dec; | ||
| 993 | |||
| 994 | dev_warn(DEV, "Meta data's bdev logical_block_size = %d != %d\n", | ||
| 995 | logical_block_size, MD_SECTOR_SIZE); | ||
| 996 | dev_warn(DEV, "Workaround engaged (has performance impact).\n"); | ||
| 997 | |||
| 998 | mdev->md_io_tmpp = page; | ||
| 999 | } | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | /* Reset the "barriers don't work" bits here, then force meta data to | 1002 | /* Reset the "barriers don't work" bits here, then force meta data to |
| 1003 | * be written, to ensure we determine if barriers are supported. */ | 1003 | * be written, to ensure we determine if barriers are supported. */ |
| 1004 | if (nbc->dc.no_md_flush) | 1004 | if (nbc->dc.no_md_flush) |
