1b411b363SPhilipp Reisner /* 2b411b363SPhilipp Reisner drbd_int.h 3b411b363SPhilipp Reisner 4b411b363SPhilipp Reisner This file is part of DRBD by Philipp Reisner and Lars Ellenberg. 5b411b363SPhilipp Reisner 6b411b363SPhilipp Reisner Copyright (C) 2001-2008, LINBIT Information Technologies GmbH. 7b411b363SPhilipp Reisner Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>. 8b411b363SPhilipp Reisner Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>. 9b411b363SPhilipp Reisner 10b411b363SPhilipp Reisner drbd is free software; you can redistribute it and/or modify 11b411b363SPhilipp Reisner it under the terms of the GNU General Public License as published by 12b411b363SPhilipp Reisner the Free Software Foundation; either version 2, or (at your option) 13b411b363SPhilipp Reisner any later version. 14b411b363SPhilipp Reisner 15b411b363SPhilipp Reisner drbd is distributed in the hope that it will be useful, 16b411b363SPhilipp Reisner but WITHOUT ANY WARRANTY; without even the implied warranty of 17b411b363SPhilipp Reisner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18b411b363SPhilipp Reisner GNU General Public License for more details. 19b411b363SPhilipp Reisner 20b411b363SPhilipp Reisner You should have received a copy of the GNU General Public License 21b411b363SPhilipp Reisner along with drbd; see the file COPYING. If not, write to 22b411b363SPhilipp Reisner the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 23b411b363SPhilipp Reisner 24b411b363SPhilipp Reisner */ 25b411b363SPhilipp Reisner 26b411b363SPhilipp Reisner #ifndef _DRBD_INT_H 27b411b363SPhilipp Reisner #define _DRBD_INT_H 28b411b363SPhilipp Reisner 29b411b363SPhilipp Reisner #include <linux/compiler.h> 30b411b363SPhilipp Reisner #include <linux/types.h> 31b411b363SPhilipp Reisner #include <linux/list.h> 32b411b363SPhilipp Reisner #include <linux/sched.h> 33b411b363SPhilipp Reisner #include <linux/bitops.h> 34b411b363SPhilipp Reisner #include <linux/slab.h> 35b411b363SPhilipp Reisner #include <linux/crypto.h> 36132cc538SRandy Dunlap #include <linux/ratelimit.h> 37b411b363SPhilipp Reisner #include <linux/tcp.h> 38b411b363SPhilipp Reisner #include <linux/mutex.h> 39b411b363SPhilipp Reisner #include <linux/major.h> 40b411b363SPhilipp Reisner #include <linux/blkdev.h> 41b411b363SPhilipp Reisner #include <linux/genhd.h> 42062e879cSPhilipp Reisner #include <linux/idr.h> 43b411b363SPhilipp Reisner #include <net/tcp.h> 44b411b363SPhilipp Reisner #include <linux/lru_cache.h> 4570c71606SPaul Gortmaker #include <linux/prefetch.h> 463b98c0c2SLars Ellenberg #include <linux/drbd_genl_api.h> 47b8907339SPhilipp Reisner #include <linux/drbd.h> 48b8907339SPhilipp Reisner #include "drbd_state.h" 49a3603a6eSAndreas Gruenbacher #include "drbd_protocol.h" 50b411b363SPhilipp Reisner 51b411b363SPhilipp Reisner #ifdef __CHECKER__ 52b411b363SPhilipp Reisner # define __protected_by(x) __attribute__((require_context(x,1,999,"rdwr"))) 53b411b363SPhilipp Reisner # define __protected_read_by(x) __attribute__((require_context(x,1,999,"read"))) 54b411b363SPhilipp Reisner # define __protected_write_by(x) __attribute__((require_context(x,1,999,"write"))) 55b411b363SPhilipp Reisner # define __must_hold(x) __attribute__((context(x,1,1), require_context(x,1,999,"call"))) 56b411b363SPhilipp Reisner #else 57b411b363SPhilipp Reisner # define __protected_by(x) 58b411b363SPhilipp Reisner # define __protected_read_by(x) 59b411b363SPhilipp Reisner # define __protected_write_by(x) 60b411b363SPhilipp Reisner # define __must_hold(x) 61b411b363SPhilipp Reisner #endif 62b411b363SPhilipp Reisner 63b411b363SPhilipp Reisner #define __no_warn(lock, stmt) do { __acquire(lock); stmt; __release(lock); } while (0) 64b411b363SPhilipp Reisner 65b411b363SPhilipp Reisner /* module parameter, defined in drbd_main.c */ 66b411b363SPhilipp Reisner extern unsigned int minor_count; 6790ab5ee9SRusty Russell extern bool disable_sendpage; 6890ab5ee9SRusty Russell extern bool allow_oos; 69b30ab791SAndreas Gruenbacher void tl_abort_disk_io(struct drbd_device *device); 70b411b363SPhilipp Reisner 71b411b363SPhilipp Reisner #ifdef CONFIG_DRBD_FAULT_INJECTION 72b411b363SPhilipp Reisner extern int enable_faults; 73b411b363SPhilipp Reisner extern int fault_rate; 74b411b363SPhilipp Reisner extern int fault_devs; 75b411b363SPhilipp Reisner #endif 76b411b363SPhilipp Reisner 77b411b363SPhilipp Reisner extern char usermode_helper[]; 78b411b363SPhilipp Reisner 79b411b363SPhilipp Reisner 80b411b363SPhilipp Reisner /* I don't remember why XCPU ... 81b411b363SPhilipp Reisner * This is used to wake the asender, 82b411b363SPhilipp Reisner * and to interrupt sending the sending task 83b411b363SPhilipp Reisner * on disconnect. 84b411b363SPhilipp Reisner */ 85b411b363SPhilipp Reisner #define DRBD_SIG SIGXCPU 86b411b363SPhilipp Reisner 87b411b363SPhilipp Reisner /* This is used to stop/restart our threads. 88b411b363SPhilipp Reisner * Cannot use SIGTERM nor SIGKILL, since these 89b411b363SPhilipp Reisner * are sent out by init on runlevel changes 90b411b363SPhilipp Reisner * I choose SIGHUP for now. 91b411b363SPhilipp Reisner */ 92b411b363SPhilipp Reisner #define DRBD_SIGKILL SIGHUP 93b411b363SPhilipp Reisner 94b411b363SPhilipp Reisner #define ID_IN_SYNC (4711ULL) 95b411b363SPhilipp Reisner #define ID_OUT_OF_SYNC (4712ULL) 96b411b363SPhilipp Reisner #define ID_SYNCER (-1ULL) 97579b57edSAndreas Gruenbacher 984a23f264SPhilipp Reisner #define UUID_NEW_BM_OFFSET ((u64)0x0001000000000000ULL) 99b411b363SPhilipp Reisner 10054761697SAndreas Gruenbacher struct drbd_device; 101bde89a9eSAndreas Gruenbacher struct drbd_connection; 102b411b363SPhilipp Reisner 1033b52beffSAndreas Gruenbacher #define __drbd_printk_device(level, device, fmt, args...) \ 1043b52beffSAndreas Gruenbacher dev_printk(level, disk_to_dev((device)->vdisk), fmt, ## args) 1053b52beffSAndreas Gruenbacher #define __drbd_printk_peer_device(level, peer_device, fmt, args...) \ 1063b52beffSAndreas Gruenbacher dev_printk(level, disk_to_dev((peer_device)->device->vdisk), fmt, ## args) 1073b52beffSAndreas Gruenbacher #define __drbd_printk_resource(level, resource, fmt, args...) \ 1083b52beffSAndreas Gruenbacher printk(level "drbd %s: " fmt, (resource)->name, ## args) 1093b52beffSAndreas Gruenbacher #define __drbd_printk_connection(level, connection, fmt, args...) \ 1103b52beffSAndreas Gruenbacher printk(level "drbd %s: " fmt, (connection)->resource->name, ## args) 111b411b363SPhilipp Reisner 1123b52beffSAndreas Gruenbacher void drbd_printk_with_wrong_object_type(void); 1133b52beffSAndreas Gruenbacher 1143b52beffSAndreas Gruenbacher #define __drbd_printk_if_same_type(obj, type, func, level, fmt, args...) \ 1153b52beffSAndreas Gruenbacher (__builtin_types_compatible_p(typeof(obj), type) || \ 1163b52beffSAndreas Gruenbacher __builtin_types_compatible_p(typeof(obj), const type)), \ 1173b52beffSAndreas Gruenbacher func(level, (const type)(obj), fmt, ## args) 1183b52beffSAndreas Gruenbacher 1193b52beffSAndreas Gruenbacher #define drbd_printk(level, obj, fmt, args...) \ 1203b52beffSAndreas Gruenbacher __builtin_choose_expr( \ 1213b52beffSAndreas Gruenbacher __drbd_printk_if_same_type(obj, struct drbd_device *, \ 1223b52beffSAndreas Gruenbacher __drbd_printk_device, level, fmt, ## args), \ 1233b52beffSAndreas Gruenbacher __builtin_choose_expr( \ 1243b52beffSAndreas Gruenbacher __drbd_printk_if_same_type(obj, struct drbd_resource *, \ 1253b52beffSAndreas Gruenbacher __drbd_printk_resource, level, fmt, ## args), \ 1263b52beffSAndreas Gruenbacher __builtin_choose_expr( \ 1273b52beffSAndreas Gruenbacher __drbd_printk_if_same_type(obj, struct drbd_connection *, \ 1283b52beffSAndreas Gruenbacher __drbd_printk_connection, level, fmt, ## args), \ 1293b52beffSAndreas Gruenbacher __builtin_choose_expr( \ 1303b52beffSAndreas Gruenbacher __drbd_printk_if_same_type(obj, struct drbd_peer_device *, \ 1313b52beffSAndreas Gruenbacher __drbd_printk_peer_device, level, fmt, ## args), \ 1323b52beffSAndreas Gruenbacher drbd_printk_with_wrong_object_type())))) 1333b52beffSAndreas Gruenbacher 1343b52beffSAndreas Gruenbacher #define drbd_dbg(obj, fmt, args...) \ 1353b52beffSAndreas Gruenbacher drbd_printk(KERN_DEBUG, obj, fmt, ## args) 1363b52beffSAndreas Gruenbacher #define drbd_alert(obj, fmt, args...) \ 1373b52beffSAndreas Gruenbacher drbd_printk(KERN_ALERT, obj, fmt, ## args) 1383b52beffSAndreas Gruenbacher #define drbd_err(obj, fmt, args...) \ 1393b52beffSAndreas Gruenbacher drbd_printk(KERN_ERR, obj, fmt, ## args) 1403b52beffSAndreas Gruenbacher #define drbd_warn(obj, fmt, args...) \ 1413b52beffSAndreas Gruenbacher drbd_printk(KERN_WARNING, obj, fmt, ## args) 1423b52beffSAndreas Gruenbacher #define drbd_info(obj, fmt, args...) \ 1433b52beffSAndreas Gruenbacher drbd_printk(KERN_INFO, obj, fmt, ## args) 1443b52beffSAndreas Gruenbacher #define drbd_emerg(obj, fmt, args...) \ 1453b52beffSAndreas Gruenbacher drbd_printk(KERN_EMERG, obj, fmt, ## args) 146d0180171SAndreas Gruenbacher 147d0180171SAndreas Gruenbacher #define dynamic_drbd_dbg(device, fmt, args...) \ 148d0180171SAndreas Gruenbacher dynamic_dev_dbg(disk_to_dev(device->vdisk), fmt, ## args) 149b411b363SPhilipp Reisner 150*0b0ba1efSAndreas Gruenbacher #define D_ASSERT(device, exp) do { \ 151*0b0ba1efSAndreas Gruenbacher if (!(exp)) \ 152*0b0ba1efSAndreas Gruenbacher drbd_err(device, "ASSERT( " #exp " ) in %s:%d\n", __FILE__, __LINE__); \ 153*0b0ba1efSAndreas Gruenbacher } while (0) 154b411b363SPhilipp Reisner 155841ce241SAndreas Gruenbacher /** 156841ce241SAndreas Gruenbacher * expect - Make an assertion 157841ce241SAndreas Gruenbacher * 158841ce241SAndreas Gruenbacher * Unlike the assert macro, this macro returns a boolean result. 159841ce241SAndreas Gruenbacher */ 160841ce241SAndreas Gruenbacher #define expect(exp) ({ \ 161841ce241SAndreas Gruenbacher bool _bool = (exp); \ 162841ce241SAndreas Gruenbacher if (!_bool) \ 163d0180171SAndreas Gruenbacher drbd_err(device, "ASSERTION %s FAILED in %s\n", \ 164841ce241SAndreas Gruenbacher #exp, __func__); \ 165841ce241SAndreas Gruenbacher _bool; \ 166841ce241SAndreas Gruenbacher }) 167b411b363SPhilipp Reisner 168b411b363SPhilipp Reisner /* Defines to control fault insertion */ 169b411b363SPhilipp Reisner enum { 170b411b363SPhilipp Reisner DRBD_FAULT_MD_WR = 0, /* meta data write */ 171b411b363SPhilipp Reisner DRBD_FAULT_MD_RD = 1, /* read */ 172b411b363SPhilipp Reisner DRBD_FAULT_RS_WR = 2, /* resync */ 173b411b363SPhilipp Reisner DRBD_FAULT_RS_RD = 3, 174b411b363SPhilipp Reisner DRBD_FAULT_DT_WR = 4, /* data */ 175b411b363SPhilipp Reisner DRBD_FAULT_DT_RD = 5, 176b411b363SPhilipp Reisner DRBD_FAULT_DT_RA = 6, /* data read ahead */ 177b411b363SPhilipp Reisner DRBD_FAULT_BM_ALLOC = 7, /* bitmap allocation */ 178b411b363SPhilipp Reisner DRBD_FAULT_AL_EE = 8, /* alloc ee */ 1796b4388acSPhilipp Reisner DRBD_FAULT_RECEIVE = 9, /* Changes some bytes upon receiving a [rs]data block */ 180b411b363SPhilipp Reisner 181b411b363SPhilipp Reisner DRBD_FAULT_MAX, 182b411b363SPhilipp Reisner }; 183b411b363SPhilipp Reisner 184b411b363SPhilipp Reisner extern unsigned int 185b30ab791SAndreas Gruenbacher _drbd_insert_fault(struct drbd_device *device, unsigned int type); 1860cf9d27eSAndreas Gruenbacher 187b411b363SPhilipp Reisner static inline int 188b30ab791SAndreas Gruenbacher drbd_insert_fault(struct drbd_device *device, unsigned int type) { 1890cf9d27eSAndreas Gruenbacher #ifdef CONFIG_DRBD_FAULT_INJECTION 190b411b363SPhilipp Reisner return fault_rate && 191b411b363SPhilipp Reisner (enable_faults & (1<<type)) && 192b30ab791SAndreas Gruenbacher _drbd_insert_fault(device, type); 193b411b363SPhilipp Reisner #else 1940cf9d27eSAndreas Gruenbacher return 0; 195b411b363SPhilipp Reisner #endif 1960cf9d27eSAndreas Gruenbacher } 197b411b363SPhilipp Reisner 198b411b363SPhilipp Reisner /* integer division, round _UP_ to the next integer */ 199b411b363SPhilipp Reisner #define div_ceil(A, B) ((A)/(B) + ((A)%(B) ? 1 : 0)) 200b411b363SPhilipp Reisner /* usual integer division */ 201b411b363SPhilipp Reisner #define div_floor(A, B) ((A)/(B)) 202b411b363SPhilipp Reisner 203b411b363SPhilipp Reisner extern struct ratelimit_state drbd_ratelimit_state; 20405a10ec7SAndreas Gruenbacher extern struct idr drbd_devices; /* RCU, updates: genl_lock() */ 20577c556f6SAndreas Gruenbacher extern struct list_head drbd_resources; /* RCU, updates: genl_lock() */ 206b411b363SPhilipp Reisner 207d8763023SAndreas Gruenbacher extern const char *cmdname(enum drbd_packet cmd); 208b411b363SPhilipp Reisner 209b411b363SPhilipp Reisner /* for sending/receiving the bitmap, 210b411b363SPhilipp Reisner * possibly in some encoding scheme */ 211b411b363SPhilipp Reisner struct bm_xfer_ctx { 212b411b363SPhilipp Reisner /* "const" 213b411b363SPhilipp Reisner * stores total bits and long words 214b411b363SPhilipp Reisner * of the bitmap, so we don't need to 215b411b363SPhilipp Reisner * call the accessor functions over and again. */ 216b411b363SPhilipp Reisner unsigned long bm_bits; 217b411b363SPhilipp Reisner unsigned long bm_words; 218b411b363SPhilipp Reisner /* during xfer, current position within the bitmap */ 219b411b363SPhilipp Reisner unsigned long bit_offset; 220b411b363SPhilipp Reisner unsigned long word_offset; 221b411b363SPhilipp Reisner 222b411b363SPhilipp Reisner /* statistics; index: (h->command == P_BITMAP) */ 223b411b363SPhilipp Reisner unsigned packets[2]; 224b411b363SPhilipp Reisner unsigned bytes[2]; 225b411b363SPhilipp Reisner }; 226b411b363SPhilipp Reisner 227b30ab791SAndreas Gruenbacher extern void INFO_bm_xfer_stats(struct drbd_device *device, 228b411b363SPhilipp Reisner const char *direction, struct bm_xfer_ctx *c); 229b411b363SPhilipp Reisner 230b411b363SPhilipp Reisner static inline void bm_xfer_ctx_bit_to_word_offset(struct bm_xfer_ctx *c) 231b411b363SPhilipp Reisner { 232b411b363SPhilipp Reisner /* word_offset counts "native long words" (32 or 64 bit), 233b411b363SPhilipp Reisner * aligned at 64 bit. 234b411b363SPhilipp Reisner * Encoded packet may end at an unaligned bit offset. 235b411b363SPhilipp Reisner * In case a fallback clear text packet is transmitted in 236b411b363SPhilipp Reisner * between, we adjust this offset back to the last 64bit 237b411b363SPhilipp Reisner * aligned "native long word", which makes coding and decoding 238b411b363SPhilipp Reisner * the plain text bitmap much more convenient. */ 239b411b363SPhilipp Reisner #if BITS_PER_LONG == 64 240b411b363SPhilipp Reisner c->word_offset = c->bit_offset >> 6; 241b411b363SPhilipp Reisner #elif BITS_PER_LONG == 32 242b411b363SPhilipp Reisner c->word_offset = c->bit_offset >> 5; 243b411b363SPhilipp Reisner c->word_offset &= ~(1UL); 244b411b363SPhilipp Reisner #else 245b411b363SPhilipp Reisner # error "unsupported BITS_PER_LONG" 246b411b363SPhilipp Reisner #endif 247b411b363SPhilipp Reisner } 248b411b363SPhilipp Reisner 249bde89a9eSAndreas Gruenbacher extern unsigned int drbd_header_size(struct drbd_connection *connection); 250b411b363SPhilipp Reisner 251b411b363SPhilipp Reisner /**********************************************************************/ 252b411b363SPhilipp Reisner enum drbd_thread_state { 253e77a0a5cSAndreas Gruenbacher NONE, 254e77a0a5cSAndreas Gruenbacher RUNNING, 255e77a0a5cSAndreas Gruenbacher EXITING, 256e77a0a5cSAndreas Gruenbacher RESTARTING 257b411b363SPhilipp Reisner }; 258b411b363SPhilipp Reisner 259b411b363SPhilipp Reisner struct drbd_thread { 260b411b363SPhilipp Reisner spinlock_t t_lock; 261b411b363SPhilipp Reisner struct task_struct *task; 262b411b363SPhilipp Reisner struct completion stop; 263b411b363SPhilipp Reisner enum drbd_thread_state t_state; 264b411b363SPhilipp Reisner int (*function) (struct drbd_thread *); 265bde89a9eSAndreas Gruenbacher struct drbd_connection *connection; 266b411b363SPhilipp Reisner int reset_cpu_mask; 267bed879aeSPhilipp Reisner char name[9]; 268b411b363SPhilipp Reisner }; 269b411b363SPhilipp Reisner 270b411b363SPhilipp Reisner static inline enum drbd_thread_state get_t_state(struct drbd_thread *thi) 271b411b363SPhilipp Reisner { 272b411b363SPhilipp Reisner /* THINK testing the t_state seems to be uncritical in all cases 273b411b363SPhilipp Reisner * (but thread_{start,stop}), so we can read it *without* the lock. 274b411b363SPhilipp Reisner * --lge */ 275b411b363SPhilipp Reisner 276b411b363SPhilipp Reisner smp_rmb(); 277b411b363SPhilipp Reisner return thi->t_state; 278b411b363SPhilipp Reisner } 279b411b363SPhilipp Reisner 280b411b363SPhilipp Reisner struct drbd_work { 281b411b363SPhilipp Reisner struct list_head list; 282309a8348SAndreas Gruenbacher int (*cb)(struct drbd_work *, int cancel); 28300d56944SPhilipp Reisner union { 284b30ab791SAndreas Gruenbacher struct drbd_device *device; 285bde89a9eSAndreas Gruenbacher struct drbd_connection *connection; 28600d56944SPhilipp Reisner }; 287b411b363SPhilipp Reisner }; 288b411b363SPhilipp Reisner 289ace652acSAndreas Gruenbacher #include "drbd_interval.h" 290ace652acSAndreas Gruenbacher 29154761697SAndreas Gruenbacher extern int drbd_wait_misc(struct drbd_device *, struct drbd_interval *); 2927be8da07SAndreas Gruenbacher 293b411b363SPhilipp Reisner struct drbd_request { 294b411b363SPhilipp Reisner struct drbd_work w; 295b411b363SPhilipp Reisner 296b411b363SPhilipp Reisner /* if local IO is not allowed, will be NULL. 297b411b363SPhilipp Reisner * if local IO _is_ allowed, holds the locally submitted bio clone, 298b411b363SPhilipp Reisner * or, after local IO completion, the ERR_PTR(error). 299fcefa62eSAndreas Gruenbacher * see drbd_request_endio(). */ 300b411b363SPhilipp Reisner struct bio *private_bio; 301b411b363SPhilipp Reisner 302ace652acSAndreas Gruenbacher struct drbd_interval i; 303b411b363SPhilipp Reisner 304b6dd1a89SLars Ellenberg /* epoch: used to check on "completion" whether this req was in 305b411b363SPhilipp Reisner * the current epoch, and we therefore have to close it, 306b6dd1a89SLars Ellenberg * causing a p_barrier packet to be send, starting a new epoch. 307b6dd1a89SLars Ellenberg * 308b6dd1a89SLars Ellenberg * This corresponds to "barrier" in struct p_barrier[_ack], 309b6dd1a89SLars Ellenberg * and to "barrier_nr" in struct drbd_epoch (and various 310b6dd1a89SLars Ellenberg * comments/function parameters/local variable names). 311b411b363SPhilipp Reisner */ 312b6dd1a89SLars Ellenberg unsigned int epoch; 313b411b363SPhilipp Reisner 314b411b363SPhilipp Reisner struct list_head tl_requests; /* ring list in the transfer log */ 315b411b363SPhilipp Reisner struct bio *master_bio; /* master bio pointer */ 316b411b363SPhilipp Reisner unsigned long start_time; 317b406777eSLars Ellenberg 318b406777eSLars Ellenberg /* once it hits 0, we may complete the master_bio */ 319b406777eSLars Ellenberg atomic_t completion_ref; 320b406777eSLars Ellenberg /* once it hits 0, we may destroy this drbd_request object */ 321b406777eSLars Ellenberg struct kref kref; 322a0d856dfSLars Ellenberg 323a0d856dfSLars Ellenberg unsigned rq_state; /* see comments above _req_mod() */ 324b411b363SPhilipp Reisner }; 325b411b363SPhilipp Reisner 326b411b363SPhilipp Reisner struct drbd_epoch { 327bde89a9eSAndreas Gruenbacher struct drbd_connection *connection; 328b411b363SPhilipp Reisner struct list_head list; 329b411b363SPhilipp Reisner unsigned int barrier_nr; 330b411b363SPhilipp Reisner atomic_t epoch_size; /* increased on every request added. */ 331b411b363SPhilipp Reisner atomic_t active; /* increased on every req. added, and dec on every finished. */ 332b411b363SPhilipp Reisner unsigned long flags; 333b411b363SPhilipp Reisner }; 334b411b363SPhilipp Reisner 335de0b2e69SRashika Kheria /* Prototype declaration of function defined in drbd_receiver.c */ 336de0b2e69SRashika Kheria int drbdd_init(struct drbd_thread *); 337de0b2e69SRashika Kheria int drbd_asender(struct drbd_thread *); 338de0b2e69SRashika Kheria 339b411b363SPhilipp Reisner /* drbd_epoch flag bits */ 340b411b363SPhilipp Reisner enum { 341b411b363SPhilipp Reisner DE_HAVE_BARRIER_NUMBER, 342b411b363SPhilipp Reisner }; 343b411b363SPhilipp Reisner 344b411b363SPhilipp Reisner enum epoch_event { 345b411b363SPhilipp Reisner EV_PUT, 346b411b363SPhilipp Reisner EV_GOT_BARRIER_NR, 347b411b363SPhilipp Reisner EV_BECAME_LAST, 348b411b363SPhilipp Reisner EV_CLEANUP = 32, /* used as flag */ 349b411b363SPhilipp Reisner }; 350b411b363SPhilipp Reisner 351b411b363SPhilipp Reisner struct drbd_wq_barrier { 352b411b363SPhilipp Reisner struct drbd_work w; 353b411b363SPhilipp Reisner struct completion done; 354b411b363SPhilipp Reisner }; 355b411b363SPhilipp Reisner 356b411b363SPhilipp Reisner struct digest_info { 357b411b363SPhilipp Reisner int digest_size; 358b411b363SPhilipp Reisner void *digest; 359b411b363SPhilipp Reisner }; 360b411b363SPhilipp Reisner 361f6ffca9fSAndreas Gruenbacher struct drbd_peer_request { 36245bb912bSLars Ellenberg struct drbd_work w; 36385719573SPhilipp Reisner struct drbd_epoch *epoch; /* for writes */ 36445bb912bSLars Ellenberg struct page *pages; 36545bb912bSLars Ellenberg atomic_t pending_bios; 366010f6e67SAndreas Gruenbacher struct drbd_interval i; 36745bb912bSLars Ellenberg /* see comments on ee flag bits below */ 36845bb912bSLars Ellenberg unsigned long flags; 36985719573SPhilipp Reisner union { 37045bb912bSLars Ellenberg u64 block_id; 37185719573SPhilipp Reisner struct digest_info *digest; 37285719573SPhilipp Reisner }; 37345bb912bSLars Ellenberg }; 37445bb912bSLars Ellenberg 37545bb912bSLars Ellenberg /* ee flag bits. 37645bb912bSLars Ellenberg * While corresponding bios are in flight, the only modification will be 37745bb912bSLars Ellenberg * set_bit WAS_ERROR, which has to be atomic. 37845bb912bSLars Ellenberg * If no bios are in flight yet, or all have been completed, 37945bb912bSLars Ellenberg * non-atomic modification to ee->flags is ok. 38045bb912bSLars Ellenberg */ 381b411b363SPhilipp Reisner enum { 382b411b363SPhilipp Reisner __EE_CALL_AL_COMPLETE_IO, 383b411b363SPhilipp Reisner __EE_MAY_SET_IN_SYNC, 38445bb912bSLars Ellenberg 38545bb912bSLars Ellenberg /* In case a barrier failed, 38645bb912bSLars Ellenberg * we need to resubmit without the barrier flag. */ 38745bb912bSLars Ellenberg __EE_RESUBMITTED, 38845bb912bSLars Ellenberg 3896c852becSAndreas Gruenbacher /* we may have several bios per peer request. 39045bb912bSLars Ellenberg * if any of those fail, we set this flag atomically 39145bb912bSLars Ellenberg * from the endio callback */ 39245bb912bSLars Ellenberg __EE_WAS_ERROR, 393c36c3cedSLars Ellenberg 394c36c3cedSLars Ellenberg /* This ee has a pointer to a digest instead of a block id */ 395c36c3cedSLars Ellenberg __EE_HAS_DIGEST, 3967be8da07SAndreas Gruenbacher 3977be8da07SAndreas Gruenbacher /* Conflicting local requests need to be restarted after this request */ 3987be8da07SAndreas Gruenbacher __EE_RESTART_REQUESTS, 399303d1448SPhilipp Reisner 400303d1448SPhilipp Reisner /* The peer wants a write ACK for this (wire proto C) */ 401303d1448SPhilipp Reisner __EE_SEND_WRITE_ACK, 402302bdeaeSPhilipp Reisner 403302bdeaeSPhilipp Reisner /* Is set when net_conf had two_primaries set while creating this peer_req */ 404302bdeaeSPhilipp Reisner __EE_IN_INTERVAL_TREE, 405b411b363SPhilipp Reisner }; 406b411b363SPhilipp Reisner #define EE_CALL_AL_COMPLETE_IO (1<<__EE_CALL_AL_COMPLETE_IO) 407b411b363SPhilipp Reisner #define EE_MAY_SET_IN_SYNC (1<<__EE_MAY_SET_IN_SYNC) 40845bb912bSLars Ellenberg #define EE_RESUBMITTED (1<<__EE_RESUBMITTED) 40945bb912bSLars Ellenberg #define EE_WAS_ERROR (1<<__EE_WAS_ERROR) 410c36c3cedSLars Ellenberg #define EE_HAS_DIGEST (1<<__EE_HAS_DIGEST) 4117be8da07SAndreas Gruenbacher #define EE_RESTART_REQUESTS (1<<__EE_RESTART_REQUESTS) 412303d1448SPhilipp Reisner #define EE_SEND_WRITE_ACK (1<<__EE_SEND_WRITE_ACK) 413302bdeaeSPhilipp Reisner #define EE_IN_INTERVAL_TREE (1<<__EE_IN_INTERVAL_TREE) 414b411b363SPhilipp Reisner 415b30ab791SAndreas Gruenbacher /* flag bits per device */ 416b411b363SPhilipp Reisner enum { 417b411b363SPhilipp Reisner UNPLUG_REMOTE, /* sending a "UnplugRemote" could help */ 418b411b363SPhilipp Reisner MD_DIRTY, /* current uuids and flags not yet on disk */ 419b411b363SPhilipp Reisner USE_DEGR_WFC_T, /* degr-wfc-timeout instead of wfc-timeout. */ 420b411b363SPhilipp Reisner CL_ST_CHG_SUCCESS, 421b411b363SPhilipp Reisner CL_ST_CHG_FAIL, 422b411b363SPhilipp Reisner CRASHED_PRIMARY, /* This node was a crashed primary. 423b411b363SPhilipp Reisner * Gets cleared when the state.conn 424b411b363SPhilipp Reisner * goes into C_CONNECTED state. */ 425b411b363SPhilipp Reisner CONSIDER_RESYNC, 426b411b363SPhilipp Reisner 427a8a4e51eSPhilipp Reisner MD_NO_FUA, /* Users wants us to not use FUA/FLUSH on meta data dev */ 428b411b363SPhilipp Reisner SUSPEND_IO, /* suspend application io */ 429b411b363SPhilipp Reisner BITMAP_IO, /* suspend application io; 430b411b363SPhilipp Reisner once no more io in flight, start bitmap io */ 431b411b363SPhilipp Reisner BITMAP_IO_QUEUED, /* Started bitmap IO */ 43282f59cc6SLars Ellenberg GO_DISKLESS, /* Disk is being detached, on io-error or admin request. */ 433a2a3c74fSLars Ellenberg WAS_IO_ERROR, /* Local disk failed, returned IO error */ 434a2a3c74fSLars Ellenberg WAS_READ_ERROR, /* Local disk READ failed (set additionally to the above) */ 435383606e0SLars Ellenberg FORCE_DETACH, /* Force-detach from local disk, aborting any pending local IO */ 436b411b363SPhilipp Reisner RESYNC_AFTER_NEG, /* Resync after online grow after the attach&negotiate finished. */ 437b411b363SPhilipp Reisner RESIZE_PENDING, /* Size change detected locally, waiting for the response from 438b411b363SPhilipp Reisner * the peer, if it changed there as well. */ 43943a5182cSPhilipp Reisner NEW_CUR_UUID, /* Create new current UUID when thawing IO */ 4400778286aSPhilipp Reisner AL_SUSPENDED, /* Activity logging is currently suspended. */ 441370a43e7SPhilipp Reisner AHEAD_TO_SYNC_SOURCE, /* Ahead -> SyncSource queued */ 442e64a3294SPhilipp Reisner B_RS_H_DONE, /* Before resync handler done (already executed) */ 44308b165baSPhilipp Reisner DISCARD_MY_DATA, /* discard_my_data flag per volume */ 444380207d0SPhilipp Reisner READ_BALANCE_RR, 445b411b363SPhilipp Reisner }; 446b411b363SPhilipp Reisner 44754761697SAndreas Gruenbacher struct drbd_bitmap; /* opaque for drbd_device */ 448b411b363SPhilipp Reisner 44920ceb2b2SLars Ellenberg /* definition of bits in bm_flags to be used in drbd_bm_lock 45020ceb2b2SLars Ellenberg * and drbd_bitmap_io and friends. */ 45120ceb2b2SLars Ellenberg enum bm_flag { 45220ceb2b2SLars Ellenberg /* do we need to kfree, or vfree bm_pages? */ 45320ceb2b2SLars Ellenberg BM_P_VMALLOCED = 0x10000, /* internal use only, will be masked out */ 45420ceb2b2SLars Ellenberg 45520ceb2b2SLars Ellenberg /* currently locked for bulk operation */ 4560e8488adSLars Ellenberg BM_LOCKED_MASK = 0xf, 45720ceb2b2SLars Ellenberg 45820ceb2b2SLars Ellenberg /* in detail, that is: */ 45920ceb2b2SLars Ellenberg BM_DONT_CLEAR = 0x1, 46020ceb2b2SLars Ellenberg BM_DONT_SET = 0x2, 46120ceb2b2SLars Ellenberg BM_DONT_TEST = 0x4, 46220ceb2b2SLars Ellenberg 4630e8488adSLars Ellenberg /* so we can mark it locked for bulk operation, 4640e8488adSLars Ellenberg * and still allow all non-bulk operations */ 4650e8488adSLars Ellenberg BM_IS_LOCKED = 0x8, 4660e8488adSLars Ellenberg 46720ceb2b2SLars Ellenberg /* (test bit, count bit) allowed (common case) */ 4680e8488adSLars Ellenberg BM_LOCKED_TEST_ALLOWED = BM_DONT_CLEAR | BM_DONT_SET | BM_IS_LOCKED, 46920ceb2b2SLars Ellenberg 47020ceb2b2SLars Ellenberg /* testing bits, as well as setting new bits allowed, but clearing bits 47120ceb2b2SLars Ellenberg * would be unexpected. Used during bitmap receive. Setting new bits 47220ceb2b2SLars Ellenberg * requires sending of "out-of-sync" information, though. */ 4730e8488adSLars Ellenberg BM_LOCKED_SET_ALLOWED = BM_DONT_CLEAR | BM_IS_LOCKED, 47420ceb2b2SLars Ellenberg 4750e8488adSLars Ellenberg /* for drbd_bm_write_copy_pages, everything is allowed, 4760e8488adSLars Ellenberg * only concurrent bulk operations are locked out. */ 4770e8488adSLars Ellenberg BM_LOCKED_CHANGE_ALLOWED = BM_IS_LOCKED, 47820ceb2b2SLars Ellenberg }; 47920ceb2b2SLars Ellenberg 480b411b363SPhilipp Reisner struct drbd_work_queue { 481b411b363SPhilipp Reisner struct list_head q; 482b411b363SPhilipp Reisner spinlock_t q_lock; /* to protect the list. */ 4838c0785a5SLars Ellenberg wait_queue_head_t q_wait; 484b411b363SPhilipp Reisner }; 485b411b363SPhilipp Reisner 486b411b363SPhilipp Reisner struct drbd_socket { 487b411b363SPhilipp Reisner struct mutex mutex; 488b411b363SPhilipp Reisner struct socket *socket; 489b411b363SPhilipp Reisner /* this way we get our 490b411b363SPhilipp Reisner * send/receive buffers off the stack */ 4915a87d920SAndreas Gruenbacher void *sbuf; 492e6ef8a5cSAndreas Gruenbacher void *rbuf; 493b411b363SPhilipp Reisner }; 494b411b363SPhilipp Reisner 495b411b363SPhilipp Reisner struct drbd_md { 496b411b363SPhilipp Reisner u64 md_offset; /* sector offset to 'super' block */ 497b411b363SPhilipp Reisner 498b411b363SPhilipp Reisner u64 la_size_sect; /* last agreed size, unit sectors */ 4999f2247bbSPhilipp Reisner spinlock_t uuid_lock; 500b411b363SPhilipp Reisner u64 uuid[UI_SIZE]; 501b411b363SPhilipp Reisner u64 device_uuid; 502b411b363SPhilipp Reisner u32 flags; 503b411b363SPhilipp Reisner u32 md_size_sect; 504b411b363SPhilipp Reisner 505ae8bf312SLars Ellenberg s32 al_offset; /* signed relative sector offset to activity log */ 506b411b363SPhilipp Reisner s32 bm_offset; /* signed relative sector offset to bitmap */ 5073a4d4eb3SLars Ellenberg 5083a4d4eb3SLars Ellenberg /* cached value of bdev->disk_conf->meta_dev_idx (see below) */ 5093a4d4eb3SLars Ellenberg s32 meta_dev_idx; 5103a4d4eb3SLars Ellenberg 5113a4d4eb3SLars Ellenberg /* see al_tr_number_to_on_disk_sector() */ 5123a4d4eb3SLars Ellenberg u32 al_stripes; 5133a4d4eb3SLars Ellenberg u32 al_stripe_size_4k; 5143a4d4eb3SLars Ellenberg u32 al_size_4k; /* cached product of the above */ 515b411b363SPhilipp Reisner }; 516b411b363SPhilipp Reisner 517b411b363SPhilipp Reisner struct drbd_backing_dev { 518b411b363SPhilipp Reisner struct block_device *backing_bdev; 519b411b363SPhilipp Reisner struct block_device *md_bdev; 520b411b363SPhilipp Reisner struct drbd_md md; 521a6b32bc3SAndreas Gruenbacher struct disk_conf *disk_conf; /* RCU, for updates: first_peer_device(device)->connection->conf_update */ 522b411b363SPhilipp Reisner sector_t known_size; /* last known size of that backing device */ 523b411b363SPhilipp Reisner }; 524b411b363SPhilipp Reisner 525b411b363SPhilipp Reisner struct drbd_md_io { 5260c464425SPhilipp Reisner unsigned int done; 527b411b363SPhilipp Reisner int error; 528b411b363SPhilipp Reisner }; 529b411b363SPhilipp Reisner 530b411b363SPhilipp Reisner struct bm_io_work { 531b411b363SPhilipp Reisner struct drbd_work w; 532b411b363SPhilipp Reisner char *why; 53320ceb2b2SLars Ellenberg enum bm_flag flags; 534b30ab791SAndreas Gruenbacher int (*io_fn)(struct drbd_device *device); 535b30ab791SAndreas Gruenbacher void (*done)(struct drbd_device *device, int rv); 536b411b363SPhilipp Reisner }; 537b411b363SPhilipp Reisner 538b411b363SPhilipp Reisner enum write_ordering_e { 539b411b363SPhilipp Reisner WO_none, 540b411b363SPhilipp Reisner WO_drain_io, 541b411b363SPhilipp Reisner WO_bdev_flush, 542b411b363SPhilipp Reisner }; 543b411b363SPhilipp Reisner 544778f271dSPhilipp Reisner struct fifo_buffer { 545778f271dSPhilipp Reisner unsigned int head_index; 546778f271dSPhilipp Reisner unsigned int size; 5479958c857SPhilipp Reisner int total; /* sum of all values */ 5489958c857SPhilipp Reisner int values[0]; 549778f271dSPhilipp Reisner }; 5509958c857SPhilipp Reisner extern struct fifo_buffer *fifo_alloc(int fifo_size); 551778f271dSPhilipp Reisner 552bde89a9eSAndreas Gruenbacher /* flag bits per connection */ 55301a311a5SPhilipp Reisner enum { 55401a311a5SPhilipp Reisner NET_CONGESTED, /* The data socket is congested */ 555427c0434SLars Ellenberg RESOLVE_CONFLICTS, /* Set on one node, cleared on the peer! */ 556e43ef195SPhilipp Reisner SEND_PING, /* whether asender should send a ping asap */ 557808e37b8SPhilipp Reisner SIGNAL_ASENDER, /* whether asender wants to be interrupted */ 5582a67d8b9SPhilipp Reisner GOT_PING_ACK, /* set when we receive a ping_ack packet, ping_wait gets woken */ 5594d0fc3fdSPhilipp Reisner CONN_WD_ST_CHG_REQ, /* A cluster wide state change on the connection is active */ 560fc3b10a4SPhilipp Reisner CONN_WD_ST_CHG_OKAY, 561fc3b10a4SPhilipp Reisner CONN_WD_ST_CHG_FAIL, 5628169e41bSPhilipp Reisner CONN_DRY_RUN, /* Expect disconnect after resync handshake. */ 5636936fcb4SPhilipp Reisner CREATE_BARRIER, /* next P_DATA is preceded by a P_BARRIER */ 564a1096a6eSPhilipp Reisner STATE_SENT, /* Do not change state/UUIDs while this is set */ 5656f3465edSLars Ellenberg CALLBACK_PENDING, /* Whether we have a call_usermodehelper(, UMH_WAIT_PROC) 5666f3465edSLars Ellenberg * pending, from drbd worker context. 5676f3465edSLars Ellenberg * If set, bdi_write_congested() returns true, 5686f3465edSLars Ellenberg * so shrink_page_list() would not recurse into, 5696f3465edSLars Ellenberg * and potentially deadlock on, this drbd worker. 5706f3465edSLars Ellenberg */ 571b66623e3SPhilipp Reisner DISCONNECT_SENT, 57201a311a5SPhilipp Reisner }; 57301a311a5SPhilipp Reisner 57477c556f6SAndreas Gruenbacher struct drbd_resource { 57577c556f6SAndreas Gruenbacher char *name; 57677c556f6SAndreas Gruenbacher struct kref kref; 577803ea134SAndreas Gruenbacher struct idr devices; /* volume number to device mapping */ 57877c556f6SAndreas Gruenbacher struct list_head connections; 57977c556f6SAndreas Gruenbacher struct list_head resources; 580eb6bea67SAndreas Gruenbacher struct res_opts res_opts; 58177c556f6SAndreas Gruenbacher }; 58277c556f6SAndreas Gruenbacher 58377c556f6SAndreas Gruenbacher struct drbd_connection { 58477c556f6SAndreas Gruenbacher struct list_head connections; 58577c556f6SAndreas Gruenbacher struct drbd_resource *resource; 5869dc9fbb3SPhilipp Reisner struct kref kref; 587c06ece6bSAndreas Gruenbacher struct idr peer_devices; /* volume number to peer device mapping */ 588bbeb641cSPhilipp Reisner enum drbd_conns cstate; /* Only C_STANDALONE to C_WF_REPORT_PARAMS */ 5898e0af25fSPhilipp Reisner unsigned susp:1; /* IO suspended by user */ 5908e0af25fSPhilipp Reisner unsigned susp_nod:1; /* IO suspended because no data */ 5918e0af25fSPhilipp Reisner unsigned susp_fen:1; /* IO suspended because fence peer handler runs */ 5928410da8fSPhilipp Reisner struct mutex cstate_mutex; /* Protects graceful disconnects */ 59328e448bbSPhilipp Reisner unsigned int connect_cnt; /* Inc each time a connection is established */ 5942111438bSPhilipp Reisner 595062e879cSPhilipp Reisner unsigned long flags; 59644ed167dSPhilipp Reisner struct net_conf *net_conf; /* content protected by rcu */ 597a0095508SPhilipp Reisner struct mutex conf_update; /* mutex for ready-copy-update of net_conf and disk_conf */ 5982a67d8b9SPhilipp Reisner wait_queue_head_t ping_wait; /* Woken upon reception of a ping, and a state change */ 599e42325a5SPhilipp Reisner 600089c075dSAndreas Gruenbacher struct sockaddr_storage my_addr; 601089c075dSAndreas Gruenbacher int my_addr_len; 602089c075dSAndreas Gruenbacher struct sockaddr_storage peer_addr; 603089c075dSAndreas Gruenbacher int peer_addr_len; 604089c075dSAndreas Gruenbacher 605e42325a5SPhilipp Reisner struct drbd_socket data; /* data/barrier/cstate/parameter packets */ 606e42325a5SPhilipp Reisner struct drbd_socket meta; /* ping/ack (metadata) packets */ 60731890f4aSPhilipp Reisner int agreed_pro_version; /* actually used protocol version */ 60831890f4aSPhilipp Reisner unsigned long last_received; /* in jiffies, either socket */ 60931890f4aSPhilipp Reisner unsigned int ko_count; 610e6b3ea83SPhilipp Reisner 61187eeee41SPhilipp Reisner spinlock_t req_lock; 612b6dd1a89SLars Ellenberg 613b6dd1a89SLars Ellenberg struct list_head transfer_log; /* all requests not yet fully processed */ 61487eeee41SPhilipp Reisner 615a0638456SPhilipp Reisner struct crypto_hash *cram_hmac_tfm; 616bde89a9eSAndreas Gruenbacher struct crypto_hash *integrity_tfm; /* checksums we compute, updates protected by connection->data->mutex */ 617036b17eaSPhilipp Reisner struct crypto_hash *peer_integrity_tfm; /* checksums we verify, only accessed from receiver thread */ 618f399002eSLars Ellenberg struct crypto_hash *csums_tfm; 619f399002eSLars Ellenberg struct crypto_hash *verify_tfm; 620a0638456SPhilipp Reisner void *int_dig_in; 621a0638456SPhilipp Reisner void *int_dig_vv; 622a0638456SPhilipp Reisner 623b6dd1a89SLars Ellenberg /* receiver side */ 62412038a3aSPhilipp Reisner struct drbd_epoch *current_epoch; 62512038a3aSPhilipp Reisner spinlock_t epoch_lock; 62612038a3aSPhilipp Reisner unsigned int epochs; 6274b0007c0SPhilipp Reisner enum write_ordering_e write_ordering; 628b379c41eSLars Ellenberg atomic_t current_tle_nr; /* transfer log epoch number */ 629b6dd1a89SLars Ellenberg unsigned current_tle_writes; /* writes seen within this tl epoch */ 6304b0007c0SPhilipp Reisner 63107be15b1SLars Ellenberg unsigned long last_reconnect_jif; 632e6b3ea83SPhilipp Reisner struct drbd_thread receiver; 633e6b3ea83SPhilipp Reisner struct drbd_thread worker; 634e6b3ea83SPhilipp Reisner struct drbd_thread asender; 63580822284SPhilipp Reisner cpumask_var_t cpu_mask; 636b6dd1a89SLars Ellenberg 637b6dd1a89SLars Ellenberg /* sender side */ 638d5b27b01SLars Ellenberg struct drbd_work_queue sender_work; 639b6dd1a89SLars Ellenberg 640b6dd1a89SLars Ellenberg struct { 641b6dd1a89SLars Ellenberg /* whether this sender thread 642b6dd1a89SLars Ellenberg * has processed a single write yet. */ 643b6dd1a89SLars Ellenberg bool seen_any_write_yet; 644b6dd1a89SLars Ellenberg 645b6dd1a89SLars Ellenberg /* Which barrier number to send with the next P_BARRIER */ 646b6dd1a89SLars Ellenberg int current_epoch_nr; 647b6dd1a89SLars Ellenberg 648b6dd1a89SLars Ellenberg /* how many write requests have been sent 649b6dd1a89SLars Ellenberg * with req->epoch == current_epoch_nr. 650b6dd1a89SLars Ellenberg * If none, no P_BARRIER will be sent. */ 651b6dd1a89SLars Ellenberg unsigned current_epoch_writes; 652b6dd1a89SLars Ellenberg } send; 653b411b363SPhilipp Reisner }; 654b411b363SPhilipp Reisner 655113fef9eSLars Ellenberg struct submit_worker { 656113fef9eSLars Ellenberg struct workqueue_struct *wq; 657113fef9eSLars Ellenberg struct work_struct worker; 658113fef9eSLars Ellenberg 659113fef9eSLars Ellenberg spinlock_t lock; 660113fef9eSLars Ellenberg struct list_head writes; 661113fef9eSLars Ellenberg }; 662113fef9eSLars Ellenberg 663a6b32bc3SAndreas Gruenbacher struct drbd_peer_device { 664a6b32bc3SAndreas Gruenbacher struct list_head peer_devices; 665a6b32bc3SAndreas Gruenbacher struct drbd_device *device; 666bde89a9eSAndreas Gruenbacher struct drbd_connection *connection; 667a6b32bc3SAndreas Gruenbacher }; 668a6b32bc3SAndreas Gruenbacher 669a6b32bc3SAndreas Gruenbacher struct drbd_device { 670d8628a86SAndreas Gruenbacher struct drbd_resource *resource; 671a6b32bc3SAndreas Gruenbacher struct list_head peer_devices; 6722111438bSPhilipp Reisner int vnr; /* volume number within the connection */ 67381fa2e67SPhilipp Reisner struct kref kref; 6742111438bSPhilipp Reisner 675b411b363SPhilipp Reisner /* things that are stored as / read from meta data on disk */ 676b411b363SPhilipp Reisner unsigned long flags; 677b411b363SPhilipp Reisner 678b411b363SPhilipp Reisner /* configured by drbdsetup */ 679b411b363SPhilipp Reisner struct drbd_backing_dev *ldev __protected_by(local); 680b411b363SPhilipp Reisner 681b411b363SPhilipp Reisner sector_t p_size; /* partner's disk size */ 682b411b363SPhilipp Reisner struct request_queue *rq_queue; 683b411b363SPhilipp Reisner struct block_device *this_bdev; 684b411b363SPhilipp Reisner struct gendisk *vdisk; 685b411b363SPhilipp Reisner 68607be15b1SLars Ellenberg unsigned long last_reattach_jif; 687b411b363SPhilipp Reisner struct drbd_work resync_work, 688b411b363SPhilipp Reisner unplug_work, 689e9e6f3ecSLars Ellenberg go_diskless, 690c4752ef1SPhilipp Reisner md_sync_work, 691c4752ef1SPhilipp Reisner start_resync_work; 692b411b363SPhilipp Reisner struct timer_list resync_timer; 693b411b363SPhilipp Reisner struct timer_list md_sync_timer; 694370a43e7SPhilipp Reisner struct timer_list start_resync_timer; 6957fde2be9SPhilipp Reisner struct timer_list request_timer; 696ee15b038SLars Ellenberg #ifdef DRBD_DEBUG_MD_SYNC 697ee15b038SLars Ellenberg struct { 698ee15b038SLars Ellenberg unsigned int line; 699ee15b038SLars Ellenberg const char* func; 700ee15b038SLars Ellenberg } last_md_mark_dirty; 701ee15b038SLars Ellenberg #endif 702b411b363SPhilipp Reisner 703b411b363SPhilipp Reisner /* Used after attach while negotiating new disk state. */ 704b411b363SPhilipp Reisner union drbd_state new_state_tmp; 705b411b363SPhilipp Reisner 706da9fbc27SPhilipp Reisner union drbd_dev_state state; 707b411b363SPhilipp Reisner wait_queue_head_t misc_wait; 708b411b363SPhilipp Reisner wait_queue_head_t state_wait; /* upon each state change. */ 709b411b363SPhilipp Reisner unsigned int send_cnt; 710b411b363SPhilipp Reisner unsigned int recv_cnt; 711b411b363SPhilipp Reisner unsigned int read_cnt; 712b411b363SPhilipp Reisner unsigned int writ_cnt; 713b411b363SPhilipp Reisner unsigned int al_writ_cnt; 714b411b363SPhilipp Reisner unsigned int bm_writ_cnt; 715b411b363SPhilipp Reisner atomic_t ap_bio_cnt; /* Requests we need to complete */ 716b411b363SPhilipp Reisner atomic_t ap_pending_cnt; /* AP data packets on the wire, ack expected */ 717b411b363SPhilipp Reisner atomic_t rs_pending_cnt; /* RS request/data packets on the wire */ 718d942ae44SPhilipp Reisner atomic_t unacked_cnt; /* Need to send replies for */ 719b411b363SPhilipp Reisner atomic_t local_cnt; /* Waiting for local completion */ 720b2fb6dbeSPhilipp Reisner 721dac1389cSAndreas Gruenbacher /* Interval tree of pending local requests */ 722dac1389cSAndreas Gruenbacher struct rb_root read_requests; 723de696716SAndreas Gruenbacher struct rb_root write_requests; 724b411b363SPhilipp Reisner 7254b0715f0SLars Ellenberg /* blocks to resync in this run [unit BM_BLOCK_SIZE] */ 726b411b363SPhilipp Reisner unsigned long rs_total; 7274b0715f0SLars Ellenberg /* number of resync blocks that failed in this run */ 728b411b363SPhilipp Reisner unsigned long rs_failed; 729b411b363SPhilipp Reisner /* Syncer's start time [unit jiffies] */ 730b411b363SPhilipp Reisner unsigned long rs_start; 731b411b363SPhilipp Reisner /* cumulated time in PausedSyncX state [unit jiffies] */ 732b411b363SPhilipp Reisner unsigned long rs_paused; 7331d7734a0SLars Ellenberg /* skipped because csum was equal [unit BM_BLOCK_SIZE] */ 734b411b363SPhilipp Reisner unsigned long rs_same_csum; 7351d7734a0SLars Ellenberg #define DRBD_SYNC_MARKS 8 7361d7734a0SLars Ellenberg #define DRBD_SYNC_MARK_STEP (3*HZ) 7371d7734a0SLars Ellenberg /* block not up-to-date at mark [unit BM_BLOCK_SIZE] */ 7381d7734a0SLars Ellenberg unsigned long rs_mark_left[DRBD_SYNC_MARKS]; 7391d7734a0SLars Ellenberg /* marks's time [unit jiffies] */ 7401d7734a0SLars Ellenberg unsigned long rs_mark_time[DRBD_SYNC_MARKS]; 7411d7734a0SLars Ellenberg /* current index into rs_mark_{left,time} */ 7421d7734a0SLars Ellenberg int rs_last_mark; 743328e0f12SPhilipp Reisner unsigned long rs_last_bcast; /* [unit jiffies] */ 744b411b363SPhilipp Reisner 745b411b363SPhilipp Reisner /* where does the admin want us to start? (sector) */ 746b411b363SPhilipp Reisner sector_t ov_start_sector; 74702b91b55SLars Ellenberg sector_t ov_stop_sector; 748b411b363SPhilipp Reisner /* where are we now? (sector) */ 749b411b363SPhilipp Reisner sector_t ov_position; 750b411b363SPhilipp Reisner /* Start sector of out of sync range (to merge printk reporting). */ 751b411b363SPhilipp Reisner sector_t ov_last_oos_start; 752b411b363SPhilipp Reisner /* size of out-of-sync range in sectors. */ 753b411b363SPhilipp Reisner sector_t ov_last_oos_size; 754b411b363SPhilipp Reisner unsigned long ov_left; /* in bits */ 755b411b363SPhilipp Reisner 756b411b363SPhilipp Reisner struct drbd_bitmap *bitmap; 757b411b363SPhilipp Reisner unsigned long bm_resync_fo; /* bit offset for drbd_bm_find_next */ 758b411b363SPhilipp Reisner 759b411b363SPhilipp Reisner /* Used to track operations of resync... */ 760b411b363SPhilipp Reisner struct lru_cache *resync; 761b411b363SPhilipp Reisner /* Number of locked elements in resync LRU */ 762b411b363SPhilipp Reisner unsigned int resync_locked; 763b411b363SPhilipp Reisner /* resync extent number waiting for application requests */ 764b411b363SPhilipp Reisner unsigned int resync_wenr; 765b411b363SPhilipp Reisner 766b411b363SPhilipp Reisner int open_cnt; 767b411b363SPhilipp Reisner u64 *p_uuid; 7684b0007c0SPhilipp Reisner 76985719573SPhilipp Reisner struct list_head active_ee; /* IO in progress (P_DATA gets written to disk) */ 77085719573SPhilipp Reisner struct list_head sync_ee; /* IO in progress (P_RS_DATA_REPLY gets written to disk) */ 77118b75d75SAndreas Gruenbacher struct list_head done_ee; /* need to send P_WRITE_ACK */ 77218b75d75SAndreas Gruenbacher struct list_head read_ee; /* [RS]P_DATA_REQUEST being read */ 773b411b363SPhilipp Reisner struct list_head net_ee; /* zero-copy network send in progress */ 774b411b363SPhilipp Reisner 775b411b363SPhilipp Reisner int next_barrier_nr; 776b411b363SPhilipp Reisner struct list_head resync_reads; 777435f0740SLars Ellenberg atomic_t pp_in_use; /* allocated from page pool */ 778435f0740SLars Ellenberg atomic_t pp_in_use_by_net; /* sendpage()d, still referenced by tcp */ 779b411b363SPhilipp Reisner wait_queue_head_t ee_wait; 780b411b363SPhilipp Reisner struct page *md_io_page; /* one page buffer for md_io */ 781cc94c650SPhilipp Reisner struct drbd_md_io md_io; 782e1711731SPhilipp Reisner atomic_t md_io_in_use; /* protects the md_io, md_io_page and md_io_tmpp */ 783b411b363SPhilipp Reisner spinlock_t al_lock; 784b411b363SPhilipp Reisner wait_queue_head_t al_wait; 785b411b363SPhilipp Reisner struct lru_cache *act_log; /* activity log */ 786b411b363SPhilipp Reisner unsigned int al_tr_number; 787b411b363SPhilipp Reisner int al_tr_cycle; 788b411b363SPhilipp Reisner wait_queue_head_t seq_wait; 789b411b363SPhilipp Reisner atomic_t packet_seq; 790b411b363SPhilipp Reisner unsigned int peer_seq; 791b411b363SPhilipp Reisner spinlock_t peer_seq_lock; 792b411b363SPhilipp Reisner unsigned int minor; 793b411b363SPhilipp Reisner unsigned long comm_bm_set; /* communicated number of set bits. */ 794b411b363SPhilipp Reisner struct bm_io_work bm_io_work; 795b411b363SPhilipp Reisner u64 ed_uuid; /* UUID of the exposed data */ 7968410da8fSPhilipp Reisner struct mutex own_state_mutex; 797a6b32bc3SAndreas Gruenbacher struct mutex *state_mutex; /* either own_state_mutex or first_peer_device(device)->connection->cstate_mutex */ 798b411b363SPhilipp Reisner char congestion_reason; /* Why we where congested... */ 7991d7734a0SLars Ellenberg atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ 8001d7734a0SLars Ellenberg atomic_t rs_sect_ev; /* for submitted resync data rate, both */ 8011d7734a0SLars Ellenberg int rs_last_sect_ev; /* counter to compare with */ 8021d7734a0SLars Ellenberg int rs_last_events; /* counter of read or write "events" (unit sectors) 8031d7734a0SLars Ellenberg * on the lower level device when we last looked. */ 8041d7734a0SLars Ellenberg int c_sync_rate; /* current resync rate after syncer throttle magic */ 805bde89a9eSAndreas Gruenbacher struct fifo_buffer *rs_plan_s; /* correction values of resync planer (RCU, connection->conn_update) */ 806778f271dSPhilipp Reisner int rs_in_flight; /* resync sectors in flight (to proxy, in proxy and from proxy) */ 807759fbdfbSPhilipp Reisner atomic_t ap_in_flight; /* App sectors in flight (waiting for ack) */ 808db141b2fSLars Ellenberg unsigned int peer_max_bio_size; 809db141b2fSLars Ellenberg unsigned int local_max_bio_size; 810113fef9eSLars Ellenberg 811113fef9eSLars Ellenberg /* any requests that would block in drbd_make_request() 812113fef9eSLars Ellenberg * are deferred to this single-threaded work queue */ 813113fef9eSLars Ellenberg struct submit_worker submit; 814b411b363SPhilipp Reisner }; 815b411b363SPhilipp Reisner 816b30ab791SAndreas Gruenbacher static inline struct drbd_device *minor_to_device(unsigned int minor) 817b411b363SPhilipp Reisner { 81805a10ec7SAndreas Gruenbacher return (struct drbd_device *)idr_find(&drbd_devices, minor); 819b411b363SPhilipp Reisner } 820b411b363SPhilipp Reisner 821a6b32bc3SAndreas Gruenbacher static inline struct drbd_peer_device *first_peer_device(struct drbd_device *device) 822a6b32bc3SAndreas Gruenbacher { 823a6b32bc3SAndreas Gruenbacher return list_first_entry(&device->peer_devices, struct drbd_peer_device, peer_devices); 824a6b32bc3SAndreas Gruenbacher } 825a6b32bc3SAndreas Gruenbacher 82677c556f6SAndreas Gruenbacher #define for_each_resource(resource, _resources) \ 82777c556f6SAndreas Gruenbacher list_for_each_entry(resource, _resources, resources) 82877c556f6SAndreas Gruenbacher 82977c556f6SAndreas Gruenbacher #define for_each_resource_rcu(resource, _resources) \ 83077c556f6SAndreas Gruenbacher list_for_each_entry_rcu(resource, _resources, resources) 83177c556f6SAndreas Gruenbacher 83277c556f6SAndreas Gruenbacher #define for_each_resource_safe(resource, tmp, _resources) \ 83377c556f6SAndreas Gruenbacher list_for_each_entry_safe(resource, tmp, _resources, resources) 83477c556f6SAndreas Gruenbacher 83577c556f6SAndreas Gruenbacher #define for_each_connection(connection, resource) \ 83677c556f6SAndreas Gruenbacher list_for_each_entry(connection, &resource->connections, connections) 83777c556f6SAndreas Gruenbacher 83877c556f6SAndreas Gruenbacher #define for_each_connection_rcu(connection, resource) \ 83977c556f6SAndreas Gruenbacher list_for_each_entry_rcu(connection, &resource->connections, connections) 84077c556f6SAndreas Gruenbacher 84177c556f6SAndreas Gruenbacher #define for_each_connection_safe(connection, tmp, resource) \ 84277c556f6SAndreas Gruenbacher list_for_each_entry_safe(connection, tmp, &resource->connections, connections) 84377c556f6SAndreas Gruenbacher 844a6b32bc3SAndreas Gruenbacher #define for_each_peer_device(peer_device, device) \ 845a6b32bc3SAndreas Gruenbacher list_for_each_entry(peer_device, &device->peer_devices, peer_devices) 846a6b32bc3SAndreas Gruenbacher 847a6b32bc3SAndreas Gruenbacher #define for_each_peer_device_rcu(peer_device, device) \ 848a6b32bc3SAndreas Gruenbacher list_for_each_entry_rcu(peer_device, &device->peer_devices, peer_devices) 849a6b32bc3SAndreas Gruenbacher 850a6b32bc3SAndreas Gruenbacher #define for_each_peer_device_safe(peer_device, tmp, device) \ 851a6b32bc3SAndreas Gruenbacher list_for_each_entry_safe(peer_device, tmp, &device->peer_devices, peer_devices) 852a6b32bc3SAndreas Gruenbacher 853b30ab791SAndreas Gruenbacher static inline unsigned int device_to_minor(struct drbd_device *device) 854b411b363SPhilipp Reisner { 855b30ab791SAndreas Gruenbacher return device->minor; 856b411b363SPhilipp Reisner } 857b411b363SPhilipp Reisner 858bde89a9eSAndreas Gruenbacher static inline struct drbd_device *vnr_to_device(struct drbd_connection *connection, int vnr) 859b411b363SPhilipp Reisner { 860c06ece6bSAndreas Gruenbacher struct drbd_peer_device *peer_device; 861c06ece6bSAndreas Gruenbacher 862c06ece6bSAndreas Gruenbacher peer_device = idr_find(&connection->peer_devices, vnr); 863c06ece6bSAndreas Gruenbacher return peer_device ? peer_device->device : NULL; 864b411b363SPhilipp Reisner } 865b411b363SPhilipp Reisner 866b411b363SPhilipp Reisner /* 867b411b363SPhilipp Reisner * function declarations 868b411b363SPhilipp Reisner *************************/ 869b411b363SPhilipp Reisner 870b411b363SPhilipp Reisner /* drbd_main.c */ 871b411b363SPhilipp Reisner 872e89b591cSPhilipp Reisner enum dds_flags { 873e89b591cSPhilipp Reisner DDSF_FORCED = 1, 874e89b591cSPhilipp Reisner DDSF_NO_RESYNC = 2, /* Do not run a resync for the new space */ 875e89b591cSPhilipp Reisner }; 876e89b591cSPhilipp Reisner 877b30ab791SAndreas Gruenbacher extern void drbd_init_set_defaults(struct drbd_device *device); 878b411b363SPhilipp Reisner extern int drbd_thread_start(struct drbd_thread *thi); 879b411b363SPhilipp Reisner extern void _drbd_thread_stop(struct drbd_thread *thi, int restart, int wait); 880bde89a9eSAndreas Gruenbacher extern char *drbd_task_to_thread_name(struct drbd_connection *connection, struct task_struct *task); 881b411b363SPhilipp Reisner #ifdef CONFIG_SMP 88280822284SPhilipp Reisner extern void drbd_thread_current_set_cpu(struct drbd_thread *thi); 883bde89a9eSAndreas Gruenbacher extern void drbd_calc_cpu_mask(struct drbd_connection *connection); 884b411b363SPhilipp Reisner #else 885b411b363SPhilipp Reisner #define drbd_thread_current_set_cpu(A) ({}) 886b411b363SPhilipp Reisner #define drbd_calc_cpu_mask(A) ({}) 887b411b363SPhilipp Reisner #endif 888bde89a9eSAndreas Gruenbacher extern void tl_release(struct drbd_connection *, unsigned int barrier_nr, 889b411b363SPhilipp Reisner unsigned int set_size); 890bde89a9eSAndreas Gruenbacher extern void tl_clear(struct drbd_connection *); 891bde89a9eSAndreas Gruenbacher extern void drbd_free_sock(struct drbd_connection *connection); 892bde89a9eSAndreas Gruenbacher extern int drbd_send(struct drbd_connection *connection, struct socket *sock, 893b411b363SPhilipp Reisner void *buf, size_t size, unsigned msg_flags); 894bde89a9eSAndreas Gruenbacher extern int drbd_send_all(struct drbd_connection *, struct socket *, void *, size_t, 895fb708e40SAndreas Gruenbacher unsigned); 896fb708e40SAndreas Gruenbacher 897bde89a9eSAndreas Gruenbacher extern int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_packet cmd); 898bde89a9eSAndreas Gruenbacher extern int drbd_send_protocol(struct drbd_connection *connection); 899b30ab791SAndreas Gruenbacher extern int drbd_send_uuids(struct drbd_device *device); 900b30ab791SAndreas Gruenbacher extern int drbd_send_uuids_skip_initial_sync(struct drbd_device *device); 901b30ab791SAndreas Gruenbacher extern void drbd_gen_and_send_sync_uuid(struct drbd_device *device); 902b30ab791SAndreas Gruenbacher extern int drbd_send_sizes(struct drbd_device *device, int trigger_reply, enum dds_flags flags); 903b30ab791SAndreas Gruenbacher extern int drbd_send_state(struct drbd_device *device, union drbd_state s); 904b30ab791SAndreas Gruenbacher extern int drbd_send_current_state(struct drbd_device *device); 905b30ab791SAndreas Gruenbacher extern int drbd_send_sync_param(struct drbd_device *device); 906bde89a9eSAndreas Gruenbacher extern void drbd_send_b_ack(struct drbd_connection *connection, u32 barrier_nr, 907b411b363SPhilipp Reisner u32 set_size); 90854761697SAndreas Gruenbacher extern int drbd_send_ack(struct drbd_device *, enum drbd_packet, 909f6ffca9fSAndreas Gruenbacher struct drbd_peer_request *); 910b30ab791SAndreas Gruenbacher extern void drbd_send_ack_rp(struct drbd_device *device, enum drbd_packet cmd, 911b411b363SPhilipp Reisner struct p_block_req *rp); 912b30ab791SAndreas Gruenbacher extern void drbd_send_ack_dp(struct drbd_device *device, enum drbd_packet cmd, 9132b2bf214SLars Ellenberg struct p_data *dp, int data_size); 914b30ab791SAndreas Gruenbacher extern int drbd_send_ack_ex(struct drbd_device *device, enum drbd_packet cmd, 915b411b363SPhilipp Reisner sector_t sector, int blksize, u64 block_id); 91654761697SAndreas Gruenbacher extern int drbd_send_out_of_sync(struct drbd_device *, struct drbd_request *); 91754761697SAndreas Gruenbacher extern int drbd_send_block(struct drbd_device *, enum drbd_packet, 918f6ffca9fSAndreas Gruenbacher struct drbd_peer_request *); 919b30ab791SAndreas Gruenbacher extern int drbd_send_dblock(struct drbd_device *device, struct drbd_request *req); 920b30ab791SAndreas Gruenbacher extern int drbd_send_drequest(struct drbd_device *device, int cmd, 921b411b363SPhilipp Reisner sector_t sector, int size, u64 block_id); 922b30ab791SAndreas Gruenbacher extern int drbd_send_drequest_csum(struct drbd_device *device, sector_t sector, 923d8763023SAndreas Gruenbacher int size, void *digest, int digest_size, 924d8763023SAndreas Gruenbacher enum drbd_packet cmd); 925b30ab791SAndreas Gruenbacher extern int drbd_send_ov_request(struct drbd_device *device, sector_t sector, int size); 926b411b363SPhilipp Reisner 927b30ab791SAndreas Gruenbacher extern int drbd_send_bitmap(struct drbd_device *device); 928b30ab791SAndreas Gruenbacher extern void drbd_send_sr_reply(struct drbd_device *device, enum drbd_state_rv retcode); 929bde89a9eSAndreas Gruenbacher extern void conn_send_sr_reply(struct drbd_connection *connection, enum drbd_state_rv retcode); 930b411b363SPhilipp Reisner extern void drbd_free_bc(struct drbd_backing_dev *ldev); 931b30ab791SAndreas Gruenbacher extern void drbd_device_cleanup(struct drbd_device *device); 932b30ab791SAndreas Gruenbacher void drbd_print_uuids(struct drbd_device *device, const char *text); 933b411b363SPhilipp Reisner 934bde89a9eSAndreas Gruenbacher extern void conn_md_sync(struct drbd_connection *connection); 935b30ab791SAndreas Gruenbacher extern void drbd_md_write(struct drbd_device *device, void *buffer); 936b30ab791SAndreas Gruenbacher extern void drbd_md_sync(struct drbd_device *device); 937b30ab791SAndreas Gruenbacher extern int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev); 938b30ab791SAndreas Gruenbacher extern void drbd_uuid_set(struct drbd_device *device, int idx, u64 val) __must_hold(local); 939b30ab791SAndreas Gruenbacher extern void _drbd_uuid_set(struct drbd_device *device, int idx, u64 val) __must_hold(local); 940b30ab791SAndreas Gruenbacher extern void drbd_uuid_new_current(struct drbd_device *device) __must_hold(local); 941b30ab791SAndreas Gruenbacher extern void drbd_uuid_set_bm(struct drbd_device *device, u64 val) __must_hold(local); 942b30ab791SAndreas Gruenbacher extern void drbd_uuid_move_history(struct drbd_device *device) __must_hold(local); 943b30ab791SAndreas Gruenbacher extern void __drbd_uuid_set(struct drbd_device *device, int idx, u64 val) __must_hold(local); 944b30ab791SAndreas Gruenbacher extern void drbd_md_set_flag(struct drbd_device *device, int flags) __must_hold(local); 945b30ab791SAndreas Gruenbacher extern void drbd_md_clear_flag(struct drbd_device *device, int flags)__must_hold(local); 946b411b363SPhilipp Reisner extern int drbd_md_test_flag(struct drbd_backing_dev *, int); 947ee15b038SLars Ellenberg #ifndef DRBD_DEBUG_MD_SYNC 948b30ab791SAndreas Gruenbacher extern void drbd_md_mark_dirty(struct drbd_device *device); 949ee15b038SLars Ellenberg #else 950ee15b038SLars Ellenberg #define drbd_md_mark_dirty(m) drbd_md_mark_dirty_(m, __LINE__ , __func__ ) 951b30ab791SAndreas Gruenbacher extern void drbd_md_mark_dirty_(struct drbd_device *device, 952ee15b038SLars Ellenberg unsigned int line, const char *func); 953ee15b038SLars Ellenberg #endif 954b30ab791SAndreas Gruenbacher extern void drbd_queue_bitmap_io(struct drbd_device *device, 95554761697SAndreas Gruenbacher int (*io_fn)(struct drbd_device *), 95654761697SAndreas Gruenbacher void (*done)(struct drbd_device *, int), 95720ceb2b2SLars Ellenberg char *why, enum bm_flag flags); 958b30ab791SAndreas Gruenbacher extern int drbd_bitmap_io(struct drbd_device *device, 95954761697SAndreas Gruenbacher int (*io_fn)(struct drbd_device *), 96020ceb2b2SLars Ellenberg char *why, enum bm_flag flags); 961b30ab791SAndreas Gruenbacher extern int drbd_bitmap_io_from_worker(struct drbd_device *device, 96254761697SAndreas Gruenbacher int (*io_fn)(struct drbd_device *), 963edc9f5ebSLars Ellenberg char *why, enum bm_flag flags); 964b30ab791SAndreas Gruenbacher extern int drbd_bmio_set_n_write(struct drbd_device *device); 965b30ab791SAndreas Gruenbacher extern int drbd_bmio_clear_n_write(struct drbd_device *device); 966b30ab791SAndreas Gruenbacher extern void drbd_ldev_destroy(struct drbd_device *device); 967b411b363SPhilipp Reisner 968b411b363SPhilipp Reisner /* Meta data layout 969ae8bf312SLars Ellenberg * 970ae8bf312SLars Ellenberg * We currently have two possible layouts. 971ae8bf312SLars Ellenberg * Offsets in (512 byte) sectors. 972ae8bf312SLars Ellenberg * external: 973ae8bf312SLars Ellenberg * |----------- md_size_sect ------------------| 974ae8bf312SLars Ellenberg * [ 4k superblock ][ activity log ][ Bitmap ] 975ae8bf312SLars Ellenberg * | al_offset == 8 | 976ae8bf312SLars Ellenberg * | bm_offset = al_offset + X | 977ae8bf312SLars Ellenberg * ==> bitmap sectors = md_size_sect - bm_offset 978ae8bf312SLars Ellenberg * 979ae8bf312SLars Ellenberg * Variants: 980ae8bf312SLars Ellenberg * old, indexed fixed size meta data: 981ae8bf312SLars Ellenberg * 982ae8bf312SLars Ellenberg * internal: 983ae8bf312SLars Ellenberg * |----------- md_size_sect ------------------| 984ae8bf312SLars Ellenberg * [data.....][ Bitmap ][ activity log ][ 4k superblock ][padding*] 985ae8bf312SLars Ellenberg * | al_offset < 0 | 986ae8bf312SLars Ellenberg * | bm_offset = al_offset - Y | 987ae8bf312SLars Ellenberg * ==> bitmap sectors = Y = al_offset - bm_offset 988ae8bf312SLars Ellenberg * 989ae8bf312SLars Ellenberg * [padding*] are zero or up to 7 unused 512 Byte sectors to the 990ae8bf312SLars Ellenberg * end of the device, so that the [4k superblock] will be 4k aligned. 991ae8bf312SLars Ellenberg * 992ae8bf312SLars Ellenberg * The activity log consists of 4k transaction blocks, 993ae8bf312SLars Ellenberg * which are written in a ring-buffer, or striped ring-buffer like fashion, 994ae8bf312SLars Ellenberg * which are writtensize used to be fixed 32kB, 995ae8bf312SLars Ellenberg * but is about to become configurable. 996ae8bf312SLars Ellenberg */ 997b411b363SPhilipp Reisner 998ae8bf312SLars Ellenberg /* Our old fixed size meta data layout 999ae8bf312SLars Ellenberg * allows up to about 3.8TB, so if you want more, 10007ad651b5SLars Ellenberg * you need to use the "flexible" meta data format. */ 1001ae8bf312SLars Ellenberg #define MD_128MB_SECT (128LLU << 11) /* 128 MB, unit sectors */ 1002ae8bf312SLars Ellenberg #define MD_4kB_SECT 8 1003ae8bf312SLars Ellenberg #define MD_32kB_SECT 64 1004b411b363SPhilipp Reisner 10057ad651b5SLars Ellenberg /* One activity log extent represents 4M of storage */ 10067ad651b5SLars Ellenberg #define AL_EXTENT_SHIFT 22 1007b411b363SPhilipp Reisner #define AL_EXTENT_SIZE (1<<AL_EXTENT_SHIFT) 1008b411b363SPhilipp Reisner 10097ad651b5SLars Ellenberg /* We could make these currently hardcoded constants configurable 10107ad651b5SLars Ellenberg * variables at create-md time (or even re-configurable at runtime?). 10117ad651b5SLars Ellenberg * Which will require some more changes to the DRBD "super block" 10127ad651b5SLars Ellenberg * and attach code. 10137ad651b5SLars Ellenberg * 10147ad651b5SLars Ellenberg * updates per transaction: 10157ad651b5SLars Ellenberg * This many changes to the active set can be logged with one transaction. 10167ad651b5SLars Ellenberg * This number is arbitrary. 10177ad651b5SLars Ellenberg * context per transaction: 10187ad651b5SLars Ellenberg * This many context extent numbers are logged with each transaction. 10197ad651b5SLars Ellenberg * This number is resulting from the transaction block size (4k), the layout 10207ad651b5SLars Ellenberg * of the transaction header, and the number of updates per transaction. 10217ad651b5SLars Ellenberg * See drbd_actlog.c:struct al_transaction_on_disk 10227ad651b5SLars Ellenberg * */ 10237ad651b5SLars Ellenberg #define AL_UPDATES_PER_TRANSACTION 64 // arbitrary 10247ad651b5SLars Ellenberg #define AL_CONTEXT_PER_TRANSACTION 919 // (4096 - 36 - 6*64)/4 10257ad651b5SLars Ellenberg 1026b411b363SPhilipp Reisner #if BITS_PER_LONG == 32 1027b411b363SPhilipp Reisner #define LN2_BPL 5 1028b411b363SPhilipp Reisner #define cpu_to_lel(A) cpu_to_le32(A) 1029b411b363SPhilipp Reisner #define lel_to_cpu(A) le32_to_cpu(A) 1030b411b363SPhilipp Reisner #elif BITS_PER_LONG == 64 1031b411b363SPhilipp Reisner #define LN2_BPL 6 1032b411b363SPhilipp Reisner #define cpu_to_lel(A) cpu_to_le64(A) 1033b411b363SPhilipp Reisner #define lel_to_cpu(A) le64_to_cpu(A) 1034b411b363SPhilipp Reisner #else 1035b411b363SPhilipp Reisner #error "LN2 of BITS_PER_LONG unknown!" 1036b411b363SPhilipp Reisner #endif 1037b411b363SPhilipp Reisner 1038b411b363SPhilipp Reisner /* resync bitmap */ 1039b411b363SPhilipp Reisner /* 16MB sized 'bitmap extent' to track syncer usage */ 1040b411b363SPhilipp Reisner struct bm_extent { 1041b411b363SPhilipp Reisner int rs_left; /* number of bits set (out of sync) in this extent. */ 1042b411b363SPhilipp Reisner int rs_failed; /* number of failed resync requests in this extent. */ 1043b411b363SPhilipp Reisner unsigned long flags; 1044b411b363SPhilipp Reisner struct lc_element lce; 1045b411b363SPhilipp Reisner }; 1046b411b363SPhilipp Reisner 1047b411b363SPhilipp Reisner #define BME_NO_WRITES 0 /* bm_extent.flags: no more requests on this one! */ 1048b411b363SPhilipp Reisner #define BME_LOCKED 1 /* bm_extent.flags: syncer active on this one. */ 1049e3555d85SPhilipp Reisner #define BME_PRIORITY 2 /* finish resync IO on this extent ASAP! App IO waiting! */ 1050b411b363SPhilipp Reisner 1051b411b363SPhilipp Reisner /* drbd_bitmap.c */ 1052b411b363SPhilipp Reisner /* 1053b411b363SPhilipp Reisner * We need to store one bit for a block. 1054b411b363SPhilipp Reisner * Example: 1GB disk @ 4096 byte blocks ==> we need 32 KB bitmap. 1055b411b363SPhilipp Reisner * Bit 0 ==> local node thinks this block is binary identical on both nodes 1056b411b363SPhilipp Reisner * Bit 1 ==> local node thinks this block needs to be synced. 1057b411b363SPhilipp Reisner */ 1058b411b363SPhilipp Reisner 10598e26f9ccSPhilipp Reisner #define SLEEP_TIME (HZ/10) 10608e26f9ccSPhilipp Reisner 106145dfffebSLars Ellenberg /* We do bitmap IO in units of 4k blocks. 106245dfffebSLars Ellenberg * We also still have a hardcoded 4k per bit relation. */ 1063b411b363SPhilipp Reisner #define BM_BLOCK_SHIFT 12 /* 4k per bit */ 1064b411b363SPhilipp Reisner #define BM_BLOCK_SIZE (1<<BM_BLOCK_SHIFT) 106545dfffebSLars Ellenberg /* mostly arbitrarily set the represented size of one bitmap extent, 106645dfffebSLars Ellenberg * aka resync extent, to 16 MiB (which is also 512 Byte worth of bitmap 106745dfffebSLars Ellenberg * at 4k per bit resolution) */ 106845dfffebSLars Ellenberg #define BM_EXT_SHIFT 24 /* 16 MiB per resync extent */ 1069b411b363SPhilipp Reisner #define BM_EXT_SIZE (1<<BM_EXT_SHIFT) 1070b411b363SPhilipp Reisner 1071b411b363SPhilipp Reisner #if (BM_EXT_SHIFT != 24) || (BM_BLOCK_SHIFT != 12) 1072b411b363SPhilipp Reisner #error "HAVE YOU FIXED drbdmeta AS WELL??" 1073b411b363SPhilipp Reisner #endif 1074b411b363SPhilipp Reisner 1075b411b363SPhilipp Reisner /* thus many _storage_ sectors are described by one bit */ 1076b411b363SPhilipp Reisner #define BM_SECT_TO_BIT(x) ((x)>>(BM_BLOCK_SHIFT-9)) 1077b411b363SPhilipp Reisner #define BM_BIT_TO_SECT(x) ((sector_t)(x)<<(BM_BLOCK_SHIFT-9)) 1078b411b363SPhilipp Reisner #define BM_SECT_PER_BIT BM_BIT_TO_SECT(1) 1079b411b363SPhilipp Reisner 1080b411b363SPhilipp Reisner /* bit to represented kilo byte conversion */ 1081b411b363SPhilipp Reisner #define Bit2KB(bits) ((bits)<<(BM_BLOCK_SHIFT-10)) 1082b411b363SPhilipp Reisner 1083b411b363SPhilipp Reisner /* in which _bitmap_ extent (resp. sector) the bit for a certain 1084b411b363SPhilipp Reisner * _storage_ sector is located in */ 1085b411b363SPhilipp Reisner #define BM_SECT_TO_EXT(x) ((x)>>(BM_EXT_SHIFT-9)) 1086b411b363SPhilipp Reisner 1087b411b363SPhilipp Reisner /* how much _storage_ sectors we have per bitmap sector */ 1088b411b363SPhilipp Reisner #define BM_EXT_TO_SECT(x) ((sector_t)(x) << (BM_EXT_SHIFT-9)) 1089b411b363SPhilipp Reisner #define BM_SECT_PER_EXT BM_EXT_TO_SECT(1) 1090b411b363SPhilipp Reisner 1091b411b363SPhilipp Reisner /* in one sector of the bitmap, we have this many activity_log extents. */ 1092b411b363SPhilipp Reisner #define AL_EXT_PER_BM_SECT (1 << (BM_EXT_SHIFT - AL_EXTENT_SHIFT)) 1093b411b363SPhilipp Reisner 1094b411b363SPhilipp Reisner #define BM_BLOCKS_PER_BM_EXT_B (BM_EXT_SHIFT - BM_BLOCK_SHIFT) 1095b411b363SPhilipp Reisner #define BM_BLOCKS_PER_BM_EXT_MASK ((1<<BM_BLOCKS_PER_BM_EXT_B) - 1) 1096b411b363SPhilipp Reisner 1097b411b363SPhilipp Reisner /* the extent in "PER_EXTENT" below is an activity log extent 1098b411b363SPhilipp Reisner * we need that many (long words/bytes) to store the bitmap 1099b411b363SPhilipp Reisner * of one AL_EXTENT_SIZE chunk of storage. 1100b411b363SPhilipp Reisner * we can store the bitmap for that many AL_EXTENTS within 1101b411b363SPhilipp Reisner * one sector of the _on_disk_ bitmap: 1102b411b363SPhilipp Reisner * bit 0 bit 37 bit 38 bit (512*8)-1 1103b411b363SPhilipp Reisner * ...|........|........|.. // ..|........| 1104b411b363SPhilipp Reisner * sect. 0 `296 `304 ^(512*8*8)-1 1105b411b363SPhilipp Reisner * 1106b411b363SPhilipp Reisner #define BM_WORDS_PER_EXT ( (AL_EXT_SIZE/BM_BLOCK_SIZE) / BITS_PER_LONG ) 1107b411b363SPhilipp Reisner #define BM_BYTES_PER_EXT ( (AL_EXT_SIZE/BM_BLOCK_SIZE) / 8 ) // 128 1108b411b363SPhilipp Reisner #define BM_EXT_PER_SECT ( 512 / BM_BYTES_PER_EXTENT ) // 4 1109b411b363SPhilipp Reisner */ 1110b411b363SPhilipp Reisner 1111b411b363SPhilipp Reisner #define DRBD_MAX_SECTORS_32 (0xffffffffLU) 1112ae8bf312SLars Ellenberg /* we have a certain meta data variant that has a fixed on-disk size of 128 1113ae8bf312SLars Ellenberg * MiB, of which 4k are our "superblock", and 32k are the fixed size activity 1114ae8bf312SLars Ellenberg * log, leaving this many sectors for the bitmap. 1115ae8bf312SLars Ellenberg */ 1116ae8bf312SLars Ellenberg 1117ae8bf312SLars Ellenberg #define DRBD_MAX_SECTORS_FIXED_BM \ 1118ae8bf312SLars Ellenberg ((MD_128MB_SECT - MD_32kB_SECT - MD_4kB_SECT) * (1LL<<(BM_EXT_SHIFT-9))) 1119ae8bf312SLars Ellenberg #if !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32 1120b411b363SPhilipp Reisner #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_32 1121b411b363SPhilipp Reisner #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32 1122b411b363SPhilipp Reisner #else 1123ae8bf312SLars Ellenberg #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_FIXED_BM 1124b411b363SPhilipp Reisner /* 16 TB in units of sectors */ 1125b411b363SPhilipp Reisner #if BITS_PER_LONG == 32 1126b411b363SPhilipp Reisner /* adjust by one page worth of bitmap, 1127b411b363SPhilipp Reisner * so we won't wrap around in drbd_bm_find_next_bit. 1128b411b363SPhilipp Reisner * you should use 64bit OS for that much storage, anyways. */ 1129b411b363SPhilipp Reisner #define DRBD_MAX_SECTORS_FLEX BM_BIT_TO_SECT(0xffff7fff) 1130b411b363SPhilipp Reisner #else 11314b0715f0SLars Ellenberg /* we allow up to 1 PiB now on 64bit architecture with "flexible" meta data */ 11324b0715f0SLars Ellenberg #define DRBD_MAX_SECTORS_FLEX (1UL << 51) 11334b0715f0SLars Ellenberg /* corresponds to (1UL << 38) bits right now. */ 1134b411b363SPhilipp Reisner #endif 1135b411b363SPhilipp Reisner #endif 1136b411b363SPhilipp Reisner 113723361cf3SLars Ellenberg /* BIO_MAX_SIZE is 256 * PAGE_CACHE_SIZE, 113823361cf3SLars Ellenberg * so for typical PAGE_CACHE_SIZE of 4k, that is (1<<20) Byte. 113923361cf3SLars Ellenberg * Since we may live in a mixed-platform cluster, 114023361cf3SLars Ellenberg * we limit us to a platform agnostic constant here for now. 114123361cf3SLars Ellenberg * A followup commit may allow even bigger BIO sizes, 114223361cf3SLars Ellenberg * once we thought that through. */ 114398683650SPhilipp Reisner #define DRBD_MAX_BIO_SIZE (1U << 20) 114423361cf3SLars Ellenberg #if DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE 114523361cf3SLars Ellenberg #error Architecture not supported: DRBD_MAX_BIO_SIZE > BIO_MAX_SIZE 114623361cf3SLars Ellenberg #endif 1147db141b2fSLars Ellenberg #define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */ 1148b411b363SPhilipp Reisner 114998683650SPhilipp Reisner #define DRBD_MAX_SIZE_H80_PACKET (1U << 15) /* Header 80 only allows packets up to 32KiB data */ 115098683650SPhilipp Reisner #define DRBD_MAX_BIO_SIZE_P95 (1U << 17) /* Protocol 95 to 99 allows bios up to 128KiB */ 1151b411b363SPhilipp Reisner 1152b30ab791SAndreas Gruenbacher extern int drbd_bm_init(struct drbd_device *device); 1153b30ab791SAndreas Gruenbacher extern int drbd_bm_resize(struct drbd_device *device, sector_t sectors, int set_new_bits); 1154b30ab791SAndreas Gruenbacher extern void drbd_bm_cleanup(struct drbd_device *device); 1155b30ab791SAndreas Gruenbacher extern void drbd_bm_set_all(struct drbd_device *device); 1156b30ab791SAndreas Gruenbacher extern void drbd_bm_clear_all(struct drbd_device *device); 11574b0715f0SLars Ellenberg /* set/clear/test only a few bits at a time */ 1158b411b363SPhilipp Reisner extern int drbd_bm_set_bits( 1159b30ab791SAndreas Gruenbacher struct drbd_device *device, unsigned long s, unsigned long e); 1160b411b363SPhilipp Reisner extern int drbd_bm_clear_bits( 1161b30ab791SAndreas Gruenbacher struct drbd_device *device, unsigned long s, unsigned long e); 11624b0715f0SLars Ellenberg extern int drbd_bm_count_bits( 1163b30ab791SAndreas Gruenbacher struct drbd_device *device, const unsigned long s, const unsigned long e); 11644b0715f0SLars Ellenberg /* bm_set_bits variant for use while holding drbd_bm_lock, 11654b0715f0SLars Ellenberg * may process the whole bitmap in one go */ 1166b30ab791SAndreas Gruenbacher extern void _drbd_bm_set_bits(struct drbd_device *device, 1167b411b363SPhilipp Reisner const unsigned long s, const unsigned long e); 1168b30ab791SAndreas Gruenbacher extern int drbd_bm_test_bit(struct drbd_device *device, unsigned long bitnr); 1169b30ab791SAndreas Gruenbacher extern int drbd_bm_e_weight(struct drbd_device *device, unsigned long enr); 1170b30ab791SAndreas Gruenbacher extern int drbd_bm_write_page(struct drbd_device *device, unsigned int idx) __must_hold(local); 1171b30ab791SAndreas Gruenbacher extern int drbd_bm_read(struct drbd_device *device) __must_hold(local); 1172b30ab791SAndreas Gruenbacher extern void drbd_bm_mark_for_writeout(struct drbd_device *device, int page_nr); 1173b30ab791SAndreas Gruenbacher extern int drbd_bm_write(struct drbd_device *device) __must_hold(local); 1174b30ab791SAndreas Gruenbacher extern int drbd_bm_write_hinted(struct drbd_device *device) __must_hold(local); 1175b30ab791SAndreas Gruenbacher extern int drbd_bm_write_all(struct drbd_device *device) __must_hold(local); 1176b30ab791SAndreas Gruenbacher extern int drbd_bm_write_copy_pages(struct drbd_device *device) __must_hold(local); 1177b30ab791SAndreas Gruenbacher extern size_t drbd_bm_words(struct drbd_device *device); 1178b30ab791SAndreas Gruenbacher extern unsigned long drbd_bm_bits(struct drbd_device *device); 1179b30ab791SAndreas Gruenbacher extern sector_t drbd_bm_capacity(struct drbd_device *device); 11804b0715f0SLars Ellenberg 11814b0715f0SLars Ellenberg #define DRBD_END_OF_BITMAP (~(unsigned long)0) 1182b30ab791SAndreas Gruenbacher extern unsigned long drbd_bm_find_next(struct drbd_device *device, unsigned long bm_fo); 1183b411b363SPhilipp Reisner /* bm_find_next variants for use while you hold drbd_bm_lock() */ 1184b30ab791SAndreas Gruenbacher extern unsigned long _drbd_bm_find_next(struct drbd_device *device, unsigned long bm_fo); 1185b30ab791SAndreas Gruenbacher extern unsigned long _drbd_bm_find_next_zero(struct drbd_device *device, unsigned long bm_fo); 1186b30ab791SAndreas Gruenbacher extern unsigned long _drbd_bm_total_weight(struct drbd_device *device); 1187b30ab791SAndreas Gruenbacher extern unsigned long drbd_bm_total_weight(struct drbd_device *device); 1188b30ab791SAndreas Gruenbacher extern int drbd_bm_rs_done(struct drbd_device *device); 1189b411b363SPhilipp Reisner /* for receive_bitmap */ 1190b30ab791SAndreas Gruenbacher extern void drbd_bm_merge_lel(struct drbd_device *device, size_t offset, 1191b411b363SPhilipp Reisner size_t number, unsigned long *buffer); 119219f843aaSLars Ellenberg /* for _drbd_send_bitmap */ 1193b30ab791SAndreas Gruenbacher extern void drbd_bm_get_lel(struct drbd_device *device, size_t offset, 1194b411b363SPhilipp Reisner size_t number, unsigned long *buffer); 1195b411b363SPhilipp Reisner 1196b30ab791SAndreas Gruenbacher extern void drbd_bm_lock(struct drbd_device *device, char *why, enum bm_flag flags); 1197b30ab791SAndreas Gruenbacher extern void drbd_bm_unlock(struct drbd_device *device); 1198b411b363SPhilipp Reisner /* drbd_main.c */ 1199b411b363SPhilipp Reisner 1200b411b363SPhilipp Reisner extern struct kmem_cache *drbd_request_cache; 12016c852becSAndreas Gruenbacher extern struct kmem_cache *drbd_ee_cache; /* peer requests */ 1202b411b363SPhilipp Reisner extern struct kmem_cache *drbd_bm_ext_cache; /* bitmap extents */ 1203b411b363SPhilipp Reisner extern struct kmem_cache *drbd_al_ext_cache; /* activity log extents */ 1204b411b363SPhilipp Reisner extern mempool_t *drbd_request_mempool; 1205b411b363SPhilipp Reisner extern mempool_t *drbd_ee_mempool; 1206b411b363SPhilipp Reisner 12074281808fSLars Ellenberg /* drbd's page pool, used to buffer data received from the peer, 12084281808fSLars Ellenberg * or data requested by the peer. 12094281808fSLars Ellenberg * 12104281808fSLars Ellenberg * This does not have an emergency reserve. 12114281808fSLars Ellenberg * 12124281808fSLars Ellenberg * When allocating from this pool, it first takes pages from the pool. 12134281808fSLars Ellenberg * Only if the pool is depleted will try to allocate from the system. 12144281808fSLars Ellenberg * 12154281808fSLars Ellenberg * The assumption is that pages taken from this pool will be processed, 12164281808fSLars Ellenberg * and given back, "quickly", and then can be recycled, so we can avoid 12174281808fSLars Ellenberg * frequent calls to alloc_page(), and still will be able to make progress even 12184281808fSLars Ellenberg * under memory pressure. 12194281808fSLars Ellenberg */ 12204281808fSLars Ellenberg extern struct page *drbd_pp_pool; 1221b411b363SPhilipp Reisner extern spinlock_t drbd_pp_lock; 1222b411b363SPhilipp Reisner extern int drbd_pp_vacant; 1223b411b363SPhilipp Reisner extern wait_queue_head_t drbd_pp_wait; 1224b411b363SPhilipp Reisner 12254281808fSLars Ellenberg /* We also need a standard (emergency-reserve backed) page pool 12264281808fSLars Ellenberg * for meta data IO (activity log, bitmap). 12274281808fSLars Ellenberg * We can keep it global, as long as it is used as "N pages at a time". 12284281808fSLars Ellenberg * 128 should be plenty, currently we probably can get away with as few as 1. 12294281808fSLars Ellenberg */ 12304281808fSLars Ellenberg #define DRBD_MIN_POOL_PAGES 128 12314281808fSLars Ellenberg extern mempool_t *drbd_md_io_page_pool; 12324281808fSLars Ellenberg 12339476f39dSLars Ellenberg /* We also need to make sure we get a bio 12349476f39dSLars Ellenberg * when we need it for housekeeping purposes */ 12359476f39dSLars Ellenberg extern struct bio_set *drbd_md_io_bio_set; 12369476f39dSLars Ellenberg /* to allocate from that set */ 12379476f39dSLars Ellenberg extern struct bio *bio_alloc_drbd(gfp_t gfp_mask); 12389476f39dSLars Ellenberg 1239b411b363SPhilipp Reisner extern rwlock_t global_state_lock; 1240b411b363SPhilipp Reisner 1241bde89a9eSAndreas Gruenbacher extern int conn_lowest_minor(struct drbd_connection *connection); 1242a6b32bc3SAndreas Gruenbacher enum drbd_ret_code drbd_create_minor(struct drbd_connection *connection, unsigned int minor, int vnr); 124305a10ec7SAndreas Gruenbacher extern void drbd_destroy_device(struct kref *kref); 1244803ea134SAndreas Gruenbacher extern void drbd_delete_minor(struct drbd_device *mdev); 1245b411b363SPhilipp Reisner 124677c556f6SAndreas Gruenbacher extern struct drbd_resource *drbd_create_resource(const char *name); 124777c556f6SAndreas Gruenbacher extern void drbd_free_resource(struct drbd_resource *resource); 124877c556f6SAndreas Gruenbacher 1249eb6bea67SAndreas Gruenbacher extern int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts); 1250bde89a9eSAndreas Gruenbacher extern struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts); 125105a10ec7SAndreas Gruenbacher extern void drbd_destroy_connection(struct kref *kref); 1252bde89a9eSAndreas Gruenbacher extern struct drbd_connection *conn_get_by_addrs(void *my_addr, int my_addr_len, 1253089c075dSAndreas Gruenbacher void *peer_addr, int peer_addr_len); 12544bc76048SAndreas Gruenbacher extern struct drbd_resource *drbd_find_resource(const char *name); 125577c556f6SAndreas Gruenbacher extern void drbd_destroy_resource(struct kref *kref); 1256bde89a9eSAndreas Gruenbacher extern void conn_free_crypto(struct drbd_connection *connection); 1257b411b363SPhilipp Reisner 1258b411b363SPhilipp Reisner extern int proc_details; 1259b411b363SPhilipp Reisner 1260b411b363SPhilipp Reisner /* drbd_req */ 1261113fef9eSLars Ellenberg extern void do_submit(struct work_struct *ws); 126254761697SAndreas Gruenbacher extern void __drbd_make_request(struct drbd_device *, struct bio *, unsigned long); 12635a7bbad2SChristoph Hellwig extern void drbd_make_request(struct request_queue *q, struct bio *bio); 1264b30ab791SAndreas Gruenbacher extern int drbd_read_remote(struct drbd_device *device, struct drbd_request *req); 1265b411b363SPhilipp Reisner extern int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec); 1266b411b363SPhilipp Reisner extern int is_valid_ar_handle(struct drbd_request *, sector_t); 1267b411b363SPhilipp Reisner 1268b411b363SPhilipp Reisner 1269b411b363SPhilipp Reisner /* drbd_nl.c */ 12708432b314SLars Ellenberg extern int drbd_msg_put_info(const char *info); 1271b30ab791SAndreas Gruenbacher extern void drbd_suspend_io(struct drbd_device *device); 1272b30ab791SAndreas Gruenbacher extern void drbd_resume_io(struct drbd_device *device); 1273b411b363SPhilipp Reisner extern char *ppsize(char *buf, unsigned long long size); 127454761697SAndreas Gruenbacher extern sector_t drbd_new_dev_size(struct drbd_device *, struct drbd_backing_dev *, sector_t, int); 1275e96c9633SPhilipp Reisner enum determine_dev_size { 1276d752b269SPhilipp Reisner DS_ERROR_SHRINK = -3, 1277d752b269SPhilipp Reisner DS_ERROR_SPACE_MD = -2, 1278e96c9633SPhilipp Reisner DS_ERROR = -1, 1279e96c9633SPhilipp Reisner DS_UNCHANGED = 0, 1280e96c9633SPhilipp Reisner DS_SHRUNK = 1, 128157737adcSPhilipp Reisner DS_GREW = 2, 128257737adcSPhilipp Reisner DS_GREW_FROM_ZERO = 3, 1283e96c9633SPhilipp Reisner }; 1284d752b269SPhilipp Reisner extern enum determine_dev_size 128554761697SAndreas Gruenbacher drbd_determine_dev_size(struct drbd_device *, enum dds_flags, struct resize_parms *) __must_hold(local); 128654761697SAndreas Gruenbacher extern void resync_after_online_grow(struct drbd_device *); 1287b30ab791SAndreas Gruenbacher extern void drbd_reconsider_max_bio_size(struct drbd_device *device); 1288b30ab791SAndreas Gruenbacher extern enum drbd_state_rv drbd_set_role(struct drbd_device *device, 1289bf885f8aSAndreas Gruenbacher enum drbd_role new_role, 1290b411b363SPhilipp Reisner int force); 1291bde89a9eSAndreas Gruenbacher extern bool conn_try_outdate_peer(struct drbd_connection *connection); 1292bde89a9eSAndreas Gruenbacher extern void conn_try_outdate_peer_async(struct drbd_connection *connection); 1293b30ab791SAndreas Gruenbacher extern int drbd_khelper(struct drbd_device *device, char *cmd); 1294b411b363SPhilipp Reisner 1295b411b363SPhilipp Reisner /* drbd_worker.c */ 1296b411b363SPhilipp Reisner extern int drbd_worker(struct drbd_thread *thi); 1297b30ab791SAndreas Gruenbacher enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor); 1298b30ab791SAndreas Gruenbacher void drbd_resync_after_changed(struct drbd_device *device); 1299b30ab791SAndreas Gruenbacher extern void drbd_start_resync(struct drbd_device *device, enum drbd_conns side); 1300b30ab791SAndreas Gruenbacher extern void resume_next_sg(struct drbd_device *device); 1301b30ab791SAndreas Gruenbacher extern void suspend_other_sg(struct drbd_device *device); 1302b30ab791SAndreas Gruenbacher extern int drbd_resync_finished(struct drbd_device *device); 1303b411b363SPhilipp Reisner /* maybe rather drbd_main.c ? */ 1304b30ab791SAndreas Gruenbacher extern void *drbd_md_get_buffer(struct drbd_device *device); 1305b30ab791SAndreas Gruenbacher extern void drbd_md_put_buffer(struct drbd_device *device); 1306b30ab791SAndreas Gruenbacher extern int drbd_md_sync_page_io(struct drbd_device *device, 1307b411b363SPhilipp Reisner struct drbd_backing_dev *bdev, sector_t sector, int rw); 130854761697SAndreas Gruenbacher extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); 1309b30ab791SAndreas Gruenbacher extern void wait_until_done_or_force_detached(struct drbd_device *device, 131044edfb0dSLars Ellenberg struct drbd_backing_dev *bdev, unsigned int *done); 1311b30ab791SAndreas Gruenbacher extern void drbd_rs_controller_reset(struct drbd_device *device); 1312b411b363SPhilipp Reisner 1313b30ab791SAndreas Gruenbacher static inline void ov_out_of_sync_print(struct drbd_device *device) 1314b411b363SPhilipp Reisner { 1315b30ab791SAndreas Gruenbacher if (device->ov_last_oos_size) { 1316d0180171SAndreas Gruenbacher drbd_err(device, "Out of sync: start=%llu, size=%lu (sectors)\n", 1317b30ab791SAndreas Gruenbacher (unsigned long long)device->ov_last_oos_start, 1318b30ab791SAndreas Gruenbacher (unsigned long)device->ov_last_oos_size); 1319b411b363SPhilipp Reisner } 1320b30ab791SAndreas Gruenbacher device->ov_last_oos_size = 0; 1321b411b363SPhilipp Reisner } 1322b411b363SPhilipp Reisner 1323b411b363SPhilipp Reisner 132454761697SAndreas Gruenbacher extern void drbd_csum_bio(struct drbd_device *, struct crypto_hash *, struct bio *, void *); 132554761697SAndreas Gruenbacher extern void drbd_csum_ee(struct drbd_device *, struct crypto_hash *, 1326f6ffca9fSAndreas Gruenbacher struct drbd_peer_request *, void *); 1327b411b363SPhilipp Reisner /* worker callbacks */ 132899920dc5SAndreas Gruenbacher extern int w_e_end_data_req(struct drbd_work *, int); 132999920dc5SAndreas Gruenbacher extern int w_e_end_rsdata_req(struct drbd_work *, int); 133099920dc5SAndreas Gruenbacher extern int w_e_end_csum_rs_req(struct drbd_work *, int); 133199920dc5SAndreas Gruenbacher extern int w_e_end_ov_reply(struct drbd_work *, int); 133299920dc5SAndreas Gruenbacher extern int w_e_end_ov_req(struct drbd_work *, int); 133399920dc5SAndreas Gruenbacher extern int w_ov_finished(struct drbd_work *, int); 133499920dc5SAndreas Gruenbacher extern int w_resync_timer(struct drbd_work *, int); 133599920dc5SAndreas Gruenbacher extern int w_send_write_hint(struct drbd_work *, int); 133699920dc5SAndreas Gruenbacher extern int w_make_resync_request(struct drbd_work *, int); 133799920dc5SAndreas Gruenbacher extern int w_send_dblock(struct drbd_work *, int); 133899920dc5SAndreas Gruenbacher extern int w_send_read_req(struct drbd_work *, int); 133999920dc5SAndreas Gruenbacher extern int w_prev_work_done(struct drbd_work *, int); 134099920dc5SAndreas Gruenbacher extern int w_e_reissue(struct drbd_work *, int); 134199920dc5SAndreas Gruenbacher extern int w_restart_disk_io(struct drbd_work *, int); 13428f7bed77SAndreas Gruenbacher extern int w_send_out_of_sync(struct drbd_work *, int); 134399920dc5SAndreas Gruenbacher extern int w_start_resync(struct drbd_work *, int); 1344b411b363SPhilipp Reisner 1345b411b363SPhilipp Reisner extern void resync_timer_fn(unsigned long data); 1346370a43e7SPhilipp Reisner extern void start_resync_timer_fn(unsigned long data); 1347b411b363SPhilipp Reisner 1348b411b363SPhilipp Reisner /* drbd_receiver.c */ 1349b30ab791SAndreas Gruenbacher extern int drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector); 135054761697SAndreas Gruenbacher extern int drbd_submit_peer_request(struct drbd_device *, 1351fbe29decSAndreas Gruenbacher struct drbd_peer_request *, const unsigned, 1352fbe29decSAndreas Gruenbacher const int); 135354761697SAndreas Gruenbacher extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); 135454761697SAndreas Gruenbacher extern struct drbd_peer_request *drbd_alloc_peer_req(struct drbd_device *, u64, 13550db55363SAndreas Gruenbacher sector_t, unsigned int, 1356f6ffca9fSAndreas Gruenbacher gfp_t) __must_hold(local); 135754761697SAndreas Gruenbacher extern void __drbd_free_peer_req(struct drbd_device *, struct drbd_peer_request *, 1358f6ffca9fSAndreas Gruenbacher int); 13593967deb1SAndreas Gruenbacher #define drbd_free_peer_req(m,e) __drbd_free_peer_req(m, e, 0) 13603967deb1SAndreas Gruenbacher #define drbd_free_net_peer_req(m,e) __drbd_free_peer_req(m, e, 1) 136154761697SAndreas Gruenbacher extern struct page *drbd_alloc_pages(struct drbd_device *, unsigned int, bool); 1362b30ab791SAndreas Gruenbacher extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled); 1363b30ab791SAndreas Gruenbacher extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed); 1364bde89a9eSAndreas Gruenbacher extern void conn_flush_workqueue(struct drbd_connection *connection); 1365b30ab791SAndreas Gruenbacher extern int drbd_connected(struct drbd_device *device); 1366b30ab791SAndreas Gruenbacher static inline void drbd_flush_workqueue(struct drbd_device *device) 1367b411b363SPhilipp Reisner { 1368a6b32bc3SAndreas Gruenbacher conn_flush_workqueue(first_peer_device(device)->connection); 13690e29d163SPhilipp Reisner } 1370b411b363SPhilipp Reisner 1371ed439848SLars Ellenberg /* Yes, there is kernel_setsockopt, but only since 2.6.18. 1372ed439848SLars Ellenberg * So we have our own copy of it here. */ 1373b411b363SPhilipp Reisner static inline int drbd_setsockopt(struct socket *sock, int level, int optname, 1374ed439848SLars Ellenberg char *optval, int optlen) 1375b411b363SPhilipp Reisner { 1376ed439848SLars Ellenberg mm_segment_t oldfs = get_fs(); 1377ed439848SLars Ellenberg char __user *uoptval; 1378b411b363SPhilipp Reisner int err; 1379ed439848SLars Ellenberg 1380ed439848SLars Ellenberg uoptval = (char __user __force *)optval; 1381ed439848SLars Ellenberg 1382ed439848SLars Ellenberg set_fs(KERNEL_DS); 1383b411b363SPhilipp Reisner if (level == SOL_SOCKET) 1384ed439848SLars Ellenberg err = sock_setsockopt(sock, level, optname, uoptval, optlen); 1385b411b363SPhilipp Reisner else 1386ed439848SLars Ellenberg err = sock->ops->setsockopt(sock, level, optname, uoptval, 1387b411b363SPhilipp Reisner optlen); 1388ed439848SLars Ellenberg set_fs(oldfs); 1389b411b363SPhilipp Reisner return err; 1390b411b363SPhilipp Reisner } 1391b411b363SPhilipp Reisner 1392b411b363SPhilipp Reisner static inline void drbd_tcp_cork(struct socket *sock) 1393b411b363SPhilipp Reisner { 1394ed439848SLars Ellenberg int val = 1; 1395b411b363SPhilipp Reisner (void) drbd_setsockopt(sock, SOL_TCP, TCP_CORK, 1396ed439848SLars Ellenberg (char*)&val, sizeof(val)); 1397b411b363SPhilipp Reisner } 1398b411b363SPhilipp Reisner 1399b411b363SPhilipp Reisner static inline void drbd_tcp_uncork(struct socket *sock) 1400b411b363SPhilipp Reisner { 1401ed439848SLars Ellenberg int val = 0; 1402b411b363SPhilipp Reisner (void) drbd_setsockopt(sock, SOL_TCP, TCP_CORK, 1403ed439848SLars Ellenberg (char*)&val, sizeof(val)); 1404b411b363SPhilipp Reisner } 1405b411b363SPhilipp Reisner 1406b411b363SPhilipp Reisner static inline void drbd_tcp_nodelay(struct socket *sock) 1407b411b363SPhilipp Reisner { 1408ed439848SLars Ellenberg int val = 1; 1409b411b363SPhilipp Reisner (void) drbd_setsockopt(sock, SOL_TCP, TCP_NODELAY, 1410ed439848SLars Ellenberg (char*)&val, sizeof(val)); 1411b411b363SPhilipp Reisner } 1412b411b363SPhilipp Reisner 1413b411b363SPhilipp Reisner static inline void drbd_tcp_quickack(struct socket *sock) 1414b411b363SPhilipp Reisner { 1415ed439848SLars Ellenberg int val = 2; 1416b411b363SPhilipp Reisner (void) drbd_setsockopt(sock, SOL_TCP, TCP_QUICKACK, 1417ed439848SLars Ellenberg (char*)&val, sizeof(val)); 1418b411b363SPhilipp Reisner } 1419b411b363SPhilipp Reisner 1420bde89a9eSAndreas Gruenbacher void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ordering_e wo); 1421b411b363SPhilipp Reisner 1422b411b363SPhilipp Reisner /* drbd_proc.c */ 1423b411b363SPhilipp Reisner extern struct proc_dir_entry *drbd_proc; 14247d4e9d09SEmese Revfy extern const struct file_operations drbd_proc_fops; 1425b411b363SPhilipp Reisner extern const char *drbd_conn_str(enum drbd_conns s); 1426b411b363SPhilipp Reisner extern const char *drbd_role_str(enum drbd_role s); 1427b411b363SPhilipp Reisner 1428b411b363SPhilipp Reisner /* drbd_actlog.c */ 1429b30ab791SAndreas Gruenbacher extern int drbd_al_begin_io_nonblock(struct drbd_device *device, struct drbd_interval *i); 1430b30ab791SAndreas Gruenbacher extern void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate); 1431b30ab791SAndreas Gruenbacher extern bool drbd_al_begin_io_fastpath(struct drbd_device *device, struct drbd_interval *i); 1432b30ab791SAndreas Gruenbacher extern void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i, bool delegate); 1433b30ab791SAndreas Gruenbacher extern void drbd_al_complete_io(struct drbd_device *device, struct drbd_interval *i); 1434b30ab791SAndreas Gruenbacher extern void drbd_rs_complete_io(struct drbd_device *device, sector_t sector); 1435b30ab791SAndreas Gruenbacher extern int drbd_rs_begin_io(struct drbd_device *device, sector_t sector); 1436b30ab791SAndreas Gruenbacher extern int drbd_try_rs_begin_io(struct drbd_device *device, sector_t sector); 1437b30ab791SAndreas Gruenbacher extern void drbd_rs_cancel_all(struct drbd_device *device); 1438b30ab791SAndreas Gruenbacher extern int drbd_rs_del_all(struct drbd_device *device); 1439b30ab791SAndreas Gruenbacher extern void drbd_rs_failed_io(struct drbd_device *device, 1440b411b363SPhilipp Reisner sector_t sector, int size); 1441b30ab791SAndreas Gruenbacher extern void drbd_advance_rs_marks(struct drbd_device *device, unsigned long still_to_go); 1442b30ab791SAndreas Gruenbacher extern void __drbd_set_in_sync(struct drbd_device *device, sector_t sector, 1443b411b363SPhilipp Reisner int size, const char *file, const unsigned int line); 1444b30ab791SAndreas Gruenbacher #define drbd_set_in_sync(device, sector, size) \ 1445b30ab791SAndreas Gruenbacher __drbd_set_in_sync(device, sector, size, __FILE__, __LINE__) 1446b30ab791SAndreas Gruenbacher extern int __drbd_set_out_of_sync(struct drbd_device *device, sector_t sector, 1447b411b363SPhilipp Reisner int size, const char *file, const unsigned int line); 1448b30ab791SAndreas Gruenbacher #define drbd_set_out_of_sync(device, sector, size) \ 1449b30ab791SAndreas Gruenbacher __drbd_set_out_of_sync(device, sector, size, __FILE__, __LINE__) 1450b30ab791SAndreas Gruenbacher extern void drbd_al_shrink(struct drbd_device *device); 145154761697SAndreas Gruenbacher extern int drbd_initialize_al(struct drbd_device *, void *); 1452b411b363SPhilipp Reisner 1453b411b363SPhilipp Reisner /* drbd_nl.c */ 14543b98c0c2SLars Ellenberg /* state info broadcast */ 14553b98c0c2SLars Ellenberg struct sib_info { 14563b98c0c2SLars Ellenberg enum drbd_state_info_bcast_reason sib_reason; 14573b98c0c2SLars Ellenberg union { 14583b98c0c2SLars Ellenberg struct { 14593b98c0c2SLars Ellenberg char *helper_name; 14603b98c0c2SLars Ellenberg unsigned helper_exit_code; 14613b98c0c2SLars Ellenberg }; 14623b98c0c2SLars Ellenberg struct { 14633b98c0c2SLars Ellenberg union drbd_state os; 14643b98c0c2SLars Ellenberg union drbd_state ns; 14653b98c0c2SLars Ellenberg }; 14663b98c0c2SLars Ellenberg }; 14673b98c0c2SLars Ellenberg }; 1468b30ab791SAndreas Gruenbacher void drbd_bcast_event(struct drbd_device *device, const struct sib_info *sib); 1469b411b363SPhilipp Reisner 1470b411b363SPhilipp Reisner /* 1471b411b363SPhilipp Reisner * inline helper functions 1472b411b363SPhilipp Reisner *************************/ 1473b411b363SPhilipp Reisner 147445bb912bSLars Ellenberg /* see also page_chain_add and friends in drbd_receiver.c */ 147545bb912bSLars Ellenberg static inline struct page *page_chain_next(struct page *page) 147645bb912bSLars Ellenberg { 147745bb912bSLars Ellenberg return (struct page *)page_private(page); 147845bb912bSLars Ellenberg } 147945bb912bSLars Ellenberg #define page_chain_for_each(page) \ 148045bb912bSLars Ellenberg for (; page && ({ prefetch(page_chain_next(page)); 1; }); \ 148145bb912bSLars Ellenberg page = page_chain_next(page)) 148245bb912bSLars Ellenberg #define page_chain_for_each_safe(page, n) \ 148345bb912bSLars Ellenberg for (; page && ({ n = page_chain_next(page); 1; }); page = n) 148445bb912bSLars Ellenberg 148545bb912bSLars Ellenberg 1486045417f7SAndreas Gruenbacher static inline int drbd_peer_req_has_active_page(struct drbd_peer_request *peer_req) 148745bb912bSLars Ellenberg { 1488db830c46SAndreas Gruenbacher struct page *page = peer_req->pages; 148945bb912bSLars Ellenberg page_chain_for_each(page) { 149045bb912bSLars Ellenberg if (page_count(page) > 1) 149145bb912bSLars Ellenberg return 1; 149245bb912bSLars Ellenberg } 149345bb912bSLars Ellenberg return 0; 149445bb912bSLars Ellenberg } 149545bb912bSLars Ellenberg 1496bf885f8aSAndreas Gruenbacher static inline enum drbd_state_rv 1497b30ab791SAndreas Gruenbacher _drbd_set_state(struct drbd_device *device, union drbd_state ns, 1498bf885f8aSAndreas Gruenbacher enum chg_state_flags flags, struct completion *done) 1499b411b363SPhilipp Reisner { 1500bf885f8aSAndreas Gruenbacher enum drbd_state_rv rv; 1501b411b363SPhilipp Reisner 1502b411b363SPhilipp Reisner read_lock(&global_state_lock); 1503b30ab791SAndreas Gruenbacher rv = __drbd_set_state(device, ns, flags, done); 1504b411b363SPhilipp Reisner read_unlock(&global_state_lock); 1505b411b363SPhilipp Reisner 1506b411b363SPhilipp Reisner return rv; 1507b411b363SPhilipp Reisner } 1508b411b363SPhilipp Reisner 1509b30ab791SAndreas Gruenbacher static inline union drbd_state drbd_read_state(struct drbd_device *device) 1510b411b363SPhilipp Reisner { 151178bae59bSPhilipp Reisner union drbd_state rv; 151278bae59bSPhilipp Reisner 1513b30ab791SAndreas Gruenbacher rv.i = device->state.i; 1514a6b32bc3SAndreas Gruenbacher rv.susp = first_peer_device(device)->connection->susp; 1515a6b32bc3SAndreas Gruenbacher rv.susp_nod = first_peer_device(device)->connection->susp_nod; 1516a6b32bc3SAndreas Gruenbacher rv.susp_fen = first_peer_device(device)->connection->susp_fen; 151778bae59bSPhilipp Reisner 151878bae59bSPhilipp Reisner return rv; 1519b411b363SPhilipp Reisner } 1520b411b363SPhilipp Reisner 1521383606e0SLars Ellenberg enum drbd_force_detach_flags { 1522a2a3c74fSLars Ellenberg DRBD_READ_ERROR, 1523a2a3c74fSLars Ellenberg DRBD_WRITE_ERROR, 1524383606e0SLars Ellenberg DRBD_META_IO_ERROR, 1525383606e0SLars Ellenberg DRBD_FORCE_DETACH, 1526383606e0SLars Ellenberg }; 1527383606e0SLars Ellenberg 1528b411b363SPhilipp Reisner #define __drbd_chk_io_error(m,f) __drbd_chk_io_error_(m,f, __func__) 1529b30ab791SAndreas Gruenbacher static inline void __drbd_chk_io_error_(struct drbd_device *device, 1530a2a3c74fSLars Ellenberg enum drbd_force_detach_flags df, 1531383606e0SLars Ellenberg const char *where) 1532b411b363SPhilipp Reisner { 1533daeda1ccSPhilipp Reisner enum drbd_io_error_p ep; 1534daeda1ccSPhilipp Reisner 1535daeda1ccSPhilipp Reisner rcu_read_lock(); 1536b30ab791SAndreas Gruenbacher ep = rcu_dereference(device->ldev->disk_conf)->on_io_error; 1537daeda1ccSPhilipp Reisner rcu_read_unlock(); 1538daeda1ccSPhilipp Reisner switch (ep) { 1539daeda1ccSPhilipp Reisner case EP_PASS_ON: /* FIXME would this be better named "Ignore"? */ 1540a2a3c74fSLars Ellenberg if (df == DRBD_READ_ERROR || df == DRBD_WRITE_ERROR) { 15417383506cSLars Ellenberg if (__ratelimit(&drbd_ratelimit_state)) 1542d0180171SAndreas Gruenbacher drbd_err(device, "Local IO failed in %s.\n", where); 1543b30ab791SAndreas Gruenbacher if (device->state.disk > D_INCONSISTENT) 1544b30ab791SAndreas Gruenbacher _drbd_set_state(_NS(device, disk, D_INCONSISTENT), CS_HARD, NULL); 1545b411b363SPhilipp Reisner break; 1546b411b363SPhilipp Reisner } 1547a2a3c74fSLars Ellenberg /* NOTE fall through for DRBD_META_IO_ERROR or DRBD_FORCE_DETACH */ 1548b411b363SPhilipp Reisner case EP_DETACH: 1549b411b363SPhilipp Reisner case EP_CALL_HELPER: 1550a2a3c74fSLars Ellenberg /* Remember whether we saw a READ or WRITE error. 1551a2a3c74fSLars Ellenberg * 1552a2a3c74fSLars Ellenberg * Recovery of the affected area for WRITE failure is covered 1553a2a3c74fSLars Ellenberg * by the activity log. 1554a2a3c74fSLars Ellenberg * READ errors may fall outside that area though. Certain READ 1555a2a3c74fSLars Ellenberg * errors can be "healed" by writing good data to the affected 1556a2a3c74fSLars Ellenberg * blocks, which triggers block re-allocation in lower layers. 1557a2a3c74fSLars Ellenberg * 1558a2a3c74fSLars Ellenberg * If we can not write the bitmap after a READ error, 1559a2a3c74fSLars Ellenberg * we may need to trigger a full sync (see w_go_diskless()). 1560a2a3c74fSLars Ellenberg * 1561a2a3c74fSLars Ellenberg * Force-detach is not really an IO error, but rather a 1562a2a3c74fSLars Ellenberg * desperate measure to try to deal with a completely 1563a2a3c74fSLars Ellenberg * unresponsive lower level IO stack. 1564a2a3c74fSLars Ellenberg * Still it should be treated as a WRITE error. 1565a2a3c74fSLars Ellenberg * 1566a2a3c74fSLars Ellenberg * Meta IO error is always WRITE error: 1567a2a3c74fSLars Ellenberg * we read meta data only once during attach, 1568a2a3c74fSLars Ellenberg * which will fail in case of errors. 1569a2a3c74fSLars Ellenberg */ 1570b30ab791SAndreas Gruenbacher set_bit(WAS_IO_ERROR, &device->flags); 1571a2a3c74fSLars Ellenberg if (df == DRBD_READ_ERROR) 1572b30ab791SAndreas Gruenbacher set_bit(WAS_READ_ERROR, &device->flags); 1573a2a3c74fSLars Ellenberg if (df == DRBD_FORCE_DETACH) 1574b30ab791SAndreas Gruenbacher set_bit(FORCE_DETACH, &device->flags); 1575b30ab791SAndreas Gruenbacher if (device->state.disk > D_FAILED) { 1576b30ab791SAndreas Gruenbacher _drbd_set_state(_NS(device, disk, D_FAILED), CS_HARD, NULL); 1577d0180171SAndreas Gruenbacher drbd_err(device, 157882f59cc6SLars Ellenberg "Local IO failed in %s. Detaching...\n", where); 1579b411b363SPhilipp Reisner } 1580b411b363SPhilipp Reisner break; 1581b411b363SPhilipp Reisner } 1582b411b363SPhilipp Reisner } 1583b411b363SPhilipp Reisner 1584b411b363SPhilipp Reisner /** 1585b411b363SPhilipp Reisner * drbd_chk_io_error: Handle the on_io_error setting, should be called from all io completion handlers 1586b30ab791SAndreas Gruenbacher * @device: DRBD device. 1587b411b363SPhilipp Reisner * @error: Error code passed to the IO completion callback 1588b411b363SPhilipp Reisner * @forcedetach: Force detach. I.e. the error happened while accessing the meta data 1589b411b363SPhilipp Reisner * 1590b411b363SPhilipp Reisner * See also drbd_main.c:after_state_ch() if (os.disk > D_FAILED && ns.disk == D_FAILED) 1591b411b363SPhilipp Reisner */ 1592b411b363SPhilipp Reisner #define drbd_chk_io_error(m,e,f) drbd_chk_io_error_(m,e,f, __func__) 1593b30ab791SAndreas Gruenbacher static inline void drbd_chk_io_error_(struct drbd_device *device, 1594383606e0SLars Ellenberg int error, enum drbd_force_detach_flags forcedetach, const char *where) 1595b411b363SPhilipp Reisner { 1596b411b363SPhilipp Reisner if (error) { 1597b411b363SPhilipp Reisner unsigned long flags; 1598a6b32bc3SAndreas Gruenbacher spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); 1599b30ab791SAndreas Gruenbacher __drbd_chk_io_error_(device, forcedetach, where); 1600a6b32bc3SAndreas Gruenbacher spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); 1601b411b363SPhilipp Reisner } 1602b411b363SPhilipp Reisner } 1603b411b363SPhilipp Reisner 1604b411b363SPhilipp Reisner 1605b411b363SPhilipp Reisner /** 1606b411b363SPhilipp Reisner * drbd_md_first_sector() - Returns the first sector number of the meta data area 1607b411b363SPhilipp Reisner * @bdev: Meta data block device. 1608b411b363SPhilipp Reisner * 1609b411b363SPhilipp Reisner * BTW, for internal meta data, this happens to be the maximum capacity 1610b411b363SPhilipp Reisner * we could agree upon with our peer node. 1611b411b363SPhilipp Reisner */ 161268e41a43SLars Ellenberg static inline sector_t drbd_md_first_sector(struct drbd_backing_dev *bdev) 1613b411b363SPhilipp Reisner { 161468e41a43SLars Ellenberg switch (bdev->md.meta_dev_idx) { 1615b411b363SPhilipp Reisner case DRBD_MD_INDEX_INTERNAL: 1616b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_INT: 1617b411b363SPhilipp Reisner return bdev->md.md_offset + bdev->md.bm_offset; 1618b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_EXT: 1619b411b363SPhilipp Reisner default: 1620b411b363SPhilipp Reisner return bdev->md.md_offset; 1621b411b363SPhilipp Reisner } 1622b411b363SPhilipp Reisner } 1623b411b363SPhilipp Reisner 1624b411b363SPhilipp Reisner /** 1625b411b363SPhilipp Reisner * drbd_md_last_sector() - Return the last sector number of the meta data area 1626b411b363SPhilipp Reisner * @bdev: Meta data block device. 1627b411b363SPhilipp Reisner */ 1628b411b363SPhilipp Reisner static inline sector_t drbd_md_last_sector(struct drbd_backing_dev *bdev) 1629b411b363SPhilipp Reisner { 163068e41a43SLars Ellenberg switch (bdev->md.meta_dev_idx) { 1631b411b363SPhilipp Reisner case DRBD_MD_INDEX_INTERNAL: 1632b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_INT: 1633ae8bf312SLars Ellenberg return bdev->md.md_offset + MD_4kB_SECT -1; 1634b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_EXT: 1635b411b363SPhilipp Reisner default: 1636ae8bf312SLars Ellenberg return bdev->md.md_offset + bdev->md.md_size_sect -1; 1637b411b363SPhilipp Reisner } 1638b411b363SPhilipp Reisner } 1639b411b363SPhilipp Reisner 1640b411b363SPhilipp Reisner /* Returns the number of 512 byte sectors of the device */ 1641b411b363SPhilipp Reisner static inline sector_t drbd_get_capacity(struct block_device *bdev) 1642b411b363SPhilipp Reisner { 1643b411b363SPhilipp Reisner /* return bdev ? get_capacity(bdev->bd_disk) : 0; */ 164477304d2aSMike Snitzer return bdev ? i_size_read(bdev->bd_inode) >> 9 : 0; 1645b411b363SPhilipp Reisner } 1646b411b363SPhilipp Reisner 1647b411b363SPhilipp Reisner /** 1648b411b363SPhilipp Reisner * drbd_get_max_capacity() - Returns the capacity we announce to out peer 1649b411b363SPhilipp Reisner * @bdev: Meta data block device. 1650b411b363SPhilipp Reisner * 1651b411b363SPhilipp Reisner * returns the capacity we announce to out peer. we clip ourselves at the 1652b411b363SPhilipp Reisner * various MAX_SECTORS, because if we don't, current implementation will 1653b411b363SPhilipp Reisner * oops sooner or later 1654b411b363SPhilipp Reisner */ 1655b411b363SPhilipp Reisner static inline sector_t drbd_get_max_capacity(struct drbd_backing_dev *bdev) 1656b411b363SPhilipp Reisner { 1657b411b363SPhilipp Reisner sector_t s; 1658daeda1ccSPhilipp Reisner 165968e41a43SLars Ellenberg switch (bdev->md.meta_dev_idx) { 1660b411b363SPhilipp Reisner case DRBD_MD_INDEX_INTERNAL: 1661b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_INT: 1662b411b363SPhilipp Reisner s = drbd_get_capacity(bdev->backing_bdev) 1663b411b363SPhilipp Reisner ? min_t(sector_t, DRBD_MAX_SECTORS_FLEX, 166468e41a43SLars Ellenberg drbd_md_first_sector(bdev)) 1665b411b363SPhilipp Reisner : 0; 1666b411b363SPhilipp Reisner break; 1667b411b363SPhilipp Reisner case DRBD_MD_INDEX_FLEX_EXT: 1668b411b363SPhilipp Reisner s = min_t(sector_t, DRBD_MAX_SECTORS_FLEX, 1669b411b363SPhilipp Reisner drbd_get_capacity(bdev->backing_bdev)); 1670b411b363SPhilipp Reisner /* clip at maximum size the meta device can support */ 1671b411b363SPhilipp Reisner s = min_t(sector_t, s, 1672b411b363SPhilipp Reisner BM_EXT_TO_SECT(bdev->md.md_size_sect 1673b411b363SPhilipp Reisner - bdev->md.bm_offset)); 1674b411b363SPhilipp Reisner break; 1675b411b363SPhilipp Reisner default: 1676b411b363SPhilipp Reisner s = min_t(sector_t, DRBD_MAX_SECTORS, 1677b411b363SPhilipp Reisner drbd_get_capacity(bdev->backing_bdev)); 1678b411b363SPhilipp Reisner } 1679b411b363SPhilipp Reisner return s; 1680b411b363SPhilipp Reisner } 1681b411b363SPhilipp Reisner 1682b411b363SPhilipp Reisner /** 16833a4d4eb3SLars Ellenberg * drbd_md_ss() - Return the sector number of our meta data super block 1684b411b363SPhilipp Reisner * @bdev: Meta data block device. 1685b411b363SPhilipp Reisner */ 16863a4d4eb3SLars Ellenberg static inline sector_t drbd_md_ss(struct drbd_backing_dev *bdev) 1687b411b363SPhilipp Reisner { 16883a4d4eb3SLars Ellenberg const int meta_dev_idx = bdev->md.meta_dev_idx; 1689daeda1ccSPhilipp Reisner 16903a4d4eb3SLars Ellenberg if (meta_dev_idx == DRBD_MD_INDEX_FLEX_EXT) 1691b411b363SPhilipp Reisner return 0; 16923a4d4eb3SLars Ellenberg 16933a4d4eb3SLars Ellenberg /* Since drbd08, internal meta data is always "flexible". 1694ae8bf312SLars Ellenberg * position: last 4k aligned block of 4k size */ 16953a4d4eb3SLars Ellenberg if (meta_dev_idx == DRBD_MD_INDEX_INTERNAL || 16963a4d4eb3SLars Ellenberg meta_dev_idx == DRBD_MD_INDEX_FLEX_INT) 1697ae8bf312SLars Ellenberg return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL) - 8; 16983a4d4eb3SLars Ellenberg 16993a4d4eb3SLars Ellenberg /* external, some index; this is the old fixed size layout */ 17003a4d4eb3SLars Ellenberg return MD_128MB_SECT * bdev->md.meta_dev_idx; 1701b411b363SPhilipp Reisner } 1702b411b363SPhilipp Reisner 1703b411b363SPhilipp Reisner static inline void 1704b411b363SPhilipp Reisner drbd_queue_work_front(struct drbd_work_queue *q, struct drbd_work *w) 1705b411b363SPhilipp Reisner { 1706b411b363SPhilipp Reisner unsigned long flags; 1707b411b363SPhilipp Reisner spin_lock_irqsave(&q->q_lock, flags); 1708b411b363SPhilipp Reisner list_add(&w->list, &q->q); 1709b411b363SPhilipp Reisner spin_unlock_irqrestore(&q->q_lock, flags); 17108c0785a5SLars Ellenberg wake_up(&q->q_wait); 1711b411b363SPhilipp Reisner } 1712b411b363SPhilipp Reisner 1713b411b363SPhilipp Reisner static inline void 1714b411b363SPhilipp Reisner drbd_queue_work(struct drbd_work_queue *q, struct drbd_work *w) 1715b411b363SPhilipp Reisner { 1716b411b363SPhilipp Reisner unsigned long flags; 1717b411b363SPhilipp Reisner spin_lock_irqsave(&q->q_lock, flags); 1718b411b363SPhilipp Reisner list_add_tail(&w->list, &q->q); 1719b411b363SPhilipp Reisner spin_unlock_irqrestore(&q->q_lock, flags); 17208c0785a5SLars Ellenberg wake_up(&q->q_wait); 1721b411b363SPhilipp Reisner } 1722b411b363SPhilipp Reisner 1723bde89a9eSAndreas Gruenbacher static inline void wake_asender(struct drbd_connection *connection) 1724b411b363SPhilipp Reisner { 1725bde89a9eSAndreas Gruenbacher if (test_bit(SIGNAL_ASENDER, &connection->flags)) 1726bde89a9eSAndreas Gruenbacher force_sig(DRBD_SIG, connection->asender.task); 1727b411b363SPhilipp Reisner } 1728b411b363SPhilipp Reisner 1729bde89a9eSAndreas Gruenbacher static inline void request_ping(struct drbd_connection *connection) 1730b411b363SPhilipp Reisner { 1731bde89a9eSAndreas Gruenbacher set_bit(SEND_PING, &connection->flags); 1732bde89a9eSAndreas Gruenbacher wake_asender(connection); 1733b411b363SPhilipp Reisner } 1734b411b363SPhilipp Reisner 1735bde89a9eSAndreas Gruenbacher extern void *conn_prepare_command(struct drbd_connection *, struct drbd_socket *); 173654761697SAndreas Gruenbacher extern void *drbd_prepare_command(struct drbd_device *, struct drbd_socket *); 1737bde89a9eSAndreas Gruenbacher extern int conn_send_command(struct drbd_connection *, struct drbd_socket *, 1738dba58587SAndreas Gruenbacher enum drbd_packet, unsigned int, void *, 1739dba58587SAndreas Gruenbacher unsigned int); 174054761697SAndreas Gruenbacher extern int drbd_send_command(struct drbd_device *, struct drbd_socket *, 1741dba58587SAndreas Gruenbacher enum drbd_packet, unsigned int, void *, 1742dba58587SAndreas Gruenbacher unsigned int); 1743b411b363SPhilipp Reisner 1744bde89a9eSAndreas Gruenbacher extern int drbd_send_ping(struct drbd_connection *connection); 1745bde89a9eSAndreas Gruenbacher extern int drbd_send_ping_ack(struct drbd_connection *connection); 174654761697SAndreas Gruenbacher extern int drbd_send_state_req(struct drbd_device *, union drbd_state, union drbd_state); 1747bde89a9eSAndreas Gruenbacher extern int conn_send_state_req(struct drbd_connection *, union drbd_state, union drbd_state); 1748b411b363SPhilipp Reisner 1749b411b363SPhilipp Reisner static inline void drbd_thread_stop(struct drbd_thread *thi) 1750b411b363SPhilipp Reisner { 175181e84650SAndreas Gruenbacher _drbd_thread_stop(thi, false, true); 1752b411b363SPhilipp Reisner } 1753b411b363SPhilipp Reisner 1754b411b363SPhilipp Reisner static inline void drbd_thread_stop_nowait(struct drbd_thread *thi) 1755b411b363SPhilipp Reisner { 175681e84650SAndreas Gruenbacher _drbd_thread_stop(thi, false, false); 1757b411b363SPhilipp Reisner } 1758b411b363SPhilipp Reisner 1759b411b363SPhilipp Reisner static inline void drbd_thread_restart_nowait(struct drbd_thread *thi) 1760b411b363SPhilipp Reisner { 176181e84650SAndreas Gruenbacher _drbd_thread_stop(thi, true, false); 1762b411b363SPhilipp Reisner } 1763b411b363SPhilipp Reisner 1764b411b363SPhilipp Reisner /* counts how many answer packets packets we expect from our peer, 1765b411b363SPhilipp Reisner * for either explicit application requests, 1766b411b363SPhilipp Reisner * or implicit barrier packets as necessary. 1767b411b363SPhilipp Reisner * increased: 1768b411b363SPhilipp Reisner * w_send_barrier 17698554df1cSAndreas Gruenbacher * _req_mod(req, QUEUE_FOR_NET_WRITE or QUEUE_FOR_NET_READ); 1770b411b363SPhilipp Reisner * it is much easier and equally valid to count what we queue for the 1771b411b363SPhilipp Reisner * worker, even before it actually was queued or send. 1772b411b363SPhilipp Reisner * (drbd_make_request_common; recovery path on read io-error) 1773b411b363SPhilipp Reisner * decreased: 1774b411b363SPhilipp Reisner * got_BarrierAck (respective tl_clear, tl_clear_barrier) 17758554df1cSAndreas Gruenbacher * _req_mod(req, DATA_RECEIVED) 1776b411b363SPhilipp Reisner * [from receive_DataReply] 17778554df1cSAndreas Gruenbacher * _req_mod(req, WRITE_ACKED_BY_PEER or RECV_ACKED_BY_PEER or NEG_ACKED) 1778b411b363SPhilipp Reisner * [from got_BlockAck (P_WRITE_ACK, P_RECV_ACK)] 1779b411b363SPhilipp Reisner * for some reason it is NOT decreased in got_NegAck, 1780b411b363SPhilipp Reisner * but in the resulting cleanup code from report_params. 1781b411b363SPhilipp Reisner * we should try to remember the reason for that... 17828554df1cSAndreas Gruenbacher * _req_mod(req, SEND_FAILED or SEND_CANCELED) 17838554df1cSAndreas Gruenbacher * _req_mod(req, CONNECTION_LOST_WHILE_PENDING) 1784b411b363SPhilipp Reisner * [from tl_clear_barrier] 1785b411b363SPhilipp Reisner */ 1786b30ab791SAndreas Gruenbacher static inline void inc_ap_pending(struct drbd_device *device) 1787b411b363SPhilipp Reisner { 1788b30ab791SAndreas Gruenbacher atomic_inc(&device->ap_pending_cnt); 1789b411b363SPhilipp Reisner } 1790b411b363SPhilipp Reisner 179149559d87SPhilipp Reisner #define ERR_IF_CNT_IS_NEGATIVE(which, func, line) \ 1792b30ab791SAndreas Gruenbacher if (atomic_read(&device->which) < 0) \ 1793d0180171SAndreas Gruenbacher drbd_err(device, "in %s:%d: " #which " = %d < 0 !\n", \ 179449559d87SPhilipp Reisner func, line, \ 1795b30ab791SAndreas Gruenbacher atomic_read(&device->which)) 1796b411b363SPhilipp Reisner 1797b30ab791SAndreas Gruenbacher #define dec_ap_pending(device) _dec_ap_pending(device, __FUNCTION__, __LINE__) 1798b30ab791SAndreas Gruenbacher static inline void _dec_ap_pending(struct drbd_device *device, const char *func, int line) 179949559d87SPhilipp Reisner { 1800b30ab791SAndreas Gruenbacher if (atomic_dec_and_test(&device->ap_pending_cnt)) 1801b30ab791SAndreas Gruenbacher wake_up(&device->misc_wait); 180249559d87SPhilipp Reisner ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt, func, line); 180349559d87SPhilipp Reisner } 1804b411b363SPhilipp Reisner 1805b411b363SPhilipp Reisner /* counts how many resync-related answers we still expect from the peer 1806b411b363SPhilipp Reisner * increase decrease 1807b411b363SPhilipp Reisner * C_SYNC_TARGET sends P_RS_DATA_REQUEST (and expects P_RS_DATA_REPLY) 180825985edcSLucas De Marchi * C_SYNC_SOURCE sends P_RS_DATA_REPLY (and expects P_WRITE_ACK with ID_SYNCER) 1809b411b363SPhilipp Reisner * (or P_NEG_ACK with ID_SYNCER) 1810b411b363SPhilipp Reisner */ 1811b30ab791SAndreas Gruenbacher static inline void inc_rs_pending(struct drbd_device *device) 1812b411b363SPhilipp Reisner { 1813b30ab791SAndreas Gruenbacher atomic_inc(&device->rs_pending_cnt); 1814b411b363SPhilipp Reisner } 1815b411b363SPhilipp Reisner 1816b30ab791SAndreas Gruenbacher #define dec_rs_pending(device) _dec_rs_pending(device, __FUNCTION__, __LINE__) 1817b30ab791SAndreas Gruenbacher static inline void _dec_rs_pending(struct drbd_device *device, const char *func, int line) 181849559d87SPhilipp Reisner { 1819b30ab791SAndreas Gruenbacher atomic_dec(&device->rs_pending_cnt); 182049559d87SPhilipp Reisner ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt, func, line); 182149559d87SPhilipp Reisner } 1822b411b363SPhilipp Reisner 1823b411b363SPhilipp Reisner /* counts how many answers we still need to send to the peer. 1824b411b363SPhilipp Reisner * increased on 1825b411b363SPhilipp Reisner * receive_Data unless protocol A; 1826b411b363SPhilipp Reisner * we need to send a P_RECV_ACK (proto B) 1827b411b363SPhilipp Reisner * or P_WRITE_ACK (proto C) 1828b411b363SPhilipp Reisner * receive_RSDataReply (recv_resync_read) we need to send a P_WRITE_ACK 1829b411b363SPhilipp Reisner * receive_DataRequest (receive_RSDataRequest) we need to send back P_DATA 1830b411b363SPhilipp Reisner * receive_Barrier_* we need to send a P_BARRIER_ACK 1831b411b363SPhilipp Reisner */ 1832b30ab791SAndreas Gruenbacher static inline void inc_unacked(struct drbd_device *device) 1833b411b363SPhilipp Reisner { 1834b30ab791SAndreas Gruenbacher atomic_inc(&device->unacked_cnt); 1835b411b363SPhilipp Reisner } 1836b411b363SPhilipp Reisner 1837b30ab791SAndreas Gruenbacher #define dec_unacked(device) _dec_unacked(device, __FUNCTION__, __LINE__) 1838b30ab791SAndreas Gruenbacher static inline void _dec_unacked(struct drbd_device *device, const char *func, int line) 1839b411b363SPhilipp Reisner { 1840b30ab791SAndreas Gruenbacher atomic_dec(&device->unacked_cnt); 184149559d87SPhilipp Reisner ERR_IF_CNT_IS_NEGATIVE(unacked_cnt, func, line); 1842b411b363SPhilipp Reisner } 1843b411b363SPhilipp Reisner 1844b30ab791SAndreas Gruenbacher #define sub_unacked(device, n) _sub_unacked(device, n, __FUNCTION__, __LINE__) 1845b30ab791SAndreas Gruenbacher static inline void _sub_unacked(struct drbd_device *device, int n, const char *func, int line) 1846b411b363SPhilipp Reisner { 1847b30ab791SAndreas Gruenbacher atomic_sub(n, &device->unacked_cnt); 184849559d87SPhilipp Reisner ERR_IF_CNT_IS_NEGATIVE(unacked_cnt, func, line); 1849b411b363SPhilipp Reisner } 1850b411b363SPhilipp Reisner 1851b411b363SPhilipp Reisner /** 1852b30ab791SAndreas Gruenbacher * get_ldev() - Increase the ref count on device->ldev. Returns 0 if there is no ldev 1853b411b363SPhilipp Reisner * @M: DRBD device. 1854b411b363SPhilipp Reisner * 1855b30ab791SAndreas Gruenbacher * You have to call put_ldev() when finished working with device->ldev. 1856b411b363SPhilipp Reisner */ 1857b411b363SPhilipp Reisner #define get_ldev(M) __cond_lock(local, _get_ldev_if_state(M,D_INCONSISTENT)) 1858b411b363SPhilipp Reisner #define get_ldev_if_state(M,MINS) __cond_lock(local, _get_ldev_if_state(M,MINS)) 1859b411b363SPhilipp Reisner 1860b30ab791SAndreas Gruenbacher static inline void put_ldev(struct drbd_device *device) 1861b411b363SPhilipp Reisner { 1862b30ab791SAndreas Gruenbacher int i = atomic_dec_return(&device->local_cnt); 18639a0d9d03SLars Ellenberg 18649a0d9d03SLars Ellenberg /* This may be called from some endio handler, 18659a0d9d03SLars Ellenberg * so we must not sleep here. */ 18669a0d9d03SLars Ellenberg 1867b411b363SPhilipp Reisner __release(local); 1868*0b0ba1efSAndreas Gruenbacher D_ASSERT(device, i >= 0); 1869e9e6f3ecSLars Ellenberg if (i == 0) { 1870b30ab791SAndreas Gruenbacher if (device->state.disk == D_DISKLESS) 187182f59cc6SLars Ellenberg /* even internal references gone, safe to destroy */ 1872b30ab791SAndreas Gruenbacher drbd_ldev_destroy(device); 1873b30ab791SAndreas Gruenbacher if (device->state.disk == D_FAILED) { 187482f59cc6SLars Ellenberg /* all application IO references gone. */ 1875b30ab791SAndreas Gruenbacher if (!test_and_set_bit(GO_DISKLESS, &device->flags)) 1876a6b32bc3SAndreas Gruenbacher drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->go_diskless); 18779114d795SLars Ellenberg } 1878b30ab791SAndreas Gruenbacher wake_up(&device->misc_wait); 1879b411b363SPhilipp Reisner } 1880e9e6f3ecSLars Ellenberg } 1881b411b363SPhilipp Reisner 1882b411b363SPhilipp Reisner #ifndef __CHECKER__ 1883b30ab791SAndreas Gruenbacher static inline int _get_ldev_if_state(struct drbd_device *device, enum drbd_disk_state mins) 1884b411b363SPhilipp Reisner { 1885b411b363SPhilipp Reisner int io_allowed; 1886b411b363SPhilipp Reisner 188782f59cc6SLars Ellenberg /* never get a reference while D_DISKLESS */ 1888b30ab791SAndreas Gruenbacher if (device->state.disk == D_DISKLESS) 188982f59cc6SLars Ellenberg return 0; 189082f59cc6SLars Ellenberg 1891b30ab791SAndreas Gruenbacher atomic_inc(&device->local_cnt); 1892b30ab791SAndreas Gruenbacher io_allowed = (device->state.disk >= mins); 1893b411b363SPhilipp Reisner if (!io_allowed) 1894b30ab791SAndreas Gruenbacher put_ldev(device); 1895b411b363SPhilipp Reisner return io_allowed; 1896b411b363SPhilipp Reisner } 1897b411b363SPhilipp Reisner #else 1898b30ab791SAndreas Gruenbacher extern int _get_ldev_if_state(struct drbd_device *device, enum drbd_disk_state mins); 1899b411b363SPhilipp Reisner #endif 1900b411b363SPhilipp Reisner 1901b411b363SPhilipp Reisner /* you must have an "get_ldev" reference */ 1902b30ab791SAndreas Gruenbacher static inline void drbd_get_syncer_progress(struct drbd_device *device, 1903b411b363SPhilipp Reisner unsigned long *bits_left, unsigned int *per_mil_done) 1904b411b363SPhilipp Reisner { 19054b0715f0SLars Ellenberg /* this is to break it at compile time when we change that, in case we 19064b0715f0SLars Ellenberg * want to support more than (1<<32) bits on a 32bit arch. */ 1907b30ab791SAndreas Gruenbacher typecheck(unsigned long, device->rs_total); 1908b411b363SPhilipp Reisner 1909b411b363SPhilipp Reisner /* note: both rs_total and rs_left are in bits, i.e. in 1910b411b363SPhilipp Reisner * units of BM_BLOCK_SIZE. 1911b411b363SPhilipp Reisner * for the percentage, we don't care. */ 1912b411b363SPhilipp Reisner 1913b30ab791SAndreas Gruenbacher if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T) 1914b30ab791SAndreas Gruenbacher *bits_left = device->ov_left; 1915439d5953SLars Ellenberg else 1916b30ab791SAndreas Gruenbacher *bits_left = drbd_bm_total_weight(device) - device->rs_failed; 1917b411b363SPhilipp Reisner /* >> 10 to prevent overflow, 1918b411b363SPhilipp Reisner * +1 to prevent division by zero */ 1919b30ab791SAndreas Gruenbacher if (*bits_left > device->rs_total) { 1920b411b363SPhilipp Reisner /* doh. maybe a logic bug somewhere. 1921b411b363SPhilipp Reisner * may also be just a race condition 1922b411b363SPhilipp Reisner * between this and a disconnect during sync. 1923b411b363SPhilipp Reisner * for now, just prevent in-kernel buffer overflow. 1924b411b363SPhilipp Reisner */ 1925b411b363SPhilipp Reisner smp_rmb(); 1926d0180171SAndreas Gruenbacher drbd_warn(device, "cs:%s rs_left=%lu > rs_total=%lu (rs_failed %lu)\n", 1927b30ab791SAndreas Gruenbacher drbd_conn_str(device->state.conn), 1928b30ab791SAndreas Gruenbacher *bits_left, device->rs_total, device->rs_failed); 1929b411b363SPhilipp Reisner *per_mil_done = 0; 1930b411b363SPhilipp Reisner } else { 19314b0715f0SLars Ellenberg /* Make sure the division happens in long context. 19324b0715f0SLars Ellenberg * We allow up to one petabyte storage right now, 19334b0715f0SLars Ellenberg * at a granularity of 4k per bit that is 2**38 bits. 19344b0715f0SLars Ellenberg * After shift right and multiplication by 1000, 19354b0715f0SLars Ellenberg * this should still fit easily into a 32bit long, 19364b0715f0SLars Ellenberg * so we don't need a 64bit division on 32bit arch. 19374b0715f0SLars Ellenberg * Note: currently we don't support such large bitmaps on 32bit 19384b0715f0SLars Ellenberg * arch anyways, but no harm done to be prepared for it here. 19394b0715f0SLars Ellenberg */ 1940b30ab791SAndreas Gruenbacher unsigned int shift = device->rs_total > UINT_MAX ? 16 : 10; 19414b0715f0SLars Ellenberg unsigned long left = *bits_left >> shift; 1942b30ab791SAndreas Gruenbacher unsigned long total = 1UL + (device->rs_total >> shift); 19434b0715f0SLars Ellenberg unsigned long tmp = 1000UL - left * 1000UL/total; 1944b411b363SPhilipp Reisner *per_mil_done = tmp; 1945b411b363SPhilipp Reisner } 1946b411b363SPhilipp Reisner } 1947b411b363SPhilipp Reisner 1948b411b363SPhilipp Reisner 1949b411b363SPhilipp Reisner /* this throttles on-the-fly application requests 1950b411b363SPhilipp Reisner * according to max_buffers settings; 1951b411b363SPhilipp Reisner * maybe re-implement using semaphores? */ 1952b30ab791SAndreas Gruenbacher static inline int drbd_get_max_buffers(struct drbd_device *device) 1953b411b363SPhilipp Reisner { 195444ed167dSPhilipp Reisner struct net_conf *nc; 195544ed167dSPhilipp Reisner int mxb; 195644ed167dSPhilipp Reisner 195744ed167dSPhilipp Reisner rcu_read_lock(); 1958a6b32bc3SAndreas Gruenbacher nc = rcu_dereference(first_peer_device(device)->connection->net_conf); 195944ed167dSPhilipp Reisner mxb = nc ? nc->max_buffers : 1000000; /* arbitrary limit on open requests */ 196044ed167dSPhilipp Reisner rcu_read_unlock(); 196144ed167dSPhilipp Reisner 1962b411b363SPhilipp Reisner return mxb; 1963b411b363SPhilipp Reisner } 1964b411b363SPhilipp Reisner 1965b30ab791SAndreas Gruenbacher static inline int drbd_state_is_stable(struct drbd_device *device) 1966b411b363SPhilipp Reisner { 1967b30ab791SAndreas Gruenbacher union drbd_dev_state s = device->state; 1968b411b363SPhilipp Reisner 1969b411b363SPhilipp Reisner /* DO NOT add a default clause, we want the compiler to warn us 1970b411b363SPhilipp Reisner * for any newly introduced state we may have forgotten to add here */ 1971b411b363SPhilipp Reisner 1972b411b363SPhilipp Reisner switch ((enum drbd_conns)s.conn) { 1973b411b363SPhilipp Reisner /* new io only accepted when there is no connection, ... */ 1974b411b363SPhilipp Reisner case C_STANDALONE: 1975b411b363SPhilipp Reisner case C_WF_CONNECTION: 1976b411b363SPhilipp Reisner /* ... or there is a well established connection. */ 1977b411b363SPhilipp Reisner case C_CONNECTED: 1978b411b363SPhilipp Reisner case C_SYNC_SOURCE: 1979b411b363SPhilipp Reisner case C_SYNC_TARGET: 1980b411b363SPhilipp Reisner case C_VERIFY_S: 1981b411b363SPhilipp Reisner case C_VERIFY_T: 1982b411b363SPhilipp Reisner case C_PAUSED_SYNC_S: 1983b411b363SPhilipp Reisner case C_PAUSED_SYNC_T: 198467531718SPhilipp Reisner case C_AHEAD: 198567531718SPhilipp Reisner case C_BEHIND: 19863719094eSPhilipp Reisner /* transitional states, IO allowed */ 1987b411b363SPhilipp Reisner case C_DISCONNECTING: 1988b411b363SPhilipp Reisner case C_UNCONNECTED: 1989b411b363SPhilipp Reisner case C_TIMEOUT: 1990b411b363SPhilipp Reisner case C_BROKEN_PIPE: 1991b411b363SPhilipp Reisner case C_NETWORK_FAILURE: 1992b411b363SPhilipp Reisner case C_PROTOCOL_ERROR: 1993b411b363SPhilipp Reisner case C_TEAR_DOWN: 1994b411b363SPhilipp Reisner case C_WF_REPORT_PARAMS: 1995b411b363SPhilipp Reisner case C_STARTING_SYNC_S: 1996b411b363SPhilipp Reisner case C_STARTING_SYNC_T: 19973719094eSPhilipp Reisner break; 19983719094eSPhilipp Reisner 19993719094eSPhilipp Reisner /* Allow IO in BM exchange states with new protocols */ 2000b411b363SPhilipp Reisner case C_WF_BITMAP_S: 2001a6b32bc3SAndreas Gruenbacher if (first_peer_device(device)->connection->agreed_pro_version < 96) 20023719094eSPhilipp Reisner return 0; 20033719094eSPhilipp Reisner break; 20043719094eSPhilipp Reisner 20053719094eSPhilipp Reisner /* no new io accepted in these states */ 2006b411b363SPhilipp Reisner case C_WF_BITMAP_T: 2007b411b363SPhilipp Reisner case C_WF_SYNC_UUID: 2008b411b363SPhilipp Reisner case C_MASK: 2009b411b363SPhilipp Reisner /* not "stable" */ 2010b411b363SPhilipp Reisner return 0; 2011b411b363SPhilipp Reisner } 2012b411b363SPhilipp Reisner 2013b411b363SPhilipp Reisner switch ((enum drbd_disk_state)s.disk) { 2014b411b363SPhilipp Reisner case D_DISKLESS: 2015b411b363SPhilipp Reisner case D_INCONSISTENT: 2016b411b363SPhilipp Reisner case D_OUTDATED: 2017b411b363SPhilipp Reisner case D_CONSISTENT: 2018b411b363SPhilipp Reisner case D_UP_TO_DATE: 20195ca1de03SPhilipp Reisner case D_FAILED: 2020b411b363SPhilipp Reisner /* disk state is stable as well. */ 2021b411b363SPhilipp Reisner break; 2022b411b363SPhilipp Reisner 2023d942ae44SPhilipp Reisner /* no new io accepted during transitional states */ 2024b411b363SPhilipp Reisner case D_ATTACHING: 2025b411b363SPhilipp Reisner case D_NEGOTIATING: 2026b411b363SPhilipp Reisner case D_UNKNOWN: 2027b411b363SPhilipp Reisner case D_MASK: 2028b411b363SPhilipp Reisner /* not "stable" */ 2029b411b363SPhilipp Reisner return 0; 2030b411b363SPhilipp Reisner } 2031b411b363SPhilipp Reisner 2032b411b363SPhilipp Reisner return 1; 2033b411b363SPhilipp Reisner } 2034b411b363SPhilipp Reisner 2035b30ab791SAndreas Gruenbacher static inline int drbd_suspended(struct drbd_device *device) 2036fb22c402SPhilipp Reisner { 2037a6b32bc3SAndreas Gruenbacher struct drbd_connection *connection = first_peer_device(device)->connection; 20388e0af25fSPhilipp Reisner 2039bde89a9eSAndreas Gruenbacher return connection->susp || connection->susp_fen || connection->susp_nod; 2040fb22c402SPhilipp Reisner } 2041fb22c402SPhilipp Reisner 2042b30ab791SAndreas Gruenbacher static inline bool may_inc_ap_bio(struct drbd_device *device) 2043b411b363SPhilipp Reisner { 2044b30ab791SAndreas Gruenbacher int mxb = drbd_get_max_buffers(device); 2045b411b363SPhilipp Reisner 2046b30ab791SAndreas Gruenbacher if (drbd_suspended(device)) 20471b881ef7SAndreas Gruenbacher return false; 2048b30ab791SAndreas Gruenbacher if (test_bit(SUSPEND_IO, &device->flags)) 20491b881ef7SAndreas Gruenbacher return false; 2050b411b363SPhilipp Reisner 2051b411b363SPhilipp Reisner /* to avoid potential deadlock or bitmap corruption, 2052b411b363SPhilipp Reisner * in various places, we only allow new application io 2053b411b363SPhilipp Reisner * to start during "stable" states. */ 2054b411b363SPhilipp Reisner 2055b411b363SPhilipp Reisner /* no new io accepted when attaching or detaching the disk */ 2056b30ab791SAndreas Gruenbacher if (!drbd_state_is_stable(device)) 20571b881ef7SAndreas Gruenbacher return false; 2058b411b363SPhilipp Reisner 2059b411b363SPhilipp Reisner /* since some older kernels don't have atomic_add_unless, 2060b411b363SPhilipp Reisner * and we are within the spinlock anyways, we have this workaround. */ 2061b30ab791SAndreas Gruenbacher if (atomic_read(&device->ap_bio_cnt) > mxb) 20621b881ef7SAndreas Gruenbacher return false; 2063b30ab791SAndreas Gruenbacher if (test_bit(BITMAP_IO, &device->flags)) 20641b881ef7SAndreas Gruenbacher return false; 20651b881ef7SAndreas Gruenbacher return true; 2066b411b363SPhilipp Reisner } 2067b411b363SPhilipp Reisner 2068b30ab791SAndreas Gruenbacher static inline bool inc_ap_bio_cond(struct drbd_device *device) 20698869d683SPhilipp Reisner { 20701b881ef7SAndreas Gruenbacher bool rv = false; 20718869d683SPhilipp Reisner 2072a6b32bc3SAndreas Gruenbacher spin_lock_irq(&first_peer_device(device)->connection->req_lock); 2073b30ab791SAndreas Gruenbacher rv = may_inc_ap_bio(device); 20748869d683SPhilipp Reisner if (rv) 2075b30ab791SAndreas Gruenbacher atomic_inc(&device->ap_bio_cnt); 2076a6b32bc3SAndreas Gruenbacher spin_unlock_irq(&first_peer_device(device)->connection->req_lock); 20778869d683SPhilipp Reisner 20788869d683SPhilipp Reisner return rv; 20798869d683SPhilipp Reisner } 20808869d683SPhilipp Reisner 2081b30ab791SAndreas Gruenbacher static inline void inc_ap_bio(struct drbd_device *device) 2082b411b363SPhilipp Reisner { 2083b411b363SPhilipp Reisner /* we wait here 2084b411b363SPhilipp Reisner * as long as the device is suspended 2085b411b363SPhilipp Reisner * until the bitmap is no longer on the fly during connection 2086d942ae44SPhilipp Reisner * handshake as long as we would exceed the max_buffer limit. 2087b411b363SPhilipp Reisner * 2088b411b363SPhilipp Reisner * to avoid races with the reconnect code, 2089b411b363SPhilipp Reisner * we need to atomic_inc within the spinlock. */ 2090b411b363SPhilipp Reisner 2091b30ab791SAndreas Gruenbacher wait_event(device->misc_wait, inc_ap_bio_cond(device)); 2092b411b363SPhilipp Reisner } 2093b411b363SPhilipp Reisner 2094b30ab791SAndreas Gruenbacher static inline void dec_ap_bio(struct drbd_device *device) 2095b411b363SPhilipp Reisner { 2096b30ab791SAndreas Gruenbacher int mxb = drbd_get_max_buffers(device); 2097b30ab791SAndreas Gruenbacher int ap_bio = atomic_dec_return(&device->ap_bio_cnt); 2098b411b363SPhilipp Reisner 2099*0b0ba1efSAndreas Gruenbacher D_ASSERT(device, ap_bio >= 0); 21007ee1fb93SLars Ellenberg 2101b30ab791SAndreas Gruenbacher if (ap_bio == 0 && test_bit(BITMAP_IO, &device->flags)) { 2102b30ab791SAndreas Gruenbacher if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) 2103a6b32bc3SAndreas Gruenbacher drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->bm_io_work.w); 21047ee1fb93SLars Ellenberg } 21057ee1fb93SLars Ellenberg 2106b411b363SPhilipp Reisner /* this currently does wake_up for every dec_ap_bio! 2107b411b363SPhilipp Reisner * maybe rather introduce some type of hysteresis? 2108b411b363SPhilipp Reisner * e.g. (ap_bio == mxb/2 || ap_bio == 0) ? */ 2109b411b363SPhilipp Reisner if (ap_bio < mxb) 2110b30ab791SAndreas Gruenbacher wake_up(&device->misc_wait); 2111b411b363SPhilipp Reisner } 2112b411b363SPhilipp Reisner 2113b30ab791SAndreas Gruenbacher static inline bool verify_can_do_stop_sector(struct drbd_device *device) 211458ffa580SLars Ellenberg { 2115a6b32bc3SAndreas Gruenbacher return first_peer_device(device)->connection->agreed_pro_version >= 97 && 2116a6b32bc3SAndreas Gruenbacher first_peer_device(device)->connection->agreed_pro_version != 100; 211758ffa580SLars Ellenberg } 211858ffa580SLars Ellenberg 2119b30ab791SAndreas Gruenbacher static inline int drbd_set_ed_uuid(struct drbd_device *device, u64 val) 2120b411b363SPhilipp Reisner { 2121b30ab791SAndreas Gruenbacher int changed = device->ed_uuid != val; 2122b30ab791SAndreas Gruenbacher device->ed_uuid = val; 212362b0da3aSLars Ellenberg return changed; 2124b411b363SPhilipp Reisner } 2125b411b363SPhilipp Reisner 2126b30ab791SAndreas Gruenbacher static inline int drbd_queue_order_type(struct drbd_device *device) 2127b411b363SPhilipp Reisner { 2128b411b363SPhilipp Reisner /* sorry, we currently have no working implementation 2129b411b363SPhilipp Reisner * of distributed TCQ stuff */ 2130b411b363SPhilipp Reisner #ifndef QUEUE_ORDERED_NONE 2131b411b363SPhilipp Reisner #define QUEUE_ORDERED_NONE 0 2132b411b363SPhilipp Reisner #endif 2133b411b363SPhilipp Reisner return QUEUE_ORDERED_NONE; 2134b411b363SPhilipp Reisner } 2135b411b363SPhilipp Reisner 2136b30ab791SAndreas Gruenbacher static inline void drbd_md_flush(struct drbd_device *device) 2137b411b363SPhilipp Reisner { 2138b411b363SPhilipp Reisner int r; 2139b411b363SPhilipp Reisner 2140b30ab791SAndreas Gruenbacher if (device->ldev == NULL) { 2141d0180171SAndreas Gruenbacher drbd_warn(device, "device->ldev == NULL in drbd_md_flush\n"); 2142fd0017c1SPhilipp Reisner return; 2143fd0017c1SPhilipp Reisner } 2144fd0017c1SPhilipp Reisner 2145b30ab791SAndreas Gruenbacher if (test_bit(MD_NO_FUA, &device->flags)) 2146b411b363SPhilipp Reisner return; 2147b411b363SPhilipp Reisner 2148b30ab791SAndreas Gruenbacher r = blkdev_issue_flush(device->ldev->md_bdev, GFP_NOIO, NULL); 2149b411b363SPhilipp Reisner if (r) { 2150b30ab791SAndreas Gruenbacher set_bit(MD_NO_FUA, &device->flags); 2151d0180171SAndreas Gruenbacher drbd_err(device, "meta data flush failed with status %d, disabling md-flushes\n", r); 2152b411b363SPhilipp Reisner } 2153b411b363SPhilipp Reisner } 2154b411b363SPhilipp Reisner 215577c556f6SAndreas Gruenbacher static inline struct drbd_connection *first_connection(struct drbd_resource *resource) 215677c556f6SAndreas Gruenbacher { 215777c556f6SAndreas Gruenbacher return list_first_entry(&resource->connections, 215877c556f6SAndreas Gruenbacher struct drbd_connection, connections); 215977c556f6SAndreas Gruenbacher } 216077c556f6SAndreas Gruenbacher 2161b411b363SPhilipp Reisner #endif 2162