137800068SChristoph Böhmwalder /* SPDX-License-Identifier: GPL-2.0-only */ 2b411b363SPhilipp Reisner /* 3b411b363SPhilipp Reisner drbd_limits.h 4b411b363SPhilipp Reisner This file is part of DRBD by Philipp Reisner and Lars Ellenberg. 5b411b363SPhilipp Reisner */ 6b411b363SPhilipp Reisner 7b411b363SPhilipp Reisner /* 8b411b363SPhilipp Reisner * Our current limitations. 9b411b363SPhilipp Reisner * Some of them are hard limits, 10b411b363SPhilipp Reisner * some of them are arbitrary range limits, that make it easier to provide 11b411b363SPhilipp Reisner * feedback about nonsense settings for certain configurable values. 12b411b363SPhilipp Reisner */ 13b411b363SPhilipp Reisner 14b411b363SPhilipp Reisner #ifndef DRBD_LIMITS_H 15b411b363SPhilipp Reisner #define DRBD_LIMITS_H 1 16b411b363SPhilipp Reisner 17b411b363SPhilipp Reisner #define DEBUG_RANGE_CHECK 0 18b411b363SPhilipp Reisner 19*c10bdcf9SChristoph Böhmwalder #define DRBD_MINOR_COUNT_MIN 1U 20*c10bdcf9SChristoph Böhmwalder #define DRBD_MINOR_COUNT_MAX 255U 21*c10bdcf9SChristoph Böhmwalder #define DRBD_MINOR_COUNT_DEF 32U 2232bdb640SAndreas Gruenbacher #define DRBD_MINOR_COUNT_SCALE '1' 23b411b363SPhilipp Reisner 24*c10bdcf9SChristoph Böhmwalder #define DRBD_VOLUME_MAX 65534U 250c8e36d9SAndreas Gruenbacher 26*c10bdcf9SChristoph Böhmwalder #define DRBD_DIALOG_REFRESH_MIN 0U 27*c10bdcf9SChristoph Böhmwalder #define DRBD_DIALOG_REFRESH_MAX 600U 2832bdb640SAndreas Gruenbacher #define DRBD_DIALOG_REFRESH_SCALE '1' 29b411b363SPhilipp Reisner 30b411b363SPhilipp Reisner /* valid port number */ 31*c10bdcf9SChristoph Böhmwalder #define DRBD_PORT_MIN 1U 32*c10bdcf9SChristoph Böhmwalder #define DRBD_PORT_MAX 0xffffU 3332bdb640SAndreas Gruenbacher #define DRBD_PORT_SCALE '1' 34b411b363SPhilipp Reisner 35b411b363SPhilipp Reisner /* startup { */ 36b411b363SPhilipp Reisner /* if you want more than 3.4 days, disable */ 37*c10bdcf9SChristoph Böhmwalder #define DRBD_WFC_TIMEOUT_MIN 0U 38*c10bdcf9SChristoph Böhmwalder #define DRBD_WFC_TIMEOUT_MAX 300000U 39*c10bdcf9SChristoph Böhmwalder #define DRBD_WFC_TIMEOUT_DEF 0U 4032bdb640SAndreas Gruenbacher #define DRBD_WFC_TIMEOUT_SCALE '1' 41b411b363SPhilipp Reisner 42*c10bdcf9SChristoph Böhmwalder #define DRBD_DEGR_WFC_TIMEOUT_MIN 0U 43*c10bdcf9SChristoph Böhmwalder #define DRBD_DEGR_WFC_TIMEOUT_MAX 300000U 44*c10bdcf9SChristoph Böhmwalder #define DRBD_DEGR_WFC_TIMEOUT_DEF 0U 4532bdb640SAndreas Gruenbacher #define DRBD_DEGR_WFC_TIMEOUT_SCALE '1' 46b411b363SPhilipp Reisner 47*c10bdcf9SChristoph Böhmwalder #define DRBD_OUTDATED_WFC_TIMEOUT_MIN 0U 48*c10bdcf9SChristoph Böhmwalder #define DRBD_OUTDATED_WFC_TIMEOUT_MAX 300000U 49*c10bdcf9SChristoph Böhmwalder #define DRBD_OUTDATED_WFC_TIMEOUT_DEF 0U 5032bdb640SAndreas Gruenbacher #define DRBD_OUTDATED_WFC_TIMEOUT_SCALE '1' 51b411b363SPhilipp Reisner /* }*/ 52b411b363SPhilipp Reisner 53b411b363SPhilipp Reisner /* net { */ 54b411b363SPhilipp Reisner /* timeout, unit centi seconds 5525985edcSLucas De Marchi * more than one minute timeout is not useful */ 56*c10bdcf9SChristoph Böhmwalder #define DRBD_TIMEOUT_MIN 1U 57*c10bdcf9SChristoph Böhmwalder #define DRBD_TIMEOUT_MAX 600U 58*c10bdcf9SChristoph Böhmwalder #define DRBD_TIMEOUT_DEF 60U /* 6 seconds */ 5932bdb640SAndreas Gruenbacher #define DRBD_TIMEOUT_SCALE '1' 60b411b363SPhilipp Reisner 61cdfda633SPhilipp Reisner /* If backing disk takes longer than disk_timeout, mark the disk as failed */ 62*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_TIMEOUT_MIN 0U /* 0 = disabled */ 63*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_TIMEOUT_MAX 6000U /* 10 Minutes */ 64*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_TIMEOUT_DEF 0U /* disabled */ 65cdfda633SPhilipp Reisner #define DRBD_DISK_TIMEOUT_SCALE '1' 66cdfda633SPhilipp Reisner 67b411b363SPhilipp Reisner /* active connection retries when C_WF_CONNECTION */ 68*c10bdcf9SChristoph Böhmwalder #define DRBD_CONNECT_INT_MIN 1U 69*c10bdcf9SChristoph Böhmwalder #define DRBD_CONNECT_INT_MAX 120U 70*c10bdcf9SChristoph Böhmwalder #define DRBD_CONNECT_INT_DEF 10U /* seconds */ 7132bdb640SAndreas Gruenbacher #define DRBD_CONNECT_INT_SCALE '1' 72b411b363SPhilipp Reisner 73b411b363SPhilipp Reisner /* keep-alive probes when idle */ 74*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_INT_MIN 1U 75*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_INT_MAX 120U 76*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_INT_DEF 10U 7732bdb640SAndreas Gruenbacher #define DRBD_PING_INT_SCALE '1' 78b411b363SPhilipp Reisner 79b411b363SPhilipp Reisner /* timeout for the ping packets.*/ 80*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_TIMEO_MIN 1U 81*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_TIMEO_MAX 300U 82*c10bdcf9SChristoph Böhmwalder #define DRBD_PING_TIMEO_DEF 5U 8332bdb640SAndreas Gruenbacher #define DRBD_PING_TIMEO_SCALE '1' 84b411b363SPhilipp Reisner 85b411b363SPhilipp Reisner /* max number of write requests between write barriers */ 86*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_EPOCH_SIZE_MIN 1U 87*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_EPOCH_SIZE_MAX 20000U 88*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_EPOCH_SIZE_DEF 2048U 8932bdb640SAndreas Gruenbacher #define DRBD_MAX_EPOCH_SIZE_SCALE '1' 90b411b363SPhilipp Reisner 9125985edcSLucas De Marchi /* I don't think that a tcp send buffer of more than 10M is useful */ 92*c10bdcf9SChristoph Böhmwalder #define DRBD_SNDBUF_SIZE_MIN 0U 93*c10bdcf9SChristoph Böhmwalder #define DRBD_SNDBUF_SIZE_MAX (10U<<20) 94*c10bdcf9SChristoph Böhmwalder #define DRBD_SNDBUF_SIZE_DEF 0U 9532bdb640SAndreas Gruenbacher #define DRBD_SNDBUF_SIZE_SCALE '1' 96b411b363SPhilipp Reisner 97*c10bdcf9SChristoph Böhmwalder #define DRBD_RCVBUF_SIZE_MIN 0U 98*c10bdcf9SChristoph Böhmwalder #define DRBD_RCVBUF_SIZE_MAX (10U<<20) 99*c10bdcf9SChristoph Böhmwalder #define DRBD_RCVBUF_SIZE_DEF 0U 10032bdb640SAndreas Gruenbacher #define DRBD_RCVBUF_SIZE_SCALE '1' 101b411b363SPhilipp Reisner 102b411b363SPhilipp Reisner /* @4k PageSize -> 128kB - 512MB */ 103*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BUFFERS_MIN 32U 104*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BUFFERS_MAX 131072U 105*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BUFFERS_DEF 2048U 10632bdb640SAndreas Gruenbacher #define DRBD_MAX_BUFFERS_SCALE '1' 107b411b363SPhilipp Reisner 108b411b363SPhilipp Reisner /* @4k PageSize -> 4kB - 512MB */ 109*c10bdcf9SChristoph Böhmwalder #define DRBD_UNPLUG_WATERMARK_MIN 1U 110*c10bdcf9SChristoph Böhmwalder #define DRBD_UNPLUG_WATERMARK_MAX 131072U 111b411b363SPhilipp Reisner #define DRBD_UNPLUG_WATERMARK_DEF (DRBD_MAX_BUFFERS_DEF/16) 11232bdb640SAndreas Gruenbacher #define DRBD_UNPLUG_WATERMARK_SCALE '1' 113b411b363SPhilipp Reisner 114b411b363SPhilipp Reisner /* 0 is disabled. 115b411b363SPhilipp Reisner * 200 should be more than enough even for very short timeouts */ 116*c10bdcf9SChristoph Böhmwalder #define DRBD_KO_COUNT_MIN 0U 117*c10bdcf9SChristoph Böhmwalder #define DRBD_KO_COUNT_MAX 200U 118*c10bdcf9SChristoph Böhmwalder #define DRBD_KO_COUNT_DEF 7U 11932bdb640SAndreas Gruenbacher #define DRBD_KO_COUNT_SCALE '1' 120b411b363SPhilipp Reisner /* } */ 121b411b363SPhilipp Reisner 122b411b363SPhilipp Reisner /* syncer { */ 123b411b363SPhilipp Reisner /* FIXME allow rate to be zero? */ 124*c10bdcf9SChristoph Böhmwalder #define DRBD_RESYNC_RATE_MIN 1U 125b411b363SPhilipp Reisner /* channel bonding 10 GbE, or other hardware */ 1266394b935SAndreas Gruenbacher #define DRBD_RESYNC_RATE_MAX (4 << 20) 127*c10bdcf9SChristoph Böhmwalder #define DRBD_RESYNC_RATE_DEF 250U 1286394b935SAndreas Gruenbacher #define DRBD_RESYNC_RATE_SCALE 'k' /* kilobytes */ 129b411b363SPhilipp Reisner 130*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_EXTENTS_MIN 67U 1315bbcf5e6SLars Ellenberg /* we use u16 as "slot number", (u16)~0 is "FREE". 1325bbcf5e6SLars Ellenberg * If you use >= 292 kB on-disk ring buffer, 1335bbcf5e6SLars Ellenberg * this is the maximum you can use: */ 134*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_EXTENTS_MAX 0xfffeU 135*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_EXTENTS_DEF 1237U 13632bdb640SAndreas Gruenbacher #define DRBD_AL_EXTENTS_SCALE '1' 137b411b363SPhilipp Reisner 138309f0b70SAndreas Gruenbacher #define DRBD_MINOR_NUMBER_MIN -1 1390317d9ecSAndreas Gruenbacher #define DRBD_MINOR_NUMBER_MAX ((1 << 20) - 1) 140309f0b70SAndreas Gruenbacher #define DRBD_MINOR_NUMBER_DEF -1 141309f0b70SAndreas Gruenbacher #define DRBD_MINOR_NUMBER_SCALE '1' 142b411b363SPhilipp Reisner 143b411b363SPhilipp Reisner /* } */ 144b411b363SPhilipp Reisner 145b411b363SPhilipp Reisner /* drbdsetup XY resize -d Z 146b411b363SPhilipp Reisner * you are free to reduce the device size to nothing, if you want to. 147b411b363SPhilipp Reisner * the upper limit with 64bit kernel, enough ram and flexible meta data 14815b493d1SLars Ellenberg * is 1 PiB, currently. */ 149b411b363SPhilipp Reisner /* DRBD_MAX_SECTORS */ 150*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_SIZE_MIN 0LLU 151*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_SIZE_MAX (1LLU * (2LLU << 40)) 152*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_SIZE_DEF 0LLU /* = disabled = no user size... */ 153c5482bbdSAndreas Gruenbacher #define DRBD_DISK_SIZE_SCALE 's' /* sectors */ 154b411b363SPhilipp Reisner 155a5df0e19SLars Ellenberg #define DRBD_ON_IO_ERROR_DEF EP_DETACH 156b411b363SPhilipp Reisner #define DRBD_FENCING_DEF FP_DONT_CARE 157b411b363SPhilipp Reisner #define DRBD_AFTER_SB_0P_DEF ASB_DISCONNECT 158b411b363SPhilipp Reisner #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT 159b411b363SPhilipp Reisner #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT 160b411b363SPhilipp Reisner #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT 161265be2d0SPhilipp Reisner #define DRBD_ON_NO_DATA_DEF OND_IO_ERROR 162422028b1SPhilipp Reisner #define DRBD_ON_CONGESTION_DEF OC_BLOCK 163380207d0SPhilipp Reisner #define DRBD_READ_BALANCING_DEF RB_PREFER_LOCAL 164b411b363SPhilipp Reisner 165*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BIO_BVECS_MIN 0U 166*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BIO_BVECS_MAX 128U 167*c10bdcf9SChristoph Böhmwalder #define DRBD_MAX_BIO_BVECS_DEF 0U 16832bdb640SAndreas Gruenbacher #define DRBD_MAX_BIO_BVECS_SCALE '1' 169b411b363SPhilipp Reisner 170*c10bdcf9SChristoph Böhmwalder #define DRBD_C_PLAN_AHEAD_MIN 0U 171*c10bdcf9SChristoph Böhmwalder #define DRBD_C_PLAN_AHEAD_MAX 300U 172*c10bdcf9SChristoph Böhmwalder #define DRBD_C_PLAN_AHEAD_DEF 20U 17332bdb640SAndreas Gruenbacher #define DRBD_C_PLAN_AHEAD_SCALE '1' 17467c7ddd0SPhilipp Reisner 175*c10bdcf9SChristoph Böhmwalder #define DRBD_C_DELAY_TARGET_MIN 1U 176*c10bdcf9SChristoph Böhmwalder #define DRBD_C_DELAY_TARGET_MAX 100U 177*c10bdcf9SChristoph Böhmwalder #define DRBD_C_DELAY_TARGET_DEF 10U 17832bdb640SAndreas Gruenbacher #define DRBD_C_DELAY_TARGET_SCALE '1' 17967c7ddd0SPhilipp Reisner 180*c10bdcf9SChristoph Böhmwalder #define DRBD_C_FILL_TARGET_MIN 0U 181*c10bdcf9SChristoph Böhmwalder #define DRBD_C_FILL_TARGET_MAX (1U<<20) /* 500MByte in sec */ 182*c10bdcf9SChristoph Böhmwalder #define DRBD_C_FILL_TARGET_DEF 100U /* Try to place 50KiB in socket send buffer during resync */ 18332bdb640SAndreas Gruenbacher #define DRBD_C_FILL_TARGET_SCALE 's' /* sectors */ 18467c7ddd0SPhilipp Reisner 185*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MAX_RATE_MIN 250U 186*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MAX_RATE_MAX (4U << 20) 187*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MAX_RATE_DEF 102400U 18832bdb640SAndreas Gruenbacher #define DRBD_C_MAX_RATE_SCALE 'k' /* kilobytes */ 18967c7ddd0SPhilipp Reisner 190*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MIN_RATE_MIN 0U 191*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MIN_RATE_MAX (4U << 20) 192*c10bdcf9SChristoph Böhmwalder #define DRBD_C_MIN_RATE_DEF 250U 19332bdb640SAndreas Gruenbacher #define DRBD_C_MIN_RATE_SCALE 'k' /* kilobytes */ 1940f0601f4SLars Ellenberg 195*c10bdcf9SChristoph Böhmwalder #define DRBD_CONG_FILL_MIN 0U 196*c10bdcf9SChristoph Böhmwalder #define DRBD_CONG_FILL_MAX (10U<<21) /* 10GByte in sectors */ 197*c10bdcf9SChristoph Böhmwalder #define DRBD_CONG_FILL_DEF 0U 19832bdb640SAndreas Gruenbacher #define DRBD_CONG_FILL_SCALE 's' /* sectors */ 199422028b1SPhilipp Reisner 200422028b1SPhilipp Reisner #define DRBD_CONG_EXTENTS_MIN DRBD_AL_EXTENTS_MIN 201422028b1SPhilipp Reisner #define DRBD_CONG_EXTENTS_MAX DRBD_AL_EXTENTS_MAX 202422028b1SPhilipp Reisner #define DRBD_CONG_EXTENTS_DEF DRBD_AL_EXTENTS_DEF 20332bdb640SAndreas Gruenbacher #define DRBD_CONG_EXTENTS_SCALE DRBD_AL_EXTENTS_SCALE 204422028b1SPhilipp Reisner 205f399002eSLars Ellenberg #define DRBD_PROTOCOL_DEF DRBD_PROT_C 206f399002eSLars Ellenberg 207*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_BARRIER_DEF 0U 208*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_FLUSHES_DEF 1U 209*c10bdcf9SChristoph Böhmwalder #define DRBD_DISK_DRAIN_DEF 1U 210*c10bdcf9SChristoph Böhmwalder #define DRBD_MD_FLUSHES_DEF 1U 211*c10bdcf9SChristoph Böhmwalder #define DRBD_TCP_CORK_DEF 1U 212*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_UPDATES_DEF 1U 2139de7e14aSLars Ellenberg 214dd4f699dSLars Ellenberg /* We used to ignore the discard_zeroes_data setting. 215dd4f699dSLars Ellenberg * To not change established (and expected) behaviour, 216dd4f699dSLars Ellenberg * by default assume that, for discard_zeroes_data=0, 217dd4f699dSLars Ellenberg * we can make that an effective discard_zeroes_data=1, 218dd4f699dSLars Ellenberg * if we only explicitly zero-out unaligned partial chunks. */ 219*c10bdcf9SChristoph Böhmwalder #define DRBD_DISCARD_ZEROES_IF_ALIGNED_DEF 1U 2209de7e14aSLars Ellenberg 2219de7e14aSLars Ellenberg /* Some backends pretend to support WRITE SAME, 2229de7e14aSLars Ellenberg * but fail such requests when they are actually submitted. 2239de7e14aSLars Ellenberg * This is to tell DRBD to not even try. */ 224*c10bdcf9SChristoph Böhmwalder #define DRBD_DISABLE_WRITE_SAME_DEF 0U 2257bac3e6fSAndreas Gruenbacher 226*c10bdcf9SChristoph Böhmwalder #define DRBD_ALLOW_TWO_PRIMARIES_DEF 0U 227*c10bdcf9SChristoph Böhmwalder #define DRBD_ALWAYS_ASBP_DEF 0U 228*c10bdcf9SChristoph Böhmwalder #define DRBD_USE_RLE_DEF 1U 229*c10bdcf9SChristoph Böhmwalder #define DRBD_CSUMS_AFTER_CRASH_ONLY_DEF 0U 2307bac3e6fSAndreas Gruenbacher 231*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPES_MIN 1U 232*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPES_MAX 1024U 233*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPES_DEF 1U 234d752b269SPhilipp Reisner #define DRBD_AL_STRIPES_SCALE '1' 235d752b269SPhilipp Reisner 236*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPE_SIZE_MIN 4U 237*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPE_SIZE_MAX 16777216U 238*c10bdcf9SChristoph Böhmwalder #define DRBD_AL_STRIPE_SIZE_DEF 32U 239d752b269SPhilipp Reisner #define DRBD_AL_STRIPE_SIZE_SCALE 'k' /* kilobytes */ 2405d0b17f1SPhilipp Reisner 241*c10bdcf9SChristoph Böhmwalder #define DRBD_SOCKET_CHECK_TIMEO_MIN 0U 2425d0b17f1SPhilipp Reisner #define DRBD_SOCKET_CHECK_TIMEO_MAX DRBD_PING_TIMEO_MAX 243*c10bdcf9SChristoph Böhmwalder #define DRBD_SOCKET_CHECK_TIMEO_DEF 0U 2445d0b17f1SPhilipp Reisner #define DRBD_SOCKET_CHECK_TIMEO_SCALE '1' 245a5ca66c4SPhilipp Reisner 246*c10bdcf9SChristoph Böhmwalder #define DRBD_RS_DISCARD_GRANULARITY_MIN 0U 247*c10bdcf9SChristoph Böhmwalder #define DRBD_RS_DISCARD_GRANULARITY_MAX (1U<<20) /* 1MiByte */ 248*c10bdcf9SChristoph Böhmwalder #define DRBD_RS_DISCARD_GRANULARITY_DEF 0U /* disabled by default */ 249a5ca66c4SPhilipp Reisner #define DRBD_RS_DISCARD_GRANULARITY_SCALE '1' /* bytes */ 250a5ca66c4SPhilipp Reisner 251b411b363SPhilipp Reisner #endif 252