~ubuntu-branches/ubuntu/karmic/linux-mvl-dove/karmic-proposed

« back to all changes in this revision

Viewing changes to ubuntu/drbd/drbd_int.h

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Bader
  • Date: 2010-03-10 22:24:12 UTC
  • mto: (15.1.2 karmic-security)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20100310222412-k86m3r53jw0je7x1
Tags: upstream-2.6.31
ImportĀ upstreamĀ versionĀ 2.6.31

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
  drbd_int.h
3
 
 
4
 
  This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
5
 
 
6
 
  Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
7
 
  Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
8
 
  Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
9
 
 
10
 
  drbd is free software; you can redistribute it and/or modify
11
 
  it under the terms of the GNU General Public License as published by
12
 
  the Free Software Foundation; either version 2, or (at your option)
13
 
  any later version.
14
 
 
15
 
  drbd is distributed in the hope that it will be useful,
16
 
  but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
  GNU General Public License for more details.
19
 
 
20
 
  You should have received a copy of the GNU General Public License
21
 
  along with drbd; see the file COPYING.  If not, write to
22
 
  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23
 
 
24
 
*/
25
 
 
26
 
#ifndef _DRBD_INT_H
27
 
#define _DRBD_INT_H
28
 
 
29
 
#include <linux/compiler.h>
30
 
#include <linux/types.h>
31
 
#include <linux/version.h>
32
 
#include <linux/list.h>
33
 
#include <linux/sched.h>
34
 
#include <linux/bitops.h>
35
 
#include <linux/slab.h>
36
 
#include <linux/crypto.h>
37
 
#include <linux/tcp.h>
38
 
#include <linux/mutex.h>
39
 
#include <linux/major.h>
40
 
#include <linux/blkdev.h>
41
 
#include <linux/bio.h>
42
 
#include <net/tcp.h>
43
 
#include "lru_cache.h"
44
 
 
45
 
#ifdef __CHECKER__
46
 
# define __protected_by(x)       __attribute__((require_context(x,1,999,"rdwr")))
47
 
# define __protected_read_by(x)  __attribute__((require_context(x,1,999,"read")))
48
 
# define __protected_write_by(x) __attribute__((require_context(x,1,999,"write")))
49
 
# define __must_hold(x)       __attribute__((context(x,1,1), require_context(x,1,999,"call")))
50
 
#else
51
 
# define __protected_by(x)
52
 
# define __protected_read_by(x)
53
 
# define __protected_write_by(x)
54
 
# define __must_hold(x)
55
 
#endif
56
 
 
57
 
#define __no_warn(lock, stmt) do { __acquire(lock); stmt; __release(lock); } while (0)
58
 
 
59
 
/* module parameter, defined in drbd_main.c */
60
 
extern unsigned int minor_count;
61
 
extern int allow_oos;
62
 
extern unsigned int cn_idx;
63
 
 
64
 
#ifdef DRBD_ENABLE_FAULTS
65
 
extern int enable_faults;
66
 
extern int fault_rate;
67
 
extern int fault_devs;
68
 
#endif
69
 
 
70
 
extern char usermode_helper[];
71
 
 
72
 
 
73
 
#ifndef TRUE
74
 
#define TRUE 1
75
 
#endif
76
 
#ifndef FALSE
77
 
#define FALSE 0
78
 
#endif
79
 
 
80
 
/* I don't remember why XCPU ...
81
 
 * This is used to wake the asender,
82
 
 * and to interrupt sending the sending task
83
 
 * on disconnect.
84
 
 */
85
 
#define DRBD_SIG SIGXCPU
86
 
 
87
 
/* This is used to stop/restart our threads.
88
 
 * Cannot use SIGTERM nor SIGKILL, since these
89
 
 * are sent out by init on runlevel changes
90
 
 * I choose SIGHUP for now.
91
 
 */
92
 
#define DRBD_SIGKILL SIGHUP
93
 
 
94
 
/* All EEs on the free list should have ID_VACANT (== 0)
95
 
 * freshly allocated EEs get !ID_VACANT (== 1)
96
 
 * so if it says "cannot dereference null pointer at adress 0x00000001",
97
 
 * it is most likely one of these :( */
98
 
 
99
 
#define ID_IN_SYNC      (4711ULL)
100
 
#define ID_OUT_OF_SYNC  (4712ULL)
101
 
 
102
 
#define ID_SYNCER (-1ULL)
103
 
#define ID_VACANT 0
104
 
#define is_syncer_block_id(id) ((id) == ID_SYNCER)
105
 
 
106
 
struct drbd_conf;
107
 
 
108
 
#ifdef DBG_ALL_SYMBOLS
109
 
# define STATIC
110
 
#else
111
 
# define STATIC static
112
 
#endif
113
 
 
114
 
/*
115
 
 * Some Message Macros
116
 
 *************************/
117
 
 
118
 
#define DUMPP(A)   ERR(#A " = %p in %s:%d\n", (A), __FILE__, __LINE__);
119
 
#define DUMPLU(A)  ERR(#A " = %lu in %s:%d\n", (unsigned long)(A), __FILE__, __LINE__);
120
 
#define DUMPLLU(A) ERR(#A " = %llu in %s:%d\n", (unsigned long long)(A), __FILE__, __LINE__);
121
 
#define DUMPLX(A)  ERR(#A " = %lx in %s:%d\n", (A), __FILE__, __LINE__);
122
 
#define DUMPI(A)   ERR(#A " = %d in %s:%d\n", (int)(A), __FILE__, __LINE__);
123
 
 
124
 
 
125
 
#define PRINTK(level, fmt, args...) \
126
 
        printk(level "drbd%d: " fmt, \
127
 
                mdev->minor , ##args)
128
 
 
129
 
#define ALERT(fmt, args...) PRINTK(KERN_ALERT, fmt , ##args)
130
 
#define ERR(fmt, args...)   PRINTK(KERN_ERR, fmt , ##args)
131
 
/* nowadays, WARN() is defined as BUG() without crash in bug.h */
132
 
#define drbd_WARN(fmt, args...)  PRINTK(KERN_WARNING, fmt , ##args)
133
 
#define INFO(fmt, args...)  PRINTK(KERN_INFO, fmt , ##args)
134
 
#define DBG(fmt, args...)   PRINTK(KERN_DEBUG, fmt , ##args)
135
 
 
136
 
#define D_ASSERT(exp)   if (!(exp)) \
137
 
         ERR("ASSERT( " #exp " ) in %s:%d\n", __FILE__, __LINE__)
138
 
 
139
 
#define ERR_IF(exp) if (({                              \
140
 
        int _b = (exp) != 0;                            \
141
 
        if (_b) ERR("%s: (%s) in %s:%d\n",              \
142
 
                __func__, #exp, __FILE__, __LINE__);    \
143
 
         _b;                                            \
144
 
        }))
145
 
 
146
 
/* Defines to control fault insertion */
147
 
enum {
148
 
    DRBD_FAULT_MD_WR = 0,       /* meta data write */
149
 
    DRBD_FAULT_MD_RD,           /*           read  */
150
 
    DRBD_FAULT_RS_WR,           /* resync          */
151
 
    DRBD_FAULT_RS_RD,
152
 
    DRBD_FAULT_DT_WR,           /* data            */
153
 
    DRBD_FAULT_DT_RD,
154
 
    DRBD_FAULT_DT_RA,           /* data read ahead */
155
 
    DRBD_FAULT_BM_ALLOC,        /* bitmap allocation */
156
 
    DRBD_FAULT_AL_EE,           /* alloc ee */
157
 
 
158
 
    DRBD_FAULT_MAX,
159
 
};
160
 
 
161
 
#ifdef DRBD_ENABLE_FAULTS
162
 
extern unsigned int
163
 
_drbd_insert_fault(struct drbd_conf *mdev, unsigned int type);
164
 
static inline int
165
 
drbd_insert_fault(struct drbd_conf *mdev, unsigned int type) {
166
 
    return fault_rate &&
167
 
            (enable_faults & (1<<type)) &&
168
 
            _drbd_insert_fault(mdev, type);
169
 
}
170
 
#define FAULT_ACTIVE(_m, _t) (drbd_insert_fault((_m), (_t)))
171
 
 
172
 
#else
173
 
#define FAULT_ACTIVE(_m, _t) (0)
174
 
#endif
175
 
 
176
 
/* integer division, round _UP_ to the next integer */
177
 
#define div_ceil(A, B) ((A)/(B) + ((A)%(B) ? 1 : 0))
178
 
/* usual integer division */
179
 
#define div_floor(A, B) ((A)/(B))
180
 
 
181
 
/* drbd_meta-data.c (still in drbd_main.c) */
182
 
/* 4th incarnation of the disk layout. */
183
 
#define DRBD_MD_MAGIC (DRBD_MAGIC+4)
184
 
 
185
 
extern struct drbd_conf **minor_table;
186
 
extern struct ratelimit_state drbd_ratelimit_state;
187
 
 
188
 
/***
189
 
 * on the wire
190
 
 *********************************************************************/
191
 
 
192
 
enum Drbd_Packet_Cmd {
193
 
        /* receiver (data socket) */
194
 
        Data              = 0x00,
195
 
        DataReply         = 0x01, /* Response to DataRequest */
196
 
        RSDataReply       = 0x02, /* Response to RSDataRequest */
197
 
        Barrier           = 0x03,
198
 
        ReportBitMap      = 0x04,
199
 
        BecomeSyncTarget  = 0x05,
200
 
        BecomeSyncSource  = 0x06,
201
 
        UnplugRemote      = 0x07, /* Used at various times to hint the peer */
202
 
        DataRequest       = 0x08, /* Used to ask for a data block */
203
 
        RSDataRequest     = 0x09, /* Used to ask for a data block for resync */
204
 
        SyncParam         = 0x0a,
205
 
        ReportProtocol    = 0x0b,
206
 
        ReportUUIDs       = 0x0c,
207
 
        ReportSizes       = 0x0d,
208
 
        ReportState       = 0x0e,
209
 
        ReportSyncUUID    = 0x0f,
210
 
        AuthChallenge     = 0x10,
211
 
        AuthResponse      = 0x11,
212
 
        StateChgRequest   = 0x12,
213
 
 
214
 
        /* asender (meta socket */
215
 
        Ping              = 0x13,
216
 
        PingAck           = 0x14,
217
 
        RecvAck           = 0x15, /* Used in protocol B */
218
 
        WriteAck          = 0x16, /* Used in protocol C */
219
 
        RSWriteAck        = 0x17, /* Is a WriteAck, additionally call set_in_sync(). */
220
 
        DiscardAck        = 0x18, /* Used in proto C, two-primaries conflict detection */
221
 
        NegAck            = 0x19, /* Sent if local disk is unusable */
222
 
        NegDReply         = 0x1a, /* Local disk is broken... */
223
 
        NegRSDReply       = 0x1b, /* Local disk is broken... */
224
 
        BarrierAck        = 0x1c,
225
 
        StateChgReply     = 0x1d,
226
 
 
227
 
        /* "new" commands, no longer fitting into the ordering scheme above */
228
 
 
229
 
        OVRequest         = 0x1e, /* data socket */
230
 
        OVReply           = 0x1f,
231
 
        OVResult          = 0x20, /* meta socket */
232
 
        CsumRSRequest     = 0x21, /* data socket */
233
 
        RSIsInSync        = 0x22, /* meta socket */
234
 
        SyncParam89       = 0x23, /* data socket, protocol version 89 replacement for SyncParam */
235
 
        ReportCBitMap     = 0x24, /* compressed or otherwise encoded bitmap transfer */
236
 
 
237
 
        MAX_CMD           = 0x25,
238
 
        MayIgnore         = 0x100, /* Flag to test if (cmd > MayIgnore) ... */
239
 
        MAX_OPT_CMD       = 0x101,
240
 
 
241
 
        /* special command ids for handshake */
242
 
 
243
 
        HandShakeM        = 0xfff1, /* First Packet on the MetaSock */
244
 
        HandShakeS        = 0xfff2, /* First Packet on the Socket */
245
 
 
246
 
        HandShake         = 0xfffe  /* FIXED for the next century! */
247
 
};
248
 
 
249
 
static inline const char *cmdname(enum Drbd_Packet_Cmd cmd)
250
 
{
251
 
        /* THINK may need to become several global tables
252
 
         * when we want to support more than
253
 
         * one PRO_VERSION */
254
 
        static const char *cmdnames[] = {
255
 
                [Data]             = "Data",
256
 
                [DataReply]        = "DataReply",
257
 
                [RSDataReply]      = "RSDataReply",
258
 
                [Barrier]          = "Barrier",
259
 
                [ReportBitMap]     = "ReportBitMap",
260
 
                [BecomeSyncTarget] = "BecomeSyncTarget",
261
 
                [BecomeSyncSource] = "BecomeSyncSource",
262
 
                [UnplugRemote]     = "UnplugRemote",
263
 
                [DataRequest]      = "DataRequest",
264
 
                [RSDataRequest]    = "RSDataRequest",
265
 
                [SyncParam]        = "SyncParam",
266
 
                [SyncParam89]      = "SyncParam89",
267
 
                [ReportProtocol]   = "ReportProtocol",
268
 
                [ReportUUIDs]      = "ReportUUIDs",
269
 
                [ReportSizes]      = "ReportSizes",
270
 
                [ReportState]      = "ReportState",
271
 
                [ReportSyncUUID]   = "ReportSyncUUID",
272
 
                [AuthChallenge]    = "AuthChallenge",
273
 
                [AuthResponse]     = "AuthResponse",
274
 
                [Ping]             = "Ping",
275
 
                [PingAck]          = "PingAck",
276
 
                [RecvAck]          = "RecvAck",
277
 
                [WriteAck]         = "WriteAck",
278
 
                [RSWriteAck]       = "RSWriteAck",
279
 
                [DiscardAck]       = "DiscardAck",
280
 
                [NegAck]           = "NegAck",
281
 
                [NegDReply]        = "NegDReply",
282
 
                [NegRSDReply]      = "NegRSDReply",
283
 
                [BarrierAck]       = "BarrierAck",
284
 
                [StateChgRequest]  = "StateChgRequest",
285
 
                [StateChgReply]    = "StateChgReply",
286
 
                [OVRequest]        = "OVRequest",
287
 
                [OVReply]          = "OVReply",
288
 
                [OVResult]         = "OVResult",
289
 
                [CsumRSRequest]    = "CsumRSRequest",
290
 
                [RSIsInSync]       = "RSIsInSync",
291
 
                [ReportCBitMap]    = "ReportCBitMap",
292
 
                [MAX_CMD]          = NULL,
293
 
        };
294
 
 
295
 
        if (cmd == HandShakeM)
296
 
                return "HandShakeM";
297
 
        if (cmd == HandShakeS)
298
 
                return "HandShakeS";
299
 
        if (cmd == HandShake)
300
 
                return "HandShake";
301
 
        if (cmd >= MAX_CMD)
302
 
                return "Unknown";
303
 
        return cmdnames[cmd];
304
 
}
305
 
 
306
 
/* for sending/receiving the bitmap,
307
 
 * possibly in some encoding scheme */
308
 
struct bm_xfer_ctx {
309
 
        /* "const"
310
 
         * stores total bits and long words
311
 
         * of the bitmap, so we don't need to
312
 
         * call the accessor functions over and again. */
313
 
        unsigned long bm_bits;
314
 
        unsigned long bm_words;
315
 
        /* during xfer, current position within the bitmap */
316
 
        unsigned long bit_offset;
317
 
        unsigned long word_offset;
318
 
 
319
 
        /* statistics; index: (h->command == ReportBitMap) */
320
 
        unsigned packets[2];
321
 
        unsigned bytes[2];
322
 
};
323
 
 
324
 
extern void INFO_bm_xfer_stats(struct drbd_conf *mdev,
325
 
                const char *direction, struct bm_xfer_ctx *c);
326
 
 
327
 
static inline void bm_xfer_ctx_bit_to_word_offset(struct bm_xfer_ctx *c)
328
 
{
329
 
        /* word_offset counts "native long words" (32 or 64 bit),
330
 
         * aligned at 64 bit.
331
 
         * Encoded packet may end at an unaligned bit offset.
332
 
         * In case a fallback clear text packet is transmitted in
333
 
         * between, we adjust this offset back to the last 64bit
334
 
         * aligned "native long word", which makes coding and decoding
335
 
         * the plain text bitmap much more convenient.  */
336
 
#if BITS_PER_LONG == 64
337
 
        c->word_offset = c->bit_offset >> 6;
338
 
#elif BITS_PER_LONG == 32
339
 
        c->word_offset = c->bit_offset >> 5;
340
 
        c->word_offset &= ~(1UL);
341
 
#else
342
 
# error "unsupported BITS_PER_LONG"
343
 
#endif
344
 
}
345
 
 
346
 
/* This is the layout for a packet on the wire.
347
 
 * The byteorder is the network byte order.
348
 
 *     (except block_id and barrier fields.
349
 
 *      these are pointers to local structs
350
 
 *      and have no relevance for the partner,
351
 
 *      which just echoes them as received.)
352
 
 *
353
 
 * NOTE that the payload starts at a long aligned offset,
354
 
 * regardless of 32 or 64 bit arch!
355
 
 */
356
 
struct Drbd_Header {
357
 
        u32       magic;
358
 
        u16       command;
359
 
        u16       length;       /* bytes of data after this header */
360
 
        u8        payload[0];
361
 
} __attribute((packed));
362
 
/* 8 bytes. packet FIXED for the next century! */
363
 
 
364
 
/*
365
 
 * short commands, packets without payload, plain Drbd_Header:
366
 
 *   Ping
367
 
 *   PingAck
368
 
 *   BecomeSyncTarget
369
 
 *   BecomeSyncSource
370
 
 *   UnplugRemote
371
 
 */
372
 
 
373
 
/*
374
 
 * commands with out-of-struct payload:
375
 
 *   ReportBitMap    (no additional fields)
376
 
 *   Data, DataReply (see Drbd_Data_Packet)
377
 
 *   ReportCBitMap (see receive_compressed_bitmap)
378
 
 */
379
 
 
380
 
/* these defines must not be changed without changing the protocol version */
381
 
#define DP_HARDBARRIER        1
382
 
#define DP_RW_SYNC            2
383
 
#define DP_MAY_SET_IN_SYNC    4
384
 
 
385
 
struct Drbd_Data_Packet {
386
 
        struct Drbd_Header head;
387
 
        u64         sector;    /* 64 bits sector number */
388
 
        u64         block_id;  /* to identify the request in protocol B&C */
389
 
        u32         seq_num;
390
 
        u32         dp_flags;
391
 
} __attribute((packed));
392
 
 
393
 
/*
394
 
 * commands which share a struct:
395
 
 *  Drbd_BlockAck_Packet:
396
 
 *   RecvAck (proto B), WriteAck (proto C),
397
 
 *   DiscardAck (proto C, two-primaries conflict detection)
398
 
 *  Drbd_BlockRequest_Packet:
399
 
 *   DataRequest, RSDataRequest
400
 
 */
401
 
struct Drbd_BlockAck_Packet {
402
 
        struct Drbd_Header head;
403
 
        u64         sector;
404
 
        u64         block_id;
405
 
        u32         blksize;
406
 
        u32         seq_num;
407
 
} __attribute((packed));
408
 
 
409
 
 
410
 
struct Drbd_BlockRequest_Packet {
411
 
        struct Drbd_Header head;
412
 
        u64 sector;
413
 
        u64 block_id;
414
 
        u32 blksize;
415
 
        u32 pad;        /* to multiple of 8 Byte */
416
 
} __attribute((packed));
417
 
 
418
 
/*
419
 
 * commands with their own struct for additional fields:
420
 
 *   HandShake
421
 
 *   Barrier
422
 
 *   BarrierAck
423
 
 *   SyncParam
424
 
 *   ReportParams
425
 
 */
426
 
 
427
 
struct Drbd_HandShake_Packet {
428
 
        struct Drbd_Header head;        /* 8 bytes */
429
 
        u32 protocol_min;
430
 
        u32 feature_flags;
431
 
        u32 protocol_max;
432
 
 
433
 
        /* should be more than enough for future enhancements
434
 
         * for now, feature_flags and the reserverd array shall be zero.
435
 
         */
436
 
 
437
 
        u32 _pad;
438
 
        u64 reserverd[7];
439
 
} __attribute((packed));
440
 
/* 80 bytes, FIXED for the next century */
441
 
 
442
 
struct Drbd_Barrier_Packet {
443
 
        struct Drbd_Header head;
444
 
        u32 barrier;    /* barrier number _handle_ only */
445
 
        u32 pad;        /* to multiple of 8 Byte */
446
 
} __attribute((packed));
447
 
 
448
 
struct Drbd_BarrierAck_Packet {
449
 
        struct Drbd_Header head;
450
 
        u32 barrier;
451
 
        u32 set_size;
452
 
} __attribute((packed));
453
 
 
454
 
struct Drbd_SyncParam_Packet {
455
 
        struct Drbd_Header head;
456
 
        u32 rate;
457
 
 
458
 
              /* Since protocol version 88 and higher. */
459
 
        char verify_alg[0];
460
 
} __attribute((packed));
461
 
 
462
 
struct Drbd_SyncParam89_Packet {
463
 
        struct Drbd_Header head;
464
 
        u32 rate;
465
 
        /* protocol version 89: */
466
 
        char verify_alg[SHARED_SECRET_MAX];
467
 
        char csums_alg[SHARED_SECRET_MAX];
468
 
} __attribute((packed));
469
 
 
470
 
struct Drbd_Protocol_Packet {
471
 
        struct Drbd_Header head;
472
 
        u32 protocol;
473
 
        u32 after_sb_0p;
474
 
        u32 after_sb_1p;
475
 
        u32 after_sb_2p;
476
 
        u32 want_lose;
477
 
        u32 two_primaries;
478
 
 
479
 
              /* Since protocol version 87 and higher. */
480
 
        char integrity_alg[0];
481
 
 
482
 
} __attribute((packed));
483
 
 
484
 
struct Drbd_GenCnt_Packet {
485
 
        struct Drbd_Header head;
486
 
        u64 uuid[EXT_UUID_SIZE];
487
 
} __attribute((packed));
488
 
 
489
 
struct Drbd_SyncUUID_Packet {
490
 
        struct Drbd_Header head;
491
 
        u64         uuid;
492
 
} __attribute((packed));
493
 
 
494
 
struct Drbd_Sizes_Packet {
495
 
        struct Drbd_Header head;
496
 
        u64         d_size;  /* size of disk */
497
 
        u64         u_size;  /* user requested size */
498
 
        u64         c_size;  /* current exported size */
499
 
        u32         max_segment_size;  /* Maximal size of a BIO */
500
 
        u32         queue_order_type;
501
 
} __attribute((packed));
502
 
 
503
 
struct Drbd_State_Packet {
504
 
        struct Drbd_Header head;
505
 
        u32         state;
506
 
} __attribute((packed));
507
 
 
508
 
struct Drbd_Req_State_Packet {
509
 
        struct Drbd_Header head;
510
 
        u32         mask;
511
 
        u32         val;
512
 
} __attribute((packed));
513
 
 
514
 
struct Drbd_RqS_Reply_Packet {
515
 
        struct Drbd_Header head;
516
 
        u32         retcode;
517
 
} __attribute((packed));
518
 
 
519
 
struct Drbd06_Parameter_P {
520
 
        u64       size;
521
 
        u32       state;
522
 
        u32       blksize;
523
 
        u32       protocol;
524
 
        u32       version;
525
 
        u32       gen_cnt[5];
526
 
        u32       bit_map_gen[5];
527
 
} __attribute((packed));
528
 
 
529
 
struct Drbd_Discard_Packet {
530
 
        struct Drbd_Header head;
531
 
        u64         block_id;
532
 
        u32         seq_num;
533
 
        u32         pad;
534
 
} __attribute((packed));
535
 
 
536
 
/* Valid values for the encoding field.
537
 
 * Bump proto version when changing this. */
538
 
enum Drbd_bitmap_code {
539
 
        RLE_VLI_Bytes = 0,
540
 
        RLE_VLI_BitsFibD_0_1 = 1,
541
 
        RLE_VLI_BitsFibD_1_1 = 2,
542
 
        RLE_VLI_BitsFibD_1_2 = 3,
543
 
        RLE_VLI_BitsFibD_2_3 = 4,
544
 
        RLE_VLI_BitsFibD_3_5 = 5,
545
 
};
546
 
 
547
 
struct Drbd_Compressed_Bitmap_Packet {
548
 
        struct Drbd_Header head;
549
 
        /* (encoding & 0x0f): actual encoding, see enum Drbd_bitmap_code
550
 
         * (encoding & 0x80): polarity (set/unset) of first runlength
551
 
         * ((encoding >> 4) & 0x07): pad_bits, number of trailing zero bits
552
 
         * used to pad up to head.length bytes
553
 
         */
554
 
        u8 encoding;
555
 
 
556
 
        u8 code[0];
557
 
} __attribute((packed));
558
 
 
559
 
static inline enum Drbd_bitmap_code
560
 
DCBP_get_code(struct Drbd_Compressed_Bitmap_Packet *p)
561
 
{
562
 
        return (enum Drbd_bitmap_code)(p->encoding & 0x0f);
563
 
}
564
 
 
565
 
static inline void
566
 
DCBP_set_code(struct Drbd_Compressed_Bitmap_Packet *p, enum Drbd_bitmap_code code)
567
 
{
568
 
        BUG_ON(code & ~0xf);
569
 
        p->encoding = (p->encoding & ~0xf) | code;
570
 
}
571
 
 
572
 
static inline int
573
 
DCBP_get_start(struct Drbd_Compressed_Bitmap_Packet *p)
574
 
{
575
 
        return (p->encoding & 0x80) != 0;
576
 
}
577
 
 
578
 
static inline void
579
 
DCBP_set_start(struct Drbd_Compressed_Bitmap_Packet *p, int set)
580
 
{
581
 
        p->encoding = (p->encoding & ~0x80) | (set ? 0x80 : 0);
582
 
}
583
 
 
584
 
static inline int
585
 
DCBP_get_pad_bits(struct Drbd_Compressed_Bitmap_Packet *p)
586
 
{
587
 
        return (p->encoding >> 4) & 0x7;
588
 
}
589
 
 
590
 
static inline void
591
 
DCBP_set_pad_bits(struct Drbd_Compressed_Bitmap_Packet *p, int n)
592
 
{
593
 
        BUG_ON(n & ~0x7);
594
 
        p->encoding = (p->encoding & (~0x7 << 4)) | (n << 4);
595
 
}
596
 
 
597
 
/* one bitmap packet, including the Drbd_Header,
598
 
 * should fit within one _architecture independend_ page.
599
 
 * so we need to use the fixed size 4KiB page size
600
 
 * most architechtures have used for a long time.
601
 
 */
602
 
#define BM_PACKET_PAYLOAD_BYTES (4096 - sizeof(struct Drbd_Header))
603
 
#define BM_PACKET_WORDS (BM_PACKET_PAYLOAD_BYTES/sizeof(long))
604
 
#define BM_PACKET_VLI_BYTES_MAX (4096 - sizeof(struct Drbd_Compressed_Bitmap_Packet))
605
 
#if (PAGE_SIZE < 4096)
606
 
/* drbd_send_bitmap / receive_bitmap would break horribly */
607
 
#error "PAGE_SIZE too small"
608
 
#endif
609
 
 
610
 
union Drbd_Polymorph_Packet {
611
 
        struct Drbd_Header              head;
612
 
        struct Drbd_HandShake_Packet    HandShake;
613
 
        struct Drbd_Data_Packet         Data;
614
 
        struct Drbd_BlockAck_Packet     BlockAck;
615
 
        struct Drbd_Barrier_Packet      Barrier;
616
 
        struct Drbd_BarrierAck_Packet   BarrierAck;
617
 
        struct Drbd_SyncParam89_Packet  SyncParam89;
618
 
        struct Drbd_Protocol_Packet     Protocol;
619
 
        struct Drbd_Sizes_Packet        Sizes;
620
 
        struct Drbd_GenCnt_Packet       GenCnt;
621
 
        struct Drbd_State_Packet        State;
622
 
        struct Drbd_Req_State_Packet    ReqState;
623
 
        struct Drbd_RqS_Reply_Packet    RqSReply;
624
 
        struct Drbd_BlockRequest_Packet BlockRequest;
625
 
} __attribute((packed));
626
 
 
627
 
/**********************************************************************/
628
 
enum Drbd_thread_state {
629
 
        None,
630
 
        Running,
631
 
        Exiting,
632
 
        Restarting
633
 
};
634
 
 
635
 
struct Drbd_thread {
636
 
        spinlock_t t_lock;
637
 
        struct task_struct *task;
638
 
        struct completion stop;
639
 
        enum Drbd_thread_state t_state;
640
 
        int (*function) (struct Drbd_thread *);
641
 
        struct drbd_conf *mdev;
642
 
        int reset_cpu_mask;
643
 
};
644
 
 
645
 
static inline enum Drbd_thread_state get_t_state(struct Drbd_thread *thi)
646
 
{
647
 
        /* THINK testing the t_state seems to be uncritical in all cases
648
 
         * (but thread_{start,stop}), so we can read it *without* the lock.
649
 
         *      --lge */
650
 
 
651
 
        smp_rmb();
652
 
        return thi->t_state;
653
 
}
654
 
 
655
 
 
656
 
/*
657
 
 * Having this as the first member of a struct provides sort of "inheritance".
658
 
 * "derived" structs can be "drbd_queue_work()"ed.
659
 
 * The callback should know and cast back to the descendant struct.
660
 
 * drbd_request and Tl_epoch_entry are descendants of drbd_work.
661
 
 */
662
 
struct drbd_work;
663
 
typedef int (*drbd_work_cb)(struct drbd_conf *, struct drbd_work *, int cancel);
664
 
struct drbd_work {
665
 
        struct list_head list;
666
 
        drbd_work_cb cb;
667
 
};
668
 
 
669
 
struct drbd_barrier;
670
 
struct drbd_request {
671
 
        struct drbd_work w;
672
 
        struct drbd_conf *mdev;
673
 
        struct bio *private_bio;
674
 
        struct hlist_node colision;
675
 
        sector_t sector;
676
 
        unsigned int size;
677
 
        unsigned int epoch; /* barrier_nr */
678
 
 
679
 
        /* barrier_nr: used to check on "completion" whether this req was in
680
 
         * the current epoch, and we therefore have to close it,
681
 
         * starting a new epoch...
682
 
         */
683
 
 
684
 
        /* up to here, the struct layout is identical to Tl_epoch_entry;
685
 
         * we might be able to use that to our advantage...  */
686
 
 
687
 
        struct list_head tl_requests; /* ring list in the transfer log */
688
 
        struct bio *master_bio;       /* master bio pointer */
689
 
        unsigned long rq_state; /* see comments above _req_mod() */
690
 
        int seq_num;
691
 
        unsigned long start_time;
692
 
};
693
 
 
694
 
struct drbd_barrier {
695
 
        struct drbd_work w;
696
 
        struct list_head requests; /* requests before */
697
 
        struct drbd_barrier *next; /* pointer to the next barrier */
698
 
        unsigned int br_number;  /* the barriers identifier. */
699
 
        int n_req;      /* number of requests attached before this barrier */
700
 
};
701
 
 
702
 
struct drbd_request;
703
 
 
704
 
/* These Tl_epoch_entries may be in one of 6 lists:
705
 
   active_ee .. data packet being written
706
 
   sync_ee   .. syncer block being written
707
 
   done_ee   .. block written, need to send WriteAck
708
 
   read_ee   .. [RS]DataRequest being read
709
 
*/
710
 
 
711
 
struct drbd_epoch {
712
 
        struct list_head list;
713
 
        unsigned int barrier_nr;
714
 
        atomic_t epoch_size; /* increased on every request added. */
715
 
        atomic_t active;     /* increased on every req. added, and dec on every finished. */
716
 
        unsigned long flags;
717
 
};
718
 
 
719
 
/* drbd_epoch flag bits */
720
 
enum {
721
 
        DE_BARRIER_IN_NEXT_EPOCH_ISSUED,
722
 
        DE_BARRIER_IN_NEXT_EPOCH_DONE,
723
 
        DE_CONTAINS_A_BARRIER,
724
 
        DE_HAVE_BARRIER_NUMBER,
725
 
        DE_IS_FINISHING,
726
 
};
727
 
 
728
 
struct Tl_epoch_entry {
729
 
        struct drbd_work    w;
730
 
        struct drbd_conf *mdev;
731
 
        struct bio *private_bio;
732
 
        struct hlist_node colision;
733
 
        sector_t sector;
734
 
        unsigned int size;
735
 
        struct drbd_epoch *epoch;
736
 
 
737
 
        /* up to here, the struct layout is identical to drbd_request;
738
 
         * we might be able to use that to our advantage...  */
739
 
 
740
 
        unsigned int flags;
741
 
        u64    block_id;
742
 
};
743
 
 
744
 
struct digest_info {
745
 
        int digest_size;
746
 
        void *digest;
747
 
};
748
 
 
749
 
/* ee flag bits */
750
 
enum {
751
 
        __EE_CALL_AL_COMPLETE_IO,
752
 
        __EE_CONFLICT_PENDING,
753
 
        __EE_MAY_SET_IN_SYNC,
754
 
        __EE_IS_BARRIER,
755
 
};
756
 
#define EE_CALL_AL_COMPLETE_IO (1<<__EE_CALL_AL_COMPLETE_IO)
757
 
#define EE_CONFLICT_PENDING    (1<<__EE_CONFLICT_PENDING)
758
 
#define EE_MAY_SET_IN_SYNC     (1<<__EE_MAY_SET_IN_SYNC)
759
 
#define EE_IS_BARRIER          (1<<__EE_IS_BARRIER)
760
 
 
761
 
/* global flag bits */
762
 
enum {
763
 
        CREATE_BARRIER,         /* next Data is preceeded by a Barrier */
764
 
        SIGNAL_ASENDER,         /* whether asender wants to be interrupted */
765
 
        SEND_PING,              /* whether asender should send a ping asap */
766
 
        WORK_PENDING,           /* completion flag for drbd_disconnect */
767
 
        STOP_SYNC_TIMER,        /* tell timer to cancel itself */
768
 
        UNPLUG_QUEUED,          /* only relevant with kernel 2.4 */
769
 
        UNPLUG_REMOTE,          /* sending a "UnplugRemote" could help */
770
 
        MD_DIRTY,               /* current uuids and flags not yet on disk */
771
 
        DISCARD_CONCURRENT,     /* Set on one node, cleared on the peer! */
772
 
        USE_DEGR_WFC_T,         /* degr-wfc-timeout instead of wfc-timeout. */
773
 
        CLUSTER_ST_CHANGE,      /* Cluster wide state change going on... */
774
 
        CL_ST_CHG_SUCCESS,
775
 
        CL_ST_CHG_FAIL,
776
 
        CRASHED_PRIMARY,        /* This node was a crashed primary.
777
 
                                 * Gets cleared when the state.conn
778
 
                                 * goes into Connected state. */
779
 
        WRITE_BM_AFTER_RESYNC,  /* A kmalloc() during resync failed */
780
 
        NO_BARRIER_SUPP,        /* underlying block device doesn't implement barriers */
781
 
        CONSIDER_RESYNC,
782
 
 
783
 
        MD_NO_BARRIER,          /* meta data device does not support barriers,
784
 
                                   so don't even try */
785
 
        SUSPEND_IO,             /* suspend application io */
786
 
        BITMAP_IO,              /* suspend application io;
787
 
                                   once no more io in flight, start bitmap io */
788
 
        BITMAP_IO_QUEUED,       /* Started bitmap IO */
789
 
        RESYNC_AFTER_NEG,       /* Resync after online grow after the attach&negotiate finished. */
790
 
        NET_CONGESTED,          /* The data socket is congested */
791
 
};
792
 
 
793
 
struct drbd_bitmap; /* opaque for drbd_conf */
794
 
 
795
 
/* TODO sort members for performance
796
 
 * MAYBE group them further */
797
 
 
798
 
/* THINK maybe we actually want to use the default "event/%s" worker threads
799
 
 * or similar in linux 2.6, which uses per cpu data and threads.
800
 
 *
801
 
 * To be general, this might need a spin_lock member.
802
 
 * For now, please use the mdev->req_lock to protect list_head,
803
 
 * see drbd_queue_work below.
804
 
 */
805
 
struct drbd_work_queue {
806
 
        struct list_head q;
807
 
        struct semaphore s; /* producers up it, worker down()s it */
808
 
        spinlock_t q_lock;  /* to protect the list. */
809
 
};
810
 
 
811
 
struct drbd_socket {
812
 
        struct drbd_work_queue work;
813
 
        struct mutex mutex;
814
 
        struct socket    *socket;
815
 
        /* this way we get our
816
 
         * send/receive buffers off the stack */
817
 
        union Drbd_Polymorph_Packet sbuf;
818
 
        union Drbd_Polymorph_Packet rbuf;
819
 
};
820
 
 
821
 
struct drbd_md {
822
 
        u64 md_offset;          /* sector offset to 'super' block */
823
 
 
824
 
        u64 la_size_sect;       /* last agreed size, unit sectors */
825
 
        u64 uuid[UUID_SIZE];
826
 
        u64 device_uuid;
827
 
        u32 flags;
828
 
        u32 md_size_sect;
829
 
 
830
 
        s32 al_offset;  /* signed relative sector offset to al area */
831
 
        s32 bm_offset;  /* signed relative sector offset to bitmap */
832
 
 
833
 
        /* u32 al_nr_extents;      important for restoring the AL
834
 
         * is stored into  sync_conf.al_extents, which in turn
835
 
         * gets applied to act_log->nr_elements
836
 
         */
837
 
};
838
 
 
839
 
/* for sync_conf and other types... */
840
 
#define NL_PACKET(name, number, fields) struct name { fields };
841
 
#define NL_INTEGER(pn,pr,member) int member;
842
 
#define NL_INT64(pn,pr,member) __u64 member;
843
 
#define NL_BIT(pn,pr,member)   unsigned member:1;
844
 
#define NL_STRING(pn,pr,member,len) unsigned char member[len]; int member ## _len;
845
 
#include "linux/drbd_nl.h"
846
 
 
847
 
struct drbd_backing_dev {
848
 
        struct block_device *backing_bdev;
849
 
        struct block_device *md_bdev;
850
 
        struct file *lo_file;
851
 
        struct file *md_file;
852
 
        struct drbd_md md;
853
 
        struct disk_conf dc; /* The user provided config... */
854
 
        sector_t known_size; /* last known size of that backing device */
855
 
};
856
 
 
857
 
struct drbd_md_io {
858
 
        struct drbd_conf *mdev;
859
 
        struct completion event;
860
 
        int error;
861
 
};
862
 
 
863
 
struct bm_io_work {
864
 
        struct drbd_work w;
865
 
        char *why;
866
 
        int (*io_fn)(struct drbd_conf *mdev);
867
 
        void (*done)(struct drbd_conf *mdev, int rv);
868
 
};
869
 
 
870
 
enum write_ordering_e {
871
 
        WO_none,
872
 
        WO_drain_io,
873
 
        WO_bdev_flush,
874
 
        WO_bio_barrier
875
 
};
876
 
 
877
 
struct drbd_conf {
878
 
        /* things that are stored as / read from meta data on disk */
879
 
        unsigned long flags;
880
 
 
881
 
        /* configured by drbdsetup */
882
 
        struct net_conf *net_conf; /* protected by inc_net() and dec_net() */
883
 
        struct syncer_conf sync_conf;
884
 
        struct drbd_backing_dev *bc __protected_by(local);
885
 
 
886
 
        sector_t p_size;     /* partner's disk size */
887
 
        struct request_queue *rq_queue;
888
 
        struct block_device *this_bdev;
889
 
        struct gendisk      *vdisk;
890
 
 
891
 
        struct drbd_socket data; /* data/barrier/cstate/parameter packets */
892
 
        struct drbd_socket meta; /* ping/ack (metadata) packets */
893
 
        int agreed_pro_version;  /* actually used protocol version */
894
 
        unsigned long last_received; /* in jiffies, either socket */
895
 
        unsigned int ko_count;
896
 
        struct drbd_work  resync_work,
897
 
                          unplug_work,
898
 
                          md_sync_work;
899
 
        struct timer_list resync_timer;
900
 
        struct timer_list md_sync_timer;
901
 
 
902
 
        /* Used after attach while negotiating new disk state. */
903
 
        union drbd_state_t new_state_tmp;
904
 
 
905
 
        union drbd_state_t state;
906
 
        wait_queue_head_t misc_wait;
907
 
        wait_queue_head_t state_wait;  /* upon each state change. */
908
 
        unsigned int send_cnt;
909
 
        unsigned int recv_cnt;
910
 
        unsigned int read_cnt;
911
 
        unsigned int writ_cnt;
912
 
        unsigned int al_writ_cnt;
913
 
        unsigned int bm_writ_cnt;
914
 
        atomic_t ap_bio_cnt;     /* Requests we need to complete */
915
 
        atomic_t ap_pending_cnt; /* AP data packets on the wire, ack expected */
916
 
        atomic_t rs_pending_cnt; /* RS request/data packets on the wire */
917
 
        atomic_t unacked_cnt;    /* Need to send replys for */
918
 
        atomic_t local_cnt;      /* Waiting for local completion */
919
 
        atomic_t net_cnt;        /* Users of net_conf */
920
 
        spinlock_t req_lock;
921
 
        struct drbd_barrier *unused_spare_barrier; /* for pre-allocation */
922
 
        struct drbd_barrier *newest_barrier;
923
 
        struct drbd_barrier *oldest_barrier;
924
 
        struct list_head out_of_sequence_requests;
925
 
        struct hlist_head *tl_hash;
926
 
        unsigned int tl_hash_s;
927
 
 
928
 
        /* blocks to sync in this run [unit BM_BLOCK_SIZE] */
929
 
        unsigned long rs_total;
930
 
        /* number of sync IOs that failed in this run */
931
 
        unsigned long rs_failed;
932
 
        /* Syncer's start time [unit jiffies] */
933
 
        unsigned long rs_start;
934
 
        /* cumulated time in PausedSyncX state [unit jiffies] */
935
 
        unsigned long rs_paused;
936
 
        /* block not up-to-date at mark [unit BM_BLOCK_SIZE] */
937
 
        unsigned long rs_mark_left;
938
 
        /* marks's time [unit jiffies] */
939
 
        unsigned long rs_mark_time;
940
 
        /* skipped because csum was equeal [unit BM_BLOCK_SIZE] */
941
 
        unsigned long rs_same_csum;
942
 
        sector_t ov_position;
943
 
        /* Start sector of out of sync range. */
944
 
        sector_t ov_last_oos_start;
945
 
        /* size of out-of-sync range in sectors. */
946
 
        sector_t ov_last_oos_size;
947
 
        unsigned long ov_left;
948
 
        struct crypto_hash *csums_tfm;
949
 
        struct crypto_hash *verify_tfm;
950
 
 
951
 
        struct Drbd_thread receiver;
952
 
        struct Drbd_thread worker;
953
 
        struct Drbd_thread asender;
954
 
        struct drbd_bitmap *bitmap;
955
 
        unsigned long bm_resync_fo; /* bit offset for drbd_bm_find_next */
956
 
 
957
 
        /* Used to track operations of resync... */
958
 
        struct lru_cache *resync;
959
 
        /* Number of locked elements in resync LRU */
960
 
        unsigned int resync_locked;
961
 
        /* resync extent number waiting for application requests */
962
 
        unsigned int resync_wenr;
963
 
 
964
 
        int open_cnt;
965
 
        u64 *p_uuid;
966
 
        struct drbd_epoch *current_epoch;
967
 
        spinlock_t epoch_lock;
968
 
        unsigned int epochs;
969
 
        enum write_ordering_e write_ordering;
970
 
        struct list_head active_ee; /* IO in progress */
971
 
        struct list_head sync_ee;   /* IO in progress */
972
 
        struct list_head done_ee;   /* send ack */
973
 
        struct list_head read_ee;   /* IO in progress */
974
 
        struct list_head net_ee;    /* zero-copy network send in progress */
975
 
        struct hlist_head *ee_hash; /* is proteced by req_lock! */
976
 
        unsigned int ee_hash_s;
977
 
 
978
 
        /* this one is protected by ee_lock, single thread */
979
 
        struct Tl_epoch_entry *last_write_w_barrier;
980
 
 
981
 
        int next_barrier_nr;
982
 
        struct hlist_head *app_reads_hash; /* is proteced by req_lock */
983
 
        struct list_head resync_reads;
984
 
        atomic_t pp_in_use;
985
 
        wait_queue_head_t ee_wait;
986
 
        struct page *md_io_page;        /* one page buffer for md_io */
987
 
        struct page *md_io_tmpp;        /* for hardsect != 512 [s390 only?] */
988
 
        struct mutex md_io_mutex;       /* protects the md_io_buffer */
989
 
        spinlock_t al_lock;
990
 
        wait_queue_head_t al_wait;
991
 
        struct lru_cache *act_log;      /* activity log */
992
 
        unsigned int al_tr_number;
993
 
        int al_tr_cycle;
994
 
        int al_tr_pos;   /* position of the next transaction in the journal */
995
 
        struct crypto_hash *cram_hmac_tfm;
996
 
        struct crypto_hash *integrity_w_tfm; /* to be used by the worker thread */
997
 
        struct crypto_hash *integrity_r_tfm; /* to be used by the receiver thread */
998
 
        void *int_dig_out;
999
 
        void *int_dig_in;
1000
 
        void *int_dig_vv;
1001
 
        wait_queue_head_t seq_wait;
1002
 
        atomic_t packet_seq;
1003
 
        unsigned int peer_seq;
1004
 
        spinlock_t peer_seq_lock;
1005
 
        unsigned int minor;
1006
 
        unsigned long comm_bm_set; /* communicated number of set bits. */
1007
 
        cpumask_t cpu_mask;
1008
 
        struct bm_io_work bm_io_work;
1009
 
        u64 ed_uuid; /* UUID of the exposed data */
1010
 
        struct mutex state_mutex;
1011
 
        char congestion_reason;  /* Why we where congested... */
1012
 
};
1013
 
 
1014
 
static inline struct drbd_conf *minor_to_mdev(unsigned int minor)
1015
 
{
1016
 
        struct drbd_conf *mdev;
1017
 
 
1018
 
        mdev = minor < minor_count ? minor_table[minor] : NULL;
1019
 
 
1020
 
        return mdev;
1021
 
}
1022
 
 
1023
 
static inline unsigned int mdev_to_minor(struct drbd_conf *mdev)
1024
 
{
1025
 
        return mdev->minor;
1026
 
}
1027
 
 
1028
 
/* returns 1 if it was successfull,
1029
 
 * returns 0 if there was no data socket.
1030
 
 * so wherever you are going to use the data.socket, e.g. do
1031
 
 * if (!drbd_get_data_sock(mdev))
1032
 
 *      return 0;
1033
 
 *      CODE();
1034
 
 * drbd_put_data_sock(mdev);
1035
 
 */
1036
 
static inline int drbd_get_data_sock(struct drbd_conf *mdev)
1037
 
{
1038
 
        mutex_lock(&mdev->data.mutex);
1039
 
        /* drbd_disconnect() could have called drbd_free_sock()
1040
 
         * while we were waiting in down()... */
1041
 
        if (unlikely(mdev->data.socket == NULL)) {
1042
 
                mutex_unlock(&mdev->data.mutex);
1043
 
                return 0;
1044
 
        }
1045
 
        return 1;
1046
 
}
1047
 
 
1048
 
static inline void drbd_put_data_sock(struct drbd_conf *mdev)
1049
 
{
1050
 
        mutex_unlock(&mdev->data.mutex);
1051
 
}
1052
 
 
1053
 
/*
1054
 
 * function declarations
1055
 
 *************************/
1056
 
 
1057
 
/* drbd_main.c */
1058
 
 
1059
 
enum chg_state_flags {
1060
 
        ChgStateHard    = 1,
1061
 
        ChgStateVerbose = 2,
1062
 
        ChgWaitComplete = 4,
1063
 
        ChgSerialize    = 8,
1064
 
        ChgOrdered      = ChgWaitComplete + ChgSerialize,
1065
 
};
1066
 
 
1067
 
extern void drbd_init_set_defaults(struct drbd_conf *mdev);
1068
 
extern int drbd_change_state(struct drbd_conf *mdev, enum chg_state_flags f,
1069
 
                        union drbd_state_t mask, union drbd_state_t val);
1070
 
extern void drbd_force_state(struct drbd_conf *, union drbd_state_t,
1071
 
                        union drbd_state_t);
1072
 
extern int _drbd_request_state(struct drbd_conf *, union drbd_state_t,
1073
 
                        union drbd_state_t, enum chg_state_flags);
1074
 
extern int __drbd_set_state(struct drbd_conf *, union drbd_state_t,
1075
 
                            enum chg_state_flags, struct completion *done);
1076
 
extern void print_st_err(struct drbd_conf *, union drbd_state_t,
1077
 
                        union drbd_state_t, int);
1078
 
extern int  drbd_thread_start(struct Drbd_thread *thi);
1079
 
extern void _drbd_thread_stop(struct Drbd_thread *thi, int restart, int wait);
1080
 
#ifdef CONFIG_SMP
1081
 
extern void drbd_thread_current_set_cpu(struct drbd_conf *mdev);
1082
 
extern cpumask_t drbd_calc_cpu_mask(struct drbd_conf *mdev);
1083
 
#else
1084
 
#define drbd_thread_current_set_cpu(A) ({})
1085
 
#define drbd_calc_cpu_mask(A) CPU_MASK_ALL
1086
 
#endif
1087
 
extern void drbd_free_resources(struct drbd_conf *mdev);
1088
 
extern void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr,
1089
 
                       unsigned int set_size);
1090
 
extern void tl_clear(struct drbd_conf *mdev);
1091
 
extern void _tl_add_barrier(struct drbd_conf *, struct drbd_barrier *);
1092
 
extern void drbd_free_sock(struct drbd_conf *mdev);
1093
 
extern int drbd_send(struct drbd_conf *mdev, struct socket *sock,
1094
 
                        void *buf, size_t size, unsigned msg_flags);
1095
 
extern int drbd_send_protocol(struct drbd_conf *mdev);
1096
 
extern int _drbd_send_uuids(struct drbd_conf *mdev);
1097
 
extern int drbd_send_uuids(struct drbd_conf *mdev);
1098
 
extern int drbd_send_sync_uuid(struct drbd_conf *mdev, u64 val);
1099
 
extern int drbd_send_sizes(struct drbd_conf *mdev);
1100
 
extern int _drbd_send_state(struct drbd_conf *mdev);
1101
 
extern int drbd_send_state(struct drbd_conf *mdev);
1102
 
extern int _drbd_send_cmd(struct drbd_conf *mdev, struct socket *sock,
1103
 
                        enum Drbd_Packet_Cmd cmd, struct Drbd_Header *h,
1104
 
                        size_t size, unsigned msg_flags);
1105
 
#define USE_DATA_SOCKET 1
1106
 
#define USE_META_SOCKET 0
1107
 
extern int drbd_send_cmd(struct drbd_conf *mdev, int use_data_socket,
1108
 
                        enum Drbd_Packet_Cmd cmd, struct Drbd_Header *h,
1109
 
                        size_t size);
1110
 
extern int drbd_send_cmd2(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1111
 
                        char *data, size_t size);
1112
 
extern int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc);
1113
 
extern int drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr,
1114
 
                        u32 set_size);
1115
 
extern int drbd_send_ack(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1116
 
                        struct Tl_epoch_entry *e);
1117
 
extern int drbd_send_ack_rp(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1118
 
                        struct Drbd_BlockRequest_Packet *rp);
1119
 
extern int drbd_send_ack_dp(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1120
 
                        struct Drbd_Data_Packet *dp);
1121
 
extern int drbd_send_ack_ex(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1122
 
                            sector_t sector, int blksize, u64 block_id);
1123
 
extern int _drbd_send_page(struct drbd_conf *mdev, struct page *page,
1124
 
                        int offset, size_t size);
1125
 
extern int drbd_send_block(struct drbd_conf *mdev, enum Drbd_Packet_Cmd cmd,
1126
 
                           struct Tl_epoch_entry *e);
1127
 
extern int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req);
1128
 
extern int _drbd_send_barrier(struct drbd_conf *mdev,
1129
 
                        struct drbd_barrier *barrier);
1130
 
extern int drbd_send_drequest(struct drbd_conf *mdev, int cmd,
1131
 
                              sector_t sector, int size, u64 block_id);
1132
 
extern int drbd_send_drequest_csum(struct drbd_conf *mdev,
1133
 
                                   sector_t sector,int size,
1134
 
                                   void *digest, int digest_size,
1135
 
                                   enum Drbd_Packet_Cmd cmd);
1136
 
extern int drbd_send_ov_request(struct drbd_conf *mdev,sector_t sector,int size);
1137
 
 
1138
 
extern int drbd_send_bitmap(struct drbd_conf *mdev);
1139
 
extern int _drbd_send_bitmap(struct drbd_conf *mdev);
1140
 
extern int drbd_send_sr_reply(struct drbd_conf *mdev, int retcode);
1141
 
extern void drbd_free_bc(struct drbd_backing_dev *bc);
1142
 
extern int drbd_io_error(struct drbd_conf *mdev, int forcedetach);
1143
 
extern void drbd_mdev_cleanup(struct drbd_conf *mdev);
1144
 
 
1145
 
/* drbd_meta-data.c (still in drbd_main.c) */
1146
 
extern void drbd_md_sync(struct drbd_conf *mdev);
1147
 
extern int  drbd_md_read(struct drbd_conf *mdev, struct drbd_backing_dev *bdev);
1148
 
/* maybe define them below as inline? */
1149
 
extern void drbd_uuid_set(struct drbd_conf *mdev, int idx, u64 val) __must_hold(local);
1150
 
extern void _drbd_uuid_set(struct drbd_conf *mdev, int idx, u64 val) __must_hold(local);
1151
 
extern void drbd_uuid_new_current(struct drbd_conf *mdev) __must_hold(local);
1152
 
extern void _drbd_uuid_new_current(struct drbd_conf *mdev) __must_hold(local);
1153
 
extern void drbd_uuid_set_bm(struct drbd_conf *mdev, u64 val) __must_hold(local);
1154
 
extern void drbd_md_set_flag(struct drbd_conf *mdev, int flags) __must_hold(local);
1155
 
extern void drbd_md_clear_flag(struct drbd_conf *mdev, int flags)__must_hold(local);
1156
 
extern int drbd_md_test_flag(struct drbd_backing_dev *, int);
1157
 
extern void drbd_md_mark_dirty(struct drbd_conf *mdev);
1158
 
extern void drbd_queue_bitmap_io(struct drbd_conf *mdev,
1159
 
                                 int (*io_fn)(struct drbd_conf *),
1160
 
                                 void (*done)(struct drbd_conf *, int),
1161
 
                                 char *why);
1162
 
extern int drbd_bmio_set_n_write(struct drbd_conf *mdev);
1163
 
extern int drbd_bmio_clear_n_write(struct drbd_conf *mdev);
1164
 
extern int drbd_bitmap_io(struct drbd_conf *mdev, int (*io_fn)(struct drbd_conf *), char *why);
1165
 
 
1166
 
 
1167
 
/* Meta data layout
1168
 
   We reserve a 128MB Block (4k aligned)
1169
 
   * either at the end of the backing device
1170
 
   * or on a seperate meta data device. */
1171
 
 
1172
 
#define MD_RESERVED_SECT (128LU << 11)  /* 128 MB, unit sectors */
1173
 
/* The following numbers are sectors */
1174
 
#define MD_AL_OFFSET 8      /* 8 Sectors after start of meta area */
1175
 
#define MD_AL_MAX_SIZE 64   /* = 32 kb LOG  ~ 3776 extents ~ 14 GB Storage */
1176
 
/* Allows up to about 3.8TB */
1177
 
#define MD_BM_OFFSET (MD_AL_OFFSET + MD_AL_MAX_SIZE)
1178
 
 
1179
 
/* Since the smalles IO unit is usually 512 byte */
1180
 
#define MD_HARDSECT_B    9
1181
 
#define MD_HARDSECT      (1<<MD_HARDSECT_B)
1182
 
 
1183
 
/* activity log */
1184
 
#define AL_EXTENTS_PT ((MD_HARDSECT-12)/8-1) /* 61 ; Extents per 512B sector */
1185
 
#define AL_EXTENT_SIZE_B 22              /* One extent represents 4M Storage */
1186
 
#define AL_EXTENT_SIZE (1<<AL_EXTENT_SIZE_B)
1187
 
 
1188
 
#if BITS_PER_LONG == 32
1189
 
#define LN2_BPL 5
1190
 
#define cpu_to_lel(A) cpu_to_le32(A)
1191
 
#define lel_to_cpu(A) le32_to_cpu(A)
1192
 
#elif BITS_PER_LONG == 64
1193
 
#define LN2_BPL 6
1194
 
#define cpu_to_lel(A) cpu_to_le64(A)
1195
 
#define lel_to_cpu(A) le64_to_cpu(A)
1196
 
#else
1197
 
#error "LN2 of BITS_PER_LONG unknown!"
1198
 
#endif
1199
 
 
1200
 
/* resync bitmap */
1201
 
/* 16MB sized 'bitmap extent' to track syncer usage */
1202
 
struct bm_extent {
1203
 
        struct lc_element lce;
1204
 
        int rs_left; /* number of bits set (out of sync) in this extent. */
1205
 
        int rs_failed; /* number of failed resync requests in this extent. */
1206
 
        unsigned long flags;
1207
 
};
1208
 
 
1209
 
#define BME_NO_WRITES  0  /* bm_extent.flags: no more requests on this one! */
1210
 
#define BME_LOCKED     1  /* bm_extent.flags: syncer active on this one. */
1211
 
 
1212
 
/* drbd_bitmap.c */
1213
 
/*
1214
 
 * We need to store one bit for a block.
1215
 
 * Example: 1GB disk @ 4096 byte blocks ==> we need 32 KB bitmap.
1216
 
 * Bit 0 ==> local node thinks this block is binary identical on both nodes
1217
 
 * Bit 1 ==> local node thinks this block needs to be synced.
1218
 
 */
1219
 
 
1220
 
#define BM_BLOCK_SIZE_B  12                      /* 4k per bit */
1221
 
#define BM_BLOCK_SIZE    (1<<BM_BLOCK_SIZE_B)
1222
 
/* (9+3) : 512 bytes @ 8 bits; representing 16M storage
1223
 
 * per sector of on disk bitmap */
1224
 
#define BM_EXT_SIZE_B    (BM_BLOCK_SIZE_B + MD_HARDSECT_B + 3)  /* = 24 */
1225
 
#define BM_EXT_SIZE      (1<<BM_EXT_SIZE_B)
1226
 
 
1227
 
#if (BM_EXT_SIZE_B != 24) || (BM_BLOCK_SIZE_B != 12)
1228
 
#error "HAVE YOU FIXED drbdmeta AS WELL??"
1229
 
#endif
1230
 
 
1231
 
/* thus many _storage_ sectors are described by one bit */
1232
 
#define BM_SECT_TO_BIT(x)   ((x)>>(BM_BLOCK_SIZE_B-9))
1233
 
#define BM_BIT_TO_SECT(x)   ((sector_t)(x)<<(BM_BLOCK_SIZE_B-9))
1234
 
#define BM_SECT_PER_BIT     BM_BIT_TO_SECT(1)
1235
 
 
1236
 
/* bit to represented kilo byte conversion */
1237
 
#define Bit2KB(bits) ((bits)<<(BM_BLOCK_SIZE_B-10))
1238
 
 
1239
 
/* in which _bitmap_ extent (resp. sector) the bit for a certain
1240
 
 * _storage_ sector is located in */
1241
 
#define BM_SECT_TO_EXT(x)   ((x)>>(BM_EXT_SIZE_B-9))
1242
 
 
1243
 
/* how much _storage_ sectors we have per bitmap sector */
1244
 
#define BM_EXT_TO_SECT(x)   ((sector_t)(x) << (BM_EXT_SIZE_B-9))
1245
 
#define BM_SECT_PER_EXT     BM_EXT_TO_SECT(1)
1246
 
 
1247
 
/* in one sector of the bitmap, we have this many activity_log extents. */
1248
 
#define AL_EXT_PER_BM_SECT  (1 << (BM_EXT_SIZE_B - AL_EXTENT_SIZE_B))
1249
 
#define BM_WORDS_PER_AL_EXT (1 << (AL_EXTENT_SIZE_B-BM_BLOCK_SIZE_B-LN2_BPL))
1250
 
 
1251
 
#define BM_BLOCKS_PER_BM_EXT_B (BM_EXT_SIZE_B - BM_BLOCK_SIZE_B)
1252
 
#define BM_BLOCKS_PER_BM_EXT_MASK  ((1<<BM_BLOCKS_PER_BM_EXT_B) - 1)
1253
 
 
1254
 
/* the extent in "PER_EXTENT" below is an activity log extent
1255
 
 * we need that many (long words/bytes) to store the bitmap
1256
 
 *                   of one AL_EXTENT_SIZE chunk of storage.
1257
 
 * we can store the bitmap for that many AL_EXTENTS within
1258
 
 * one sector of the _on_disk_ bitmap:
1259
 
 * bit   0        bit 37   bit 38            bit (512*8)-1
1260
 
 *           ...|........|........|.. // ..|........|
1261
 
 * sect. 0       `296     `304                     ^(512*8*8)-1
1262
 
 *
1263
 
#define BM_WORDS_PER_EXT    ( (AL_EXT_SIZE/BM_BLOCK_SIZE) / BITS_PER_LONG )
1264
 
#define BM_BYTES_PER_EXT    ( (AL_EXT_SIZE/BM_BLOCK_SIZE) / 8 )  // 128
1265
 
#define BM_EXT_PER_SECT     ( 512 / BM_BYTES_PER_EXTENT )        //   4
1266
 
 */
1267
 
 
1268
 
#define DRBD_MAX_SECTORS_32 (0xffffffffLU)
1269
 
#define DRBD_MAX_SECTORS_BM \
1270
 
          ((MD_RESERVED_SECT - MD_BM_OFFSET) * (1LL<<(BM_EXT_SIZE_B-9)))
1271
 
#if DRBD_MAX_SECTORS_BM < DRBD_MAX_SECTORS_32
1272
 
#define DRBD_MAX_SECTORS      DRBD_MAX_SECTORS_BM
1273
 
#define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_BM
1274
 
#elif !defined(CONFIG_LBD) && BITS_PER_LONG == 32
1275
 
#define DRBD_MAX_SECTORS      DRBD_MAX_SECTORS_32
1276
 
#define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32
1277
 
#else
1278
 
#define DRBD_MAX_SECTORS      DRBD_MAX_SECTORS_BM
1279
 
/* 16 TB in units of sectors */
1280
 
#if BITS_PER_LONG == 32
1281
 
/* adjust by one page worth of bitmap,
1282
 
 * so we won't wrap around in drbd_bm_find_next_bit.
1283
 
 * you should use 64bit OS for that much storage, anyways. */
1284
 
#define DRBD_MAX_SECTORS_FLEX BM_BIT_TO_SECT(0xffff7fff)
1285
 
#else
1286
 
#define DRBD_MAX_SECTORS_FLEX BM_BIT_TO_SECT(0x1LU << 32)
1287
 
#endif
1288
 
#endif
1289
 
 
1290
 
/* Sector shift value for the "hash" functions of tl_hash and ee_hash tables.
1291
 
 * With a value of 6 all IO in one 32K block make it to the same slot of the
1292
 
 * hash table. */
1293
 
#define HT_SHIFT 6
1294
 
#define DRBD_MAX_SEGMENT_SIZE (1U<<(9+HT_SHIFT))
1295
 
 
1296
 
/* Number of elements in the app_reads_hash */
1297
 
#define APP_R_HSIZE 15
1298
 
 
1299
 
extern int  drbd_bm_init(struct drbd_conf *mdev);
1300
 
extern int  drbd_bm_resize(struct drbd_conf *mdev, sector_t sectors);
1301
 
extern void drbd_bm_cleanup(struct drbd_conf *mdev);
1302
 
extern void drbd_bm_set_all(struct drbd_conf *mdev);
1303
 
extern void drbd_bm_clear_all(struct drbd_conf *mdev);
1304
 
extern int  drbd_bm_set_bits(
1305
 
                struct drbd_conf *mdev, unsigned long s, unsigned long e);
1306
 
extern int  drbd_bm_clear_bits(
1307
 
                struct drbd_conf *mdev, unsigned long s, unsigned long e);
1308
 
/* bm_set_bits variant for use while holding drbd_bm_lock */
1309
 
extern int _drbd_bm_set_bits(struct drbd_conf *mdev,
1310
 
                const unsigned long s, const unsigned long e);
1311
 
extern int  drbd_bm_test_bit(struct drbd_conf *mdev, unsigned long bitnr);
1312
 
extern int  drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr);
1313
 
extern int  drbd_bm_write_sect(struct drbd_conf *mdev, unsigned long enr) __must_hold(local);
1314
 
extern int  drbd_bm_read(struct drbd_conf *mdev) __must_hold(local);
1315
 
extern int  drbd_bm_write(struct drbd_conf *mdev) __must_hold(local);
1316
 
extern unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev,
1317
 
                unsigned long al_enr);
1318
 
extern size_t        drbd_bm_words(struct drbd_conf *mdev);
1319
 
extern unsigned long drbd_bm_bits(struct drbd_conf *mdev);
1320
 
extern sector_t      drbd_bm_capacity(struct drbd_conf *mdev);
1321
 
extern unsigned long drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo);
1322
 
/* bm_find_next variants for use while you hold drbd_bm_lock() */
1323
 
extern unsigned long _drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo);
1324
 
extern unsigned long _drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo);
1325
 
extern unsigned long drbd_bm_total_weight(struct drbd_conf *mdev);
1326
 
extern int drbd_bm_rs_done(struct drbd_conf *mdev);
1327
 
/* for receive_bitmap */
1328
 
extern void drbd_bm_merge_lel(struct drbd_conf *mdev, size_t offset,
1329
 
                size_t number, unsigned long *buffer);
1330
 
/* for _drbd_send_bitmap and drbd_bm_write_sect */
1331
 
extern void drbd_bm_get_lel(struct drbd_conf *mdev, size_t offset,
1332
 
                size_t number, unsigned long *buffer);
1333
 
 
1334
 
extern void drbd_bm_lock(struct drbd_conf *mdev, char *why);
1335
 
extern void drbd_bm_unlock(struct drbd_conf *mdev);
1336
 
 
1337
 
extern void _drbd_bm_recount_bits(struct drbd_conf *mdev, char *file, int line);
1338
 
#define drbd_bm_recount_bits(mdev) \
1339
 
        _drbd_bm_recount_bits(mdev, __FILE__, __LINE__)
1340
 
extern int drbd_bm_count_bits(struct drbd_conf *mdev, const unsigned long s, const unsigned long e);
1341
 
/* drbd_main.c */
1342
 
 
1343
 
extern struct kmem_cache *drbd_request_cache;
1344
 
extern struct kmem_cache *drbd_ee_cache;
1345
 
extern mempool_t *drbd_request_mempool;
1346
 
extern mempool_t *drbd_ee_mempool;
1347
 
 
1348
 
extern struct page *drbd_pp_pool; /* drbd's page pool */
1349
 
extern spinlock_t   drbd_pp_lock;
1350
 
extern int          drbd_pp_vacant;
1351
 
extern wait_queue_head_t drbd_pp_wait;
1352
 
 
1353
 
extern rwlock_t global_state_lock;
1354
 
 
1355
 
extern struct drbd_conf *drbd_new_device(unsigned int minor);
1356
 
extern void drbd_free_mdev(struct drbd_conf *mdev);
1357
 
 
1358
 
/* Dynamic tracing framework */
1359
 
#ifdef ENABLE_DYNAMIC_TRACE
1360
 
 
1361
 
extern int proc_details;
1362
 
extern int trace_type;
1363
 
extern int trace_devs;
1364
 
extern int trace_level;
1365
 
 
1366
 
enum {
1367
 
        TraceLvlAlways = 0,
1368
 
        TraceLvlSummary,
1369
 
        TraceLvlMetrics,
1370
 
        TraceLvlAll,
1371
 
        TraceLvlMax
1372
 
};
1373
 
 
1374
 
enum {
1375
 
        TraceTypePacket = 0x00000001,
1376
 
        TraceTypeRq     = 0x00000002,
1377
 
        TraceTypeUuid   = 0x00000004,
1378
 
        TraceTypeResync = 0x00000008,
1379
 
        TraceTypeEE     = 0x00000010,
1380
 
        TraceTypeUnplug = 0x00000020,
1381
 
        TraceTypeNl     = 0x00000040,
1382
 
        TraceTypeALExts = 0x00000080,
1383
 
        TraceTypeIntRq  = 0x00000100,
1384
 
        TraceTypeMDIO   = 0x00000200,
1385
 
        TraceTypeEpochs = 0x00000400,
1386
 
};
1387
 
 
1388
 
static inline int
1389
 
is_trace(unsigned int type, unsigned int level) {
1390
 
        return (trace_level >= level) && (type & trace_type);
1391
 
}
1392
 
static inline int
1393
 
is_mdev_trace(struct drbd_conf *mdev, unsigned int type, unsigned int level) {
1394
 
        return is_trace(type, level) &&
1395
 
                ((1 << mdev_to_minor(mdev)) & trace_devs);
1396
 
}
1397
 
 
1398
 
#define MTRACE(type, lvl, code...) \
1399
 
do { \
1400
 
        if (unlikely(is_mdev_trace(mdev, type, lvl))) { \
1401
 
                code \
1402
 
        } \
1403
 
} while (0)
1404
 
 
1405
 
#define TRACE(type, lvl, code...) \
1406
 
do { \
1407
 
        if (unlikely(is_trace(type, lvl))) { \
1408
 
                code \
1409
 
        } \
1410
 
} while (0)
1411
 
 
1412
 
/* Buffer printing support
1413
 
 * dbg_print_flags: used for Flags arg to drbd_print_buffer
1414
 
 * - DBGPRINT_BUFFADDR; if set, each line starts with the
1415
 
 *       virtual address of the line being output. If clear,
1416
 
 *       each line starts with the offset from the beginning
1417
 
 *       of the buffer. */
1418
 
enum dbg_print_flags {
1419
 
    DBGPRINT_BUFFADDR = 0x0001,
1420
 
};
1421
 
 
1422
 
extern void drbd_print_uuid(struct drbd_conf *mdev, unsigned int idx);
1423
 
 
1424
 
extern void drbd_print_buffer(const char *prefix, unsigned int flags, int size,
1425
 
                              const void *buffer, const void *buffer_va,
1426
 
                              unsigned int length);
1427
 
 
1428
 
/* Bio printing support */
1429
 
extern void _dump_bio(const char *pfx, struct drbd_conf *mdev, struct bio *bio, int complete, struct drbd_request *r);
1430
 
 
1431
 
static inline void dump_bio(struct drbd_conf *mdev,
1432
 
                struct bio *bio, int complete, struct drbd_request *r)
1433
 
{
1434
 
        MTRACE(TraceTypeRq, TraceLvlSummary,
1435
 
               _dump_bio("Rq", mdev, bio, complete, r);
1436
 
                );
1437
 
}
1438
 
 
1439
 
static inline void dump_internal_bio(const char *pfx, struct drbd_conf *mdev, struct bio *bio, int complete)
1440
 
{
1441
 
        MTRACE(TraceTypeIntRq, TraceLvlSummary,
1442
 
               _dump_bio(pfx, mdev, bio, complete, NULL);
1443
 
                );
1444
 
}
1445
 
 
1446
 
/* Packet dumping support */
1447
 
extern void _dump_packet(struct drbd_conf *mdev, struct socket *sock,
1448
 
                         int recv, union Drbd_Polymorph_Packet *p,
1449
 
                         char *file, int line);
1450
 
 
1451
 
static inline void
1452
 
dump_packet(struct drbd_conf *mdev, struct socket *sock,
1453
 
            int recv, union Drbd_Polymorph_Packet *p, char *file, int line)
1454
 
{
1455
 
        MTRACE(TraceTypePacket, TraceLvlSummary,
1456
 
               _dump_packet(mdev, sock, recv, p, file, line);
1457
 
                );
1458
 
}
1459
 
 
1460
 
#else
1461
 
 
1462
 
#define MTRACE(ignored...) ((void)0)
1463
 
#define TRACE(ignored...) ((void)0)
1464
 
 
1465
 
#define dump_bio(ignored...) ((void)0)
1466
 
#define dump_internal_bio(ignored...) ((void)0)
1467
 
#define dump_packet(ignored...) ((void)0)
1468
 
#endif
1469
 
 
1470
 
/* drbd_req */
1471
 
extern int drbd_make_request_26(struct request_queue *q, struct bio *bio);
1472
 
extern int drbd_read_remote(struct drbd_conf *mdev, struct drbd_request *req);
1473
 
extern int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec);
1474
 
extern int is_valid_ar_handle(struct drbd_request *, sector_t);
1475
 
 
1476
 
 
1477
 
/* drbd_nl.c */
1478
 
extern void drbd_suspend_io(struct drbd_conf *mdev);
1479
 
extern void drbd_resume_io(struct drbd_conf *mdev);
1480
 
extern char *ppsize(char *buf, unsigned long long size);
1481
 
extern sector_t drbd_new_dev_size(struct drbd_conf *,
1482
 
                struct drbd_backing_dev *);
1483
 
enum determin_dev_size_enum { dev_size_error = -1, unchanged = 0, shrunk = 1, grew = 2 };
1484
 
extern enum determin_dev_size_enum drbd_determin_dev_size(struct drbd_conf *) __must_hold(local);
1485
 
extern void resync_after_online_grow(struct drbd_conf *);
1486
 
extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local);
1487
 
extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role,
1488
 
                int force);
1489
 
enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev);
1490
 
extern int drbd_khelper(struct drbd_conf *mdev, char *cmd);
1491
 
 
1492
 
/* drbd_worker.c */
1493
 
extern int drbd_worker(struct Drbd_thread *thi);
1494
 
extern void drbd_alter_sa(struct drbd_conf *mdev, int na);
1495
 
extern void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side);
1496
 
extern void resume_next_sg(struct drbd_conf *mdev);
1497
 
extern void suspend_other_sg(struct drbd_conf *mdev);
1498
 
extern int drbd_resync_finished(struct drbd_conf *mdev);
1499
 
/* maybe rather drbd_main.c ? */
1500
 
extern int drbd_md_sync_page_io(struct drbd_conf *mdev,
1501
 
                struct drbd_backing_dev *bdev, sector_t sector, int rw);
1502
 
extern void drbd_ov_oos_found(struct drbd_conf*, sector_t, int);
1503
 
 
1504
 
static inline void ov_oos_print(struct drbd_conf *mdev)
1505
 
{
1506
 
        if (mdev->ov_last_oos_size) {
1507
 
                ERR("Out of sync: start=%llu, size=%lu (sectors)\n",
1508
 
                     (unsigned long long)mdev->ov_last_oos_start,
1509
 
                     (unsigned long)mdev->ov_last_oos_size);
1510
 
        }
1511
 
        mdev->ov_last_oos_size=0;
1512
 
}
1513
 
 
1514
 
 
1515
 
void drbd_csum(struct drbd_conf *, struct crypto_hash *, struct bio *, void *);
1516
 
/* worker callbacks */
1517
 
extern int w_req_cancel_conflict(struct drbd_conf *, struct drbd_work *, int);
1518
 
extern int w_read_retry_remote(struct drbd_conf *, struct drbd_work *, int);
1519
 
extern int w_e_end_data_req(struct drbd_conf *, struct drbd_work *, int);
1520
 
extern int w_e_end_rsdata_req(struct drbd_conf *, struct drbd_work *, int);
1521
 
extern int w_e_end_csum_rs_req(struct drbd_conf *, struct drbd_work *, int);
1522
 
extern int w_e_end_ov_reply(struct drbd_conf *, struct drbd_work *, int);
1523
 
extern int w_e_end_ov_req(struct drbd_conf *, struct drbd_work *, int);
1524
 
extern int w_ov_finished(struct drbd_conf *, struct drbd_work *, int);
1525
 
extern int w_resync_inactive(struct drbd_conf *, struct drbd_work *, int);
1526
 
extern int w_resume_next_sg(struct drbd_conf *, struct drbd_work *, int);
1527
 
extern int w_io_error(struct drbd_conf *, struct drbd_work *, int);
1528
 
extern int w_send_write_hint(struct drbd_conf *, struct drbd_work *, int);
1529
 
extern int w_make_resync_request(struct drbd_conf *, struct drbd_work *, int);
1530
 
extern int w_send_dblock(struct drbd_conf *, struct drbd_work *, int);
1531
 
extern int w_send_barrier(struct drbd_conf *, struct drbd_work *, int);
1532
 
extern int w_send_read_req(struct drbd_conf *, struct drbd_work *, int);
1533
 
extern int w_prev_work_done(struct drbd_conf *, struct drbd_work *, int);
1534
 
extern int w_e_reissue(struct drbd_conf *, struct drbd_work *, int);
1535
 
 
1536
 
extern void resync_timer_fn(unsigned long data);
1537
 
 
1538
 
/* drbd_receiver.c */
1539
 
extern int drbd_release_ee(struct drbd_conf *mdev, struct list_head *list);
1540
 
extern struct Tl_epoch_entry *drbd_alloc_ee(struct drbd_conf *mdev,
1541
 
                                            u64 id,
1542
 
                                            sector_t sector,
1543
 
                                            unsigned int data_size,
1544
 
                                            gfp_t gfp_mask) __must_hold(local);
1545
 
extern void drbd_free_ee(struct drbd_conf *mdev, struct Tl_epoch_entry *e);
1546
 
extern void drbd_wait_ee_list_empty(struct drbd_conf *mdev,
1547
 
                struct list_head *head);
1548
 
extern void _drbd_wait_ee_list_empty(struct drbd_conf *mdev,
1549
 
                struct list_head *head);
1550
 
extern void drbd_set_recv_tcq(struct drbd_conf *mdev, int tcq_enabled);
1551
 
extern void _drbd_clear_done_ee(struct drbd_conf *mdev);
1552
 
 
1553
 
/* yes, there is kernel_setsockopt, but only since 2.6.18. we don't need to
1554
 
 * mess with get_fs/set_fs, we know we are KERNEL_DS always. */
1555
 
static inline int drbd_setsockopt(struct socket *sock, int level, int optname,
1556
 
                        char __user *optval, int optlen)
1557
 
{
1558
 
        int err;
1559
 
        if (level == SOL_SOCKET)
1560
 
                err = sock_setsockopt(sock, level, optname, optval, optlen);
1561
 
        else
1562
 
                err = sock->ops->setsockopt(sock, level, optname, optval,
1563
 
                                            optlen);
1564
 
        return err;
1565
 
}
1566
 
 
1567
 
static inline void drbd_tcp_cork(struct socket *sock)
1568
 
{
1569
 
        int __user val = 1;
1570
 
        (void) drbd_setsockopt(sock, SOL_TCP, TCP_CORK,
1571
 
                        (char __user *)&val, sizeof(val));
1572
 
}
1573
 
 
1574
 
static inline void drbd_tcp_uncork(struct socket *sock)
1575
 
{
1576
 
        int __user val = 0;
1577
 
        (void) drbd_setsockopt(sock, SOL_TCP, TCP_CORK,
1578
 
                        (char __user *)&val, sizeof(val));
1579
 
}
1580
 
 
1581
 
static inline void drbd_tcp_nodelay(struct socket *sock)
1582
 
{
1583
 
        int __user val = 1;
1584
 
        (void) drbd_setsockopt(sock, SOL_TCP, TCP_NODELAY,
1585
 
                        (char __user *)&val, sizeof(val));
1586
 
}
1587
 
 
1588
 
static inline void drbd_tcp_quickack(struct socket *sock)
1589
 
{
1590
 
        int __user val = 1;
1591
 
        (void) drbd_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
1592
 
                        (char __user *)&val, sizeof(val));
1593
 
}
1594
 
 
1595
 
void drbd_bump_write_ordering(struct drbd_conf *mdev, enum write_ordering_e wo);
1596
 
 
1597
 
/* drbd_proc.c */
1598
 
extern struct proc_dir_entry *drbd_proc;
1599
 
extern struct file_operations drbd_proc_fops;
1600
 
extern const char *conns_to_name(enum drbd_conns s);
1601
 
extern const char *roles_to_name(enum drbd_role s);
1602
 
 
1603
 
/* drbd_actlog.c */
1604
 
extern void drbd_al_begin_io(struct drbd_conf *mdev, sector_t sector);
1605
 
extern void drbd_al_complete_io(struct drbd_conf *mdev, sector_t sector);
1606
 
extern void drbd_rs_complete_io(struct drbd_conf *mdev, sector_t sector);
1607
 
extern int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector);
1608
 
extern int drbd_try_rs_begin_io(struct drbd_conf *mdev, sector_t sector);
1609
 
extern void drbd_rs_cancel_all(struct drbd_conf *mdev);
1610
 
extern int drbd_rs_del_all(struct drbd_conf *mdev);
1611
 
extern void drbd_rs_failed_io(struct drbd_conf *mdev,
1612
 
                sector_t sector, int size);
1613
 
extern int drbd_al_read_log(struct drbd_conf *mdev, struct drbd_backing_dev *);
1614
 
extern void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector,
1615
 
                int size, const char *file, const unsigned int line);
1616
 
#define drbd_set_in_sync(mdev, sector, size) \
1617
 
        __drbd_set_in_sync(mdev, sector, size, __FILE__, __LINE__)
1618
 
extern void __drbd_set_out_of_sync(struct drbd_conf *mdev, sector_t sector,
1619
 
                int size, const char *file, const unsigned int line);
1620
 
#define drbd_set_out_of_sync(mdev, sector, size) \
1621
 
        __drbd_set_out_of_sync(mdev, sector, size, __FILE__, __LINE__)
1622
 
extern void drbd_al_apply_to_bm(struct drbd_conf *mdev);
1623
 
extern void drbd_al_to_on_disk_bm(struct drbd_conf *mdev);
1624
 
extern void drbd_al_shrink(struct drbd_conf *mdev);
1625
 
 
1626
 
 
1627
 
/* drbd_nl.c */
1628
 
 
1629
 
void drbd_nl_cleanup(void);
1630
 
int __init drbd_nl_init(void);
1631
 
void drbd_bcast_state(struct drbd_conf *mdev, union drbd_state_t);
1632
 
void drbd_bcast_sync_progress(struct drbd_conf *mdev);
1633
 
void drbd_bcast_ee(struct drbd_conf *mdev,
1634
 
                const char *reason, const int dgs,
1635
 
                const char* seen_hash, const char* calc_hash,
1636
 
                const struct Tl_epoch_entry* e);
1637
 
 
1638
 
 
1639
 
/** DRBD State macros:
1640
 
 * These macros are used to express state changes in easily readable form.
1641
 
 *
1642
 
 * The NS macros expand to a mask and a value, that can be bit ored onto the
1643
 
 * current state as soon as the spinlock (req_lock) was taken.
1644
 
 *
1645
 
 * The _NS macros are used for state functions that get called with the
1646
 
 * spinlock. These macros expand directly to the new state value.
1647
 
 *
1648
 
 * Besides the basic forms NS() and _NS() additional _?NS[23] are defined
1649
 
 * to express state changes that affect more than one aspect of the state.
1650
 
 *
1651
 
 * E.g. NS2(conn, Connected, peer, Secondary)
1652
 
 * Means that the network connection was established and that the peer
1653
 
 * is in secondary role.
1654
 
 */
1655
 
#define peer_mask role_mask
1656
 
#define pdsk_mask disk_mask
1657
 
#define susp_mask 1
1658
 
#define user_isp_mask 1
1659
 
#define aftr_isp_mask 1
1660
 
 
1661
 
#define NS(T, S) \
1662
 
        ({ union drbd_state_t mask; mask.i = 0; mask.T = T##_mask; mask; }), \
1663
 
        ({ union drbd_state_t val; val.i = 0; val.T = (S); val; })
1664
 
#define NS2(T1, S1, T2, S2) \
1665
 
        ({ union drbd_state_t mask; mask.i = 0; mask.T1 = T1##_mask; \
1666
 
          mask.T2 = T2##_mask; mask; }), \
1667
 
        ({ union drbd_state_t val; val.i = 0; val.T1 = (S1); \
1668
 
          val.T2 = (S2); val; })
1669
 
#define NS3(T1, S1, T2, S2, T3, S3) \
1670
 
        ({ union drbd_state_t mask; mask.i = 0; mask.T1 = T1##_mask; \
1671
 
          mask.T2 = T2##_mask; mask.T3 = T3##_mask; mask; }), \
1672
 
        ({ union drbd_state_t val;  val.i = 0; val.T1 = (S1); \
1673
 
          val.T2 = (S2); val.T3 = (S3); val; })
1674
 
 
1675
 
#define _NS(D, T, S) \
1676
 
        D, ({ union drbd_state_t __ns; __ns.i = D->state.i; __ns.T = (S); __ns; })
1677
 
#define _NS2(D, T1, S1, T2, S2) \
1678
 
        D, ({ union drbd_state_t __ns; __ns.i = D->state.i; __ns.T1 = (S1); \
1679
 
        __ns.T2 = (S2); __ns; })
1680
 
#define _NS3(D, T1, S1, T2, S2, T3, S3) \
1681
 
        D, ({ union drbd_state_t __ns; __ns.i = D->state.i; __ns.T1 = (S1); \
1682
 
        __ns.T2 = (S2); __ns.T3 = (S3); __ns; })
1683
 
 
1684
 
/*
1685
 
 * inline helper functions
1686
 
 *************************/
1687
 
 
1688
 
static inline void drbd_state_lock(struct drbd_conf *mdev)
1689
 
{
1690
 
        wait_event(mdev->misc_wait,
1691
 
                   !test_and_set_bit(CLUSTER_ST_CHANGE, &mdev->flags));
1692
 
}
1693
 
 
1694
 
static inline void drbd_state_unlock(struct drbd_conf *mdev)
1695
 
{
1696
 
        clear_bit(CLUSTER_ST_CHANGE, &mdev->flags);
1697
 
        wake_up(&mdev->misc_wait);
1698
 
}
1699
 
 
1700
 
static inline int _drbd_set_state(struct drbd_conf *mdev,
1701
 
                                   union drbd_state_t ns, enum chg_state_flags flags,
1702
 
                                   struct completion *done)
1703
 
{
1704
 
        int rv;
1705
 
 
1706
 
        read_lock(&global_state_lock);
1707
 
        rv = __drbd_set_state(mdev, ns, flags, done);
1708
 
        read_unlock(&global_state_lock);
1709
 
 
1710
 
        return rv;
1711
 
}
1712
 
 
1713
 
static inline int drbd_request_state(struct drbd_conf *mdev,
1714
 
                                     union drbd_state_t mask,
1715
 
                                     union drbd_state_t val)
1716
 
{
1717
 
        return _drbd_request_state(mdev, mask, val, ChgStateVerbose + ChgOrdered);
1718
 
}
1719
 
 
1720
 
/**
1721
 
 * drbd_chk_io_error: Handles the on_io_error setting, should be called from
1722
 
 * all io completion handlers. See also drbd_io_error().
1723
 
 */
1724
 
static inline void __drbd_chk_io_error(struct drbd_conf *mdev, int forcedetach)
1725
 
{
1726
 
        switch (mdev->bc->dc.on_io_error) {
1727
 
        case PassOn:
1728
 
                if (!forcedetach) {
1729
 
                        if (printk_ratelimit())
1730
 
                                ERR("Local IO failed. Passing error on...\n");
1731
 
                        break;
1732
 
                }
1733
 
                /* NOTE fall through to detach case if forcedetach set */
1734
 
        case Detach:
1735
 
        case CallIOEHelper:
1736
 
                if (mdev->state.disk > Failed) {
1737
 
                        _drbd_set_state(_NS(mdev, disk, Failed), ChgStateHard, NULL);
1738
 
                        ERR("Local IO failed. Detaching...\n");
1739
 
                }
1740
 
                break;
1741
 
        }
1742
 
}
1743
 
 
1744
 
static inline void drbd_chk_io_error(struct drbd_conf *mdev,
1745
 
        int error, int forcedetach)
1746
 
{
1747
 
        if (error) {
1748
 
                unsigned long flags;
1749
 
                spin_lock_irqsave(&mdev->req_lock, flags);
1750
 
                __drbd_chk_io_error(mdev, forcedetach);
1751
 
                spin_unlock_irqrestore(&mdev->req_lock, flags);
1752
 
        }
1753
 
}
1754
 
 
1755
 
/* Returns the first sector number of our meta data,
1756
 
 * which, for internal meta data, happens to be the maximum capacity
1757
 
 * we could agree upon with our peer
1758
 
 */
1759
 
static inline sector_t drbd_md_first_sector(struct drbd_backing_dev *bdev)
1760
 
{
1761
 
        switch (bdev->dc.meta_dev_idx) {
1762
 
        case DRBD_MD_INDEX_INTERNAL:
1763
 
        case DRBD_MD_INDEX_FLEX_INT:
1764
 
                return bdev->md.md_offset + bdev->md.bm_offset;
1765
 
        case DRBD_MD_INDEX_FLEX_EXT:
1766
 
        default:
1767
 
                return bdev->md.md_offset;
1768
 
        }
1769
 
}
1770
 
 
1771
 
/* returns the last sector number of our meta data,
1772
 
 * to be able to catch out of band md access */
1773
 
static inline sector_t drbd_md_last_sector(struct drbd_backing_dev *bdev)
1774
 
{
1775
 
        switch (bdev->dc.meta_dev_idx) {
1776
 
        case DRBD_MD_INDEX_INTERNAL:
1777
 
        case DRBD_MD_INDEX_FLEX_INT:
1778
 
                return bdev->md.md_offset + MD_AL_OFFSET - 1;
1779
 
        case DRBD_MD_INDEX_FLEX_EXT:
1780
 
        default:
1781
 
                return bdev->md.md_offset + bdev->md.md_size_sect;
1782
 
        }
1783
 
}
1784
 
 
1785
 
/* Returns the number of 512 byte sectors of the device */
1786
 
static inline sector_t drbd_get_capacity(struct block_device *bdev)
1787
 
{
1788
 
        /* return bdev ? get_capacity(bdev->bd_disk) : 0; */
1789
 
        return bdev ? bdev->bd_inode->i_size >> 9 : 0;
1790
 
}
1791
 
 
1792
 
/* returns the capacity we announce to out peer.
1793
 
 * we clip ourselves at the various MAX_SECTORS, because if we don't,
1794
 
 * current implementation will oops sooner or later */
1795
 
static inline sector_t drbd_get_max_capacity(struct drbd_backing_dev *bdev)
1796
 
{
1797
 
        sector_t s;
1798
 
        switch (bdev->dc.meta_dev_idx) {
1799
 
        case DRBD_MD_INDEX_INTERNAL:
1800
 
        case DRBD_MD_INDEX_FLEX_INT:
1801
 
                s = drbd_get_capacity(bdev->backing_bdev)
1802
 
                        ? min_t(sector_t, DRBD_MAX_SECTORS_FLEX,
1803
 
                                        drbd_md_first_sector(bdev))
1804
 
                        : 0;
1805
 
                break;
1806
 
        case DRBD_MD_INDEX_FLEX_EXT:
1807
 
                s = min_t(sector_t, DRBD_MAX_SECTORS_FLEX,
1808
 
                                drbd_get_capacity(bdev->backing_bdev));
1809
 
                /* clip at maximum size the meta device can support */
1810
 
                s = min_t(sector_t, s,
1811
 
                        BM_EXT_TO_SECT(bdev->md.md_size_sect
1812
 
                                     - bdev->md.bm_offset));
1813
 
                break;
1814
 
        default:
1815
 
                s = min_t(sector_t, DRBD_MAX_SECTORS,
1816
 
                                drbd_get_capacity(bdev->backing_bdev));
1817
 
        }
1818
 
        return s;
1819
 
}
1820
 
 
1821
 
/* returns the sector number of our meta data 'super' block */
1822
 
static inline sector_t drbd_md_ss__(struct drbd_conf *mdev,
1823
 
                                    struct drbd_backing_dev *bdev)
1824
 
{
1825
 
        switch (bdev->dc.meta_dev_idx) {
1826
 
        default: /* external, some index */
1827
 
                return MD_RESERVED_SECT * bdev->dc.meta_dev_idx;
1828
 
        case DRBD_MD_INDEX_INTERNAL:
1829
 
                /* with drbd08, internal meta data is always "flexible" */
1830
 
        case DRBD_MD_INDEX_FLEX_INT:
1831
 
                /* sizeof(struct md_on_disk_07) == 4k
1832
 
                 * position: last 4k aligned block of 4k size */
1833
 
                if (!bdev->backing_bdev) {
1834
 
                        if (__ratelimit(&drbd_ratelimit_state)) {
1835
 
                                ERR("bdev->backing_bdev==NULL\n");
1836
 
                                dump_stack();
1837
 
                        }
1838
 
                        return 0;
1839
 
                }
1840
 
                return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL)
1841
 
                        - MD_AL_OFFSET;
1842
 
        case DRBD_MD_INDEX_FLEX_EXT:
1843
 
                return 0;
1844
 
        }
1845
 
}
1846
 
 
1847
 
static inline void
1848
 
_drbd_queue_work(struct drbd_work_queue *q, struct drbd_work *w)
1849
 
{
1850
 
        list_add_tail(&w->list, &q->q);
1851
 
        up(&q->s);
1852
 
}
1853
 
 
1854
 
static inline void
1855
 
drbd_queue_work_front(struct drbd_work_queue *q, struct drbd_work *w)
1856
 
{
1857
 
        unsigned long flags;
1858
 
        spin_lock_irqsave(&q->q_lock, flags);
1859
 
        list_add(&w->list, &q->q);
1860
 
        up(&q->s); /* within the spinlock,
1861
 
                      see comment near end of drbd_worker() */
1862
 
        spin_unlock_irqrestore(&q->q_lock, flags);
1863
 
}
1864
 
 
1865
 
static inline void
1866
 
drbd_queue_work(struct drbd_work_queue *q, struct drbd_work *w)
1867
 
{
1868
 
        unsigned long flags;
1869
 
        spin_lock_irqsave(&q->q_lock, flags);
1870
 
        list_add_tail(&w->list, &q->q);
1871
 
        up(&q->s); /* within the spinlock,
1872
 
                      see comment near end of drbd_worker() */
1873
 
        spin_unlock_irqrestore(&q->q_lock, flags);
1874
 
}
1875
 
 
1876
 
static inline void wake_asender(struct drbd_conf *mdev)
1877
 
{
1878
 
        if (test_bit(SIGNAL_ASENDER, &mdev->flags))
1879
 
                force_sig(DRBD_SIG, mdev->asender.task);
1880
 
}
1881
 
 
1882
 
static inline void request_ping(struct drbd_conf *mdev)
1883
 
{
1884
 
        set_bit(SEND_PING, &mdev->flags);
1885
 
        wake_asender(mdev);
1886
 
}
1887
 
 
1888
 
static inline int drbd_send_short_cmd(struct drbd_conf *mdev,
1889
 
        enum Drbd_Packet_Cmd cmd)
1890
 
{
1891
 
        struct Drbd_Header h;
1892
 
        return drbd_send_cmd(mdev, USE_DATA_SOCKET, cmd, &h, sizeof(h));
1893
 
}
1894
 
 
1895
 
static inline int drbd_send_ping(struct drbd_conf *mdev)
1896
 
{
1897
 
        struct Drbd_Header h;
1898
 
        return drbd_send_cmd(mdev, USE_META_SOCKET, Ping, &h, sizeof(h));
1899
 
}
1900
 
 
1901
 
static inline int drbd_send_ping_ack(struct drbd_conf *mdev)
1902
 
{
1903
 
        struct Drbd_Header h;
1904
 
        return drbd_send_cmd(mdev, USE_META_SOCKET, PingAck, &h, sizeof(h));
1905
 
}
1906
 
 
1907
 
static inline void drbd_thread_stop(struct Drbd_thread *thi)
1908
 
{
1909
 
        _drbd_thread_stop(thi, FALSE, TRUE);
1910
 
}
1911
 
 
1912
 
static inline void drbd_thread_stop_nowait(struct Drbd_thread *thi)
1913
 
{
1914
 
        _drbd_thread_stop(thi, FALSE, FALSE);
1915
 
}
1916
 
 
1917
 
static inline void drbd_thread_restart_nowait(struct Drbd_thread *thi)
1918
 
{
1919
 
        _drbd_thread_stop(thi, TRUE, FALSE);
1920
 
}
1921
 
 
1922
 
/* counts how many answer packets packets we expect from our peer,
1923
 
 * for either explicit application requests,
1924
 
 * or implicit barrier packets as necessary.
1925
 
 * increased:
1926
 
 *  w_send_barrier
1927
 
 *  _req_mod(req, queue_for_net_write or queue_for_net_read);
1928
 
 *    it is much easier and equally valid to count what we queue for the
1929
 
 *    worker, even before it actually was queued or send.
1930
 
 *    (drbd_make_request_common; recovery path on read io-error)
1931
 
 * decreased:
1932
 
 *  got_BarrierAck (respective tl_clear, tl_clear_barrier)
1933
 
 *  _req_mod(req, data_received)
1934
 
 *     [from receive_DataReply]
1935
 
 *  _req_mod(req, write_acked_by_peer or recv_acked_by_peer or neg_acked)
1936
 
 *     [from got_BlockAck (WriteAck, RecvAck)]
1937
 
 *     for some reason it is NOT decreased in got_NegAck,
1938
 
 *     but in the resulting cleanup code from report_params.
1939
 
 *     we should try to remember the reason for that...
1940
 
 *  _req_mod(req, send_failed or send_canceled)
1941
 
 *  _req_mod(req, connection_lost_while_pending)
1942
 
 *     [from tl_clear_barrier]
1943
 
 */
1944
 
static inline void inc_ap_pending(struct drbd_conf *mdev)
1945
 
{
1946
 
        atomic_inc(&mdev->ap_pending_cnt);
1947
 
}
1948
 
 
1949
 
#define ERR_IF_CNT_IS_NEGATIVE(which)                           \
1950
 
        if (atomic_read(&mdev->which) < 0)                      \
1951
 
                ERR("in %s:%d: " #which " = %d < 0 !\n",        \
1952
 
                    __func__ , __LINE__ ,                       \
1953
 
                    atomic_read(&mdev->which))
1954
 
 
1955
 
#define dec_ap_pending(mdev)    do {                            \
1956
 
        typecheck(struct drbd_conf *, mdev);                    \
1957
 
        if (atomic_dec_and_test(&mdev->ap_pending_cnt))         \
1958
 
                wake_up(&mdev->misc_wait);                      \
1959
 
        ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt); } while (0)
1960
 
 
1961
 
/* counts how many resync-related answers we still expect from the peer
1962
 
 *                   increase                   decrease
1963
 
 * SyncTarget sends RSDataRequest (and expects RSDataReply)
1964
 
 * SyncSource sends RSDataReply   (and expects WriteAck whith ID_SYNCER)
1965
 
 *                                         (or NegAck with ID_SYNCER)
1966
 
 */
1967
 
static inline void inc_rs_pending(struct drbd_conf *mdev)
1968
 
{
1969
 
        atomic_inc(&mdev->rs_pending_cnt);
1970
 
}
1971
 
 
1972
 
#define dec_rs_pending(mdev)    do {                            \
1973
 
        typecheck(struct drbd_conf *, mdev);                    \
1974
 
        atomic_dec(&mdev->rs_pending_cnt);                      \
1975
 
        ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt); } while (0)
1976
 
 
1977
 
/* counts how many answers we still need to send to the peer.
1978
 
 * increased on
1979
 
 *  receive_Data        unless protocol A;
1980
 
 *                      we need to send a RecvAck (proto B)
1981
 
 *                      or WriteAck (proto C)
1982
 
 *  receive_RSDataReply (recv_resync_read) we need to send a WriteAck
1983
 
 *  receive_DataRequest (receive_RSDataRequest) we need to send back Data
1984
 
 *  receive_Barrier_*   we need to send a BarrierAck
1985
 
 */
1986
 
static inline void inc_unacked(struct drbd_conf *mdev)
1987
 
{
1988
 
        atomic_inc(&mdev->unacked_cnt);
1989
 
}
1990
 
 
1991
 
#define dec_unacked(mdev)       do {                            \
1992
 
        typecheck(struct drbd_conf *, mdev);                    \
1993
 
        atomic_dec(&mdev->unacked_cnt);                         \
1994
 
        ERR_IF_CNT_IS_NEGATIVE(unacked_cnt); } while (0)
1995
 
 
1996
 
#define sub_unacked(mdev, n)    do {                            \
1997
 
        typecheck(struct drbd_conf *, mdev);                    \
1998
 
        atomic_sub(n, &mdev->unacked_cnt);                      \
1999
 
        ERR_IF_CNT_IS_NEGATIVE(unacked_cnt); } while (0)
2000
 
 
2001
 
 
2002
 
static inline void dec_net(struct drbd_conf *mdev)
2003
 
{
2004
 
        if (atomic_dec_and_test(&mdev->net_cnt))
2005
 
                wake_up(&mdev->misc_wait);
2006
 
}
2007
 
 
2008
 
/**
2009
 
 * inc_net: Returns TRUE when it is ok to access mdev->net_conf. You
2010
 
 * should call dec_net() when finished looking at mdev->net_conf.
2011
 
 */
2012
 
static inline int inc_net(struct drbd_conf *mdev)
2013
 
{
2014
 
        int have_net_conf;
2015
 
 
2016
 
        atomic_inc(&mdev->net_cnt);
2017
 
        have_net_conf = mdev->state.conn >= Unconnected;
2018
 
        if (!have_net_conf)
2019
 
                dec_net(mdev);
2020
 
        return have_net_conf;
2021
 
}
2022
 
 
2023
 
/**
2024
 
 * inc_local: Returns TRUE when local IO is possible. If it returns
2025
 
 * TRUE you should call dec_local() after IO is completed.
2026
 
 */
2027
 
#define inc_local_if_state(M,MINS) __cond_lock(local, _inc_local_if_state(M,MINS))
2028
 
#define inc_local(M) __cond_lock(local, _inc_local_if_state(M,Inconsistent))
2029
 
 
2030
 
static inline void dec_local(struct drbd_conf *mdev)
2031
 
{
2032
 
        __release(local);
2033
 
        if (atomic_dec_and_test(&mdev->local_cnt))
2034
 
                wake_up(&mdev->misc_wait);
2035
 
        D_ASSERT(atomic_read(&mdev->local_cnt) >= 0);
2036
 
}
2037
 
 
2038
 
#ifndef __CHECKER__
2039
 
static inline int _inc_local_if_state(struct drbd_conf *mdev, enum drbd_disk_state mins)
2040
 
{
2041
 
        int io_allowed;
2042
 
 
2043
 
        atomic_inc(&mdev->local_cnt);
2044
 
        io_allowed = (mdev->state.disk >= mins);
2045
 
        if (!io_allowed)
2046
 
                dec_local(mdev);
2047
 
        return io_allowed;
2048
 
}
2049
 
#else
2050
 
extern int _inc_local_if_state(struct drbd_conf *mdev, enum drbd_disk_state mins);
2051
 
#endif
2052
 
 
2053
 
/* you must have an "inc_local" reference */
2054
 
static inline void drbd_get_syncer_progress(struct drbd_conf *mdev,
2055
 
                unsigned long *bits_left, unsigned int *per_mil_done)
2056
 
{
2057
 
        /*
2058
 
         * this is to break it at compile time when we change that
2059
 
         * (we may feel 4TB maximum storage per drbd is not enough)
2060
 
         */
2061
 
        typecheck(unsigned long, mdev->rs_total);
2062
 
 
2063
 
        /* note: both rs_total and rs_left are in bits, i.e. in
2064
 
         * units of BM_BLOCK_SIZE.
2065
 
         * for the percentage, we don't care. */
2066
 
 
2067
 
        *bits_left = drbd_bm_total_weight(mdev) - mdev->rs_failed;
2068
 
        /* >> 10 to prevent overflow,
2069
 
         * +1 to prevent division by zero */
2070
 
        if (*bits_left > mdev->rs_total) {
2071
 
                /* doh. maybe a logic bug somewhere.
2072
 
                 * may also be just a race condition
2073
 
                 * between this and a disconnect during sync.
2074
 
                 * for now, just prevent in-kernel buffer overflow.
2075
 
                 */
2076
 
                smp_rmb();
2077
 
                drbd_WARN("cs:%s rs_left=%lu > rs_total=%lu (rs_failed %lu)\n",
2078
 
                                conns_to_name(mdev->state.conn),
2079
 
                                *bits_left, mdev->rs_total, mdev->rs_failed);
2080
 
                *per_mil_done = 0;
2081
 
        } else {
2082
 
                /* make sure the calculation happens in long context */
2083
 
                unsigned long tmp = 1000UL -
2084
 
                                (*bits_left >> 10)*1000UL
2085
 
                                / ((mdev->rs_total >> 10) + 1UL);
2086
 
                *per_mil_done = tmp;
2087
 
        }
2088
 
}
2089
 
 
2090
 
 
2091
 
/* this throttles on-the-fly application requests
2092
 
 * according to max_buffers settings;
2093
 
 * maybe re-implement using semaphores? */
2094
 
static inline int drbd_get_max_buffers(struct drbd_conf *mdev)
2095
 
{
2096
 
        int mxb = 1000000; /* arbitrary limit on open requests */
2097
 
        if (inc_net(mdev)) {
2098
 
                mxb = mdev->net_conf->max_buffers;
2099
 
                dec_net(mdev);
2100
 
        }
2101
 
        return mxb;
2102
 
}
2103
 
 
2104
 
static inline int drbd_state_is_stable(union drbd_state_t s)
2105
 
{
2106
 
 
2107
 
        /* DO NOT add a default clause, we want the compiler to warn us
2108
 
         * for any newly introduced state we may have forgotten to add here */
2109
 
 
2110
 
        switch ((enum drbd_conns)s.conn) {
2111
 
        /* new io only accepted when there is no connection, ... */
2112
 
        case StandAlone:
2113
 
        case WFConnection:
2114
 
        /* ... or there is a well established connection. */
2115
 
        case Connected:
2116
 
        case SyncSource:
2117
 
        case SyncTarget:
2118
 
        case VerifyS:
2119
 
        case VerifyT:
2120
 
        case PausedSyncS:
2121
 
        case PausedSyncT:
2122
 
                /* maybe stable, look at the disk state */
2123
 
                break;
2124
 
 
2125
 
        /* no new io accepted during tansitional states
2126
 
         * like handshake or teardown */
2127
 
        case Disconnecting:
2128
 
        case Unconnected:
2129
 
        case Timeout:
2130
 
        case BrokenPipe:
2131
 
        case NetworkFailure:
2132
 
        case ProtocolError:
2133
 
        case TearDown:
2134
 
        case WFReportParams:
2135
 
        case StartingSyncS:
2136
 
        case StartingSyncT:
2137
 
        case WFBitMapS:
2138
 
        case WFBitMapT:
2139
 
        case WFSyncUUID:
2140
 
        case conn_mask:
2141
 
                /* not "stable" */
2142
 
                return 0;
2143
 
        }
2144
 
 
2145
 
        switch ((enum drbd_disk_state)s.disk) {
2146
 
        case Diskless:
2147
 
        case Inconsistent:
2148
 
        case Outdated:
2149
 
        case Consistent:
2150
 
        case UpToDate:
2151
 
                /* disk state is stable as well. */
2152
 
                break;
2153
 
 
2154
 
        /* no new io accepted during tansitional states */
2155
 
        case Attaching:
2156
 
        case Failed:
2157
 
        case Negotiating:
2158
 
        case DUnknown:
2159
 
        case disk_mask:
2160
 
                /* not "stable" */
2161
 
                return 0;
2162
 
        }
2163
 
 
2164
 
        return 1;
2165
 
}
2166
 
 
2167
 
static inline int __inc_ap_bio_cond(struct drbd_conf *mdev)
2168
 
{
2169
 
        int mxb = drbd_get_max_buffers(mdev);
2170
 
 
2171
 
        if (mdev->state.susp)
2172
 
                return 0;
2173
 
        if (test_bit(SUSPEND_IO, &mdev->flags))
2174
 
                return 0;
2175
 
 
2176
 
        /* to avoid potential deadlock or bitmap corruption,
2177
 
         * in various places, we only allow new application io
2178
 
         * to start during "stable" states. */
2179
 
 
2180
 
        /* no new io accepted when attaching or detaching the disk */
2181
 
        if (!drbd_state_is_stable(mdev->state))
2182
 
                return 0;
2183
 
 
2184
 
        /* since some older kernels don't have atomic_add_unless,
2185
 
         * and we are within the spinlock anyways, we have this workaround.  */
2186
 
        if (atomic_read(&mdev->ap_bio_cnt) > mxb)
2187
 
                return 0;
2188
 
        if (test_bit(BITMAP_IO, &mdev->flags))
2189
 
                return 0;
2190
 
        return 1;
2191
 
}
2192
 
 
2193
 
/* I'd like to use wait_event_lock_irq,
2194
 
 * but I'm not sure when it got introduced,
2195
 
 * and not sure when it has 3 or 4 arguments */
2196
 
static inline void inc_ap_bio(struct drbd_conf *mdev, int one_or_two)
2197
 
{
2198
 
        /* compare with after_state_ch,
2199
 
         * os.conn != WFBitMapS && ns.conn == WFBitMapS */
2200
 
        DEFINE_WAIT(wait);
2201
 
 
2202
 
        /* we wait here
2203
 
         *    as long as the device is suspended
2204
 
         *    until the bitmap is no longer on the fly during connection
2205
 
         *    handshake as long as we would exeed the max_buffer limit.
2206
 
         *
2207
 
         * to avoid races with the reconnect code,
2208
 
         * we need to atomic_inc within the spinlock. */
2209
 
 
2210
 
        spin_lock_irq(&mdev->req_lock);
2211
 
        while (!__inc_ap_bio_cond(mdev)) {
2212
 
                prepare_to_wait(&mdev->misc_wait, &wait, TASK_UNINTERRUPTIBLE);
2213
 
                spin_unlock_irq(&mdev->req_lock);
2214
 
                schedule();
2215
 
                finish_wait(&mdev->misc_wait, &wait);
2216
 
                spin_lock_irq(&mdev->req_lock);
2217
 
        }
2218
 
        atomic_add(one_or_two, &mdev->ap_bio_cnt);
2219
 
        spin_unlock_irq(&mdev->req_lock);
2220
 
}
2221
 
 
2222
 
static inline void dec_ap_bio(struct drbd_conf *mdev)
2223
 
{
2224
 
        int mxb = drbd_get_max_buffers(mdev);
2225
 
        int ap_bio = atomic_dec_return(&mdev->ap_bio_cnt);
2226
 
 
2227
 
        D_ASSERT(ap_bio >= 0);
2228
 
        /* this currently does wake_up for every dec_ap_bio!
2229
 
         * maybe rather introduce some type of hysteresis?
2230
 
         * e.g. (ap_bio == mxb/2 || ap_bio == 0) ? */
2231
 
        if (ap_bio < mxb)
2232
 
                wake_up(&mdev->misc_wait);
2233
 
        if (ap_bio == 0 && test_bit(BITMAP_IO, &mdev->flags)) {
2234
 
                if (!test_and_set_bit(BITMAP_IO_QUEUED, &mdev->flags))
2235
 
                        drbd_queue_work(&mdev->data.work, &mdev->bm_io_work.w);
2236
 
        }
2237
 
}
2238
 
 
2239
 
static inline void drbd_set_ed_uuid(struct drbd_conf *mdev, u64 val)
2240
 
{
2241
 
        mdev->ed_uuid = val;
2242
 
 
2243
 
        MTRACE(TraceTypeUuid, TraceLvlMetrics,
2244
 
               INFO(" exposed data uuid now %016llX\n",
2245
 
                    (unsigned long long)val);
2246
 
                );
2247
 
}
2248
 
 
2249
 
static inline int seq_cmp(u32 a, u32 b)
2250
 
{
2251
 
        /* we assume wrap around at 32bit.
2252
 
         * for wrap around at 24bit (old atomic_t),
2253
 
         * we'd have to
2254
 
         *  a <<= 8; b <<= 8;
2255
 
         */
2256
 
        return (s32)(a) - (s32)(b);
2257
 
}
2258
 
#define seq_lt(a, b) (seq_cmp((a), (b)) < 0)
2259
 
#define seq_gt(a, b) (seq_cmp((a), (b)) > 0)
2260
 
#define seq_ge(a, b) (seq_cmp((a), (b)) >= 0)
2261
 
#define seq_le(a, b) (seq_cmp((a), (b)) <= 0)
2262
 
/* CAUTION: please no side effects in arguments! */
2263
 
#define seq_max(a, b) ((u32)(seq_gt((a), (b)) ? (a) : (b)))
2264
 
 
2265
 
static inline void update_peer_seq(struct drbd_conf *mdev, unsigned int new_seq)
2266
 
{
2267
 
        unsigned int m;
2268
 
        spin_lock(&mdev->peer_seq_lock);
2269
 
        m = seq_max(mdev->peer_seq, new_seq);
2270
 
        mdev->peer_seq = m;
2271
 
        spin_unlock(&mdev->peer_seq_lock);
2272
 
        if (m == new_seq)
2273
 
                wake_up(&mdev->seq_wait);
2274
 
}
2275
 
 
2276
 
static inline void drbd_update_congested(struct drbd_conf *mdev)
2277
 
{
2278
 
        struct sock *sk = mdev->data.socket->sk;
2279
 
        if (sk->sk_wmem_queued > sk->sk_sndbuf * 4 / 5)
2280
 
                set_bit(NET_CONGESTED, &mdev->flags);
2281
 
}
2282
 
 
2283
 
static inline int drbd_queue_order_type(struct drbd_conf *mdev)
2284
 
{
2285
 
        /* sorry, we currently have no working implementation
2286
 
         * of distributed TCQ stuff */
2287
 
#ifndef QUEUE_ORDERED_NONE
2288
 
#define QUEUE_ORDERED_NONE 0
2289
 
#endif
2290
 
        return QUEUE_ORDERED_NONE;
2291
 
}
2292
 
 
2293
 
static inline void drbd_blk_run_queue(struct request_queue *q)
2294
 
{
2295
 
        if (q && q->unplug_fn)
2296
 
                q->unplug_fn(q);
2297
 
}
2298
 
 
2299
 
static inline void drbd_kick_lo(struct drbd_conf *mdev)
2300
 
{
2301
 
        if (inc_local(mdev)) {
2302
 
                drbd_blk_run_queue(bdev_get_queue(mdev->bc->backing_bdev));
2303
 
                dec_local(mdev);
2304
 
        }
2305
 
}
2306
 
 
2307
 
static inline void drbd_md_flush(struct drbd_conf *mdev)
2308
 
{
2309
 
        int r;
2310
 
 
2311
 
        if (test_bit(MD_NO_BARRIER, &mdev->flags))
2312
 
                return;
2313
 
 
2314
 
        r = blkdev_issue_flush(mdev->bc->md_bdev, NULL);
2315
 
        if (r) {
2316
 
                set_bit(MD_NO_BARRIER, &mdev->flags);
2317
 
                ERR("meta data flush failed with status %d, disabling md-flushes\n", r);
2318
 
        }
2319
 
}
2320
 
 
2321
 
#endif