]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/block/drbd/drbd_state.c
drbd: Introduce __s32_field in the genetlink macro magic
[mirror_ubuntu-zesty-kernel.git] / drivers / block / drbd / drbd_state.c
CommitLineData
b8907339
PR
1/*
2 drbd_state.c
3
4 This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
5
6 Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
7 Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
8 Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
9
10 Thanks to Carter Burden, Bart Grantham and Gennadiy Nerubayev
11 from Logicworks, Inc. for making SDP replication support possible.
12
13 drbd is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2, or (at your option)
16 any later version.
17
18 drbd is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with drbd; see the file COPYING. If not, write to
25 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 */
27
28#include <linux/drbd_limits.h>
29#include "drbd_int.h"
30#include "drbd_req.h"
31
32struct after_state_chg_work {
33 struct drbd_work w;
34 union drbd_state os;
35 union drbd_state ns;
36 enum chg_state_flags flags;
37 struct completion *done;
38};
39
99920dc5 40static int w_after_state_ch(struct drbd_work *w, int unused);
b8907339
PR
41static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
42 union drbd_state ns, enum chg_state_flags flags);
a75f34ad
PR
43static enum drbd_state_rv is_valid_state(struct drbd_conf *, union drbd_state);
44static enum drbd_state_rv is_valid_soft_transition(union drbd_state, union drbd_state);
3509502d 45static enum drbd_state_rv is_valid_transition(union drbd_state os, union drbd_state ns);
4308a0a3
PR
46static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state ns,
47 const char **warn_sync_abort);
b8907339 48
2aebfabb
PR
49static inline bool is_susp(union drbd_state s)
50{
51 return s.susp || s.susp_nod || s.susp_fen;
52}
53
d0456c72 54bool conn_all_vols_unconf(struct drbd_tconn *tconn)
0e29d163
PR
55{
56 struct drbd_conf *mdev;
695d08fa 57 bool rv = true;
e90285e0 58 int vnr;
0e29d163 59
695d08fa 60 rcu_read_lock();
e90285e0 61 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
d0456c72
LE
62 if (mdev->state.disk != D_DISKLESS ||
63 mdev->state.conn != C_STANDALONE ||
695d08fa
PR
64 mdev->state.role != R_SECONDARY) {
65 rv = false;
66 break;
67 }
0e29d163 68 }
695d08fa
PR
69 rcu_read_unlock();
70
71 return rv;
0e29d163
PR
72}
73
cb703454
PR
74/* Unfortunately the states where not correctly ordered, when
75 they where defined. therefore can not use max_t() here. */
76static enum drbd_role max_role(enum drbd_role role1, enum drbd_role role2)
77{
78 if (role1 == R_PRIMARY || role2 == R_PRIMARY)
79 return R_PRIMARY;
80 if (role1 == R_SECONDARY || role2 == R_SECONDARY)
81 return R_SECONDARY;
82 return R_UNKNOWN;
83}
84static enum drbd_role min_role(enum drbd_role role1, enum drbd_role role2)
85{
86 if (role1 == R_UNKNOWN || role2 == R_UNKNOWN)
87 return R_UNKNOWN;
88 if (role1 == R_SECONDARY || role2 == R_SECONDARY)
89 return R_SECONDARY;
90 return R_PRIMARY;
91}
92
93enum drbd_role conn_highest_role(struct drbd_tconn *tconn)
94{
95 enum drbd_role role = R_UNKNOWN;
96 struct drbd_conf *mdev;
97 int vnr;
98
695d08fa 99 rcu_read_lock();
cb703454
PR
100 idr_for_each_entry(&tconn->volumes, mdev, vnr)
101 role = max_role(role, mdev->state.role);
695d08fa 102 rcu_read_unlock();
cb703454
PR
103
104 return role;
105}
106
107enum drbd_role conn_highest_peer(struct drbd_tconn *tconn)
108{
109 enum drbd_role peer = R_UNKNOWN;
110 struct drbd_conf *mdev;
111 int vnr;
112
695d08fa 113 rcu_read_lock();
cb703454
PR
114 idr_for_each_entry(&tconn->volumes, mdev, vnr)
115 peer = max_role(peer, mdev->state.peer);
695d08fa 116 rcu_read_unlock();
cb703454
PR
117
118 return peer;
119}
120
121enum drbd_disk_state conn_highest_disk(struct drbd_tconn *tconn)
122{
123 enum drbd_disk_state ds = D_DISKLESS;
124 struct drbd_conf *mdev;
125 int vnr;
126
695d08fa 127 rcu_read_lock();
cb703454
PR
128 idr_for_each_entry(&tconn->volumes, mdev, vnr)
129 ds = max_t(enum drbd_disk_state, ds, mdev->state.disk);
695d08fa 130 rcu_read_unlock();
cb703454
PR
131
132 return ds;
133}
134
4669265a
PR
135enum drbd_disk_state conn_lowest_disk(struct drbd_tconn *tconn)
136{
137 enum drbd_disk_state ds = D_MASK;
138 struct drbd_conf *mdev;
139 int vnr;
140
695d08fa 141 rcu_read_lock();
4669265a
PR
142 idr_for_each_entry(&tconn->volumes, mdev, vnr)
143 ds = min_t(enum drbd_disk_state, ds, mdev->state.disk);
695d08fa 144 rcu_read_unlock();
4669265a
PR
145
146 return ds;
147}
148
cb703454
PR
149enum drbd_disk_state conn_highest_pdsk(struct drbd_tconn *tconn)
150{
151 enum drbd_disk_state ds = D_DISKLESS;
152 struct drbd_conf *mdev;
153 int vnr;
154
695d08fa 155 rcu_read_lock();
cb703454
PR
156 idr_for_each_entry(&tconn->volumes, mdev, vnr)
157 ds = max_t(enum drbd_disk_state, ds, mdev->state.pdsk);
695d08fa 158 rcu_read_unlock();
cb703454
PR
159
160 return ds;
161}
162
19f83c76
PR
163enum drbd_conns conn_lowest_conn(struct drbd_tconn *tconn)
164{
165 enum drbd_conns conn = C_MASK;
166 struct drbd_conf *mdev;
167 int vnr;
168
695d08fa 169 rcu_read_lock();
19f83c76
PR
170 idr_for_each_entry(&tconn->volumes, mdev, vnr)
171 conn = min_t(enum drbd_conns, conn, mdev->state.conn);
695d08fa 172 rcu_read_unlock();
19f83c76
PR
173
174 return conn;
175}
176
b8907339
PR
177/**
178 * cl_wide_st_chg() - true if the state change is a cluster wide one
179 * @mdev: DRBD device.
180 * @os: old (current) state.
181 * @ns: new (wanted) state.
182 */
183static int cl_wide_st_chg(struct drbd_conf *mdev,
184 union drbd_state os, union drbd_state ns)
185{
186 return (os.conn >= C_CONNECTED && ns.conn >= C_CONNECTED &&
187 ((os.role != R_PRIMARY && ns.role == R_PRIMARY) ||
188 (os.conn != C_STARTING_SYNC_T && ns.conn == C_STARTING_SYNC_T) ||
189 (os.conn != C_STARTING_SYNC_S && ns.conn == C_STARTING_SYNC_S) ||
190 (os.disk != D_DISKLESS && ns.disk == D_DISKLESS))) ||
191 (os.conn >= C_CONNECTED && ns.conn == C_DISCONNECTING) ||
192 (os.conn == C_CONNECTED && ns.conn == C_VERIFY_S);
193}
194
56707f9e
PR
195static union drbd_state
196apply_mask_val(union drbd_state os, union drbd_state mask, union drbd_state val)
197{
198 union drbd_state ns;
199 ns.i = (os.i & ~mask.i) | val.i;
200 return ns;
201}
202
b8907339
PR
203enum drbd_state_rv
204drbd_change_state(struct drbd_conf *mdev, enum chg_state_flags f,
205 union drbd_state mask, union drbd_state val)
206{
207 unsigned long flags;
56707f9e 208 union drbd_state ns;
b8907339
PR
209 enum drbd_state_rv rv;
210
211 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
78bae59b 212 ns = apply_mask_val(drbd_read_state(mdev), mask, val);
b8907339 213 rv = _drbd_set_state(mdev, ns, f, NULL);
b8907339
PR
214 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
215
216 return rv;
217}
218
219/**
220 * drbd_force_state() - Impose a change which happens outside our control on our state
221 * @mdev: DRBD device.
222 * @mask: mask of state bits to change.
223 * @val: value of new state bits.
224 */
225void drbd_force_state(struct drbd_conf *mdev,
226 union drbd_state mask, union drbd_state val)
227{
228 drbd_change_state(mdev, CS_HARD, mask, val);
229}
230
231static enum drbd_state_rv
232_req_st_cond(struct drbd_conf *mdev, union drbd_state mask,
233 union drbd_state val)
234{
235 union drbd_state os, ns;
236 unsigned long flags;
237 enum drbd_state_rv rv;
238
239 if (test_and_clear_bit(CL_ST_CHG_SUCCESS, &mdev->flags))
240 return SS_CW_SUCCESS;
241
242 if (test_and_clear_bit(CL_ST_CHG_FAIL, &mdev->flags))
243 return SS_CW_FAILED_BY_PEER;
244
b8907339 245 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
78bae59b 246 os = drbd_read_state(mdev);
56707f9e 247 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
3509502d
PR
248 rv = is_valid_transition(os, ns);
249 if (rv == SS_SUCCESS)
250 rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
b8907339
PR
251
252 if (!cl_wide_st_chg(mdev, os, ns))
253 rv = SS_CW_NO_NEED;
3509502d 254 if (rv == SS_UNKNOWN_ERROR) {
b8907339
PR
255 rv = is_valid_state(mdev, ns);
256 if (rv == SS_SUCCESS) {
a75f34ad 257 rv = is_valid_soft_transition(os, ns);
b8907339
PR
258 if (rv == SS_SUCCESS)
259 rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
260 }
261 }
262 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
263
264 return rv;
265}
266
267/**
268 * drbd_req_state() - Perform an eventually cluster wide state change
269 * @mdev: DRBD device.
270 * @mask: mask of state bits to change.
271 * @val: value of new state bits.
272 * @f: flags
273 *
274 * Should not be called directly, use drbd_request_state() or
275 * _drbd_request_state().
276 */
277static enum drbd_state_rv
278drbd_req_state(struct drbd_conf *mdev, union drbd_state mask,
279 union drbd_state val, enum chg_state_flags f)
280{
281 struct completion done;
282 unsigned long flags;
283 union drbd_state os, ns;
284 enum drbd_state_rv rv;
285
286 init_completion(&done);
287
288 if (f & CS_SERIALIZE)
8410da8f 289 mutex_lock(mdev->state_mutex);
b8907339
PR
290
291 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
78bae59b 292 os = drbd_read_state(mdev);
56707f9e 293 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
3509502d 294 rv = is_valid_transition(os, ns);
3c5e5f6a
LE
295 if (rv < SS_SUCCESS) {
296 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
3509502d 297 goto abort;
3c5e5f6a 298 }
b8907339
PR
299
300 if (cl_wide_st_chg(mdev, os, ns)) {
301 rv = is_valid_state(mdev, ns);
302 if (rv == SS_SUCCESS)
a75f34ad 303 rv = is_valid_soft_transition(os, ns);
b8907339
PR
304 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
305
306 if (rv < SS_SUCCESS) {
307 if (f & CS_VERBOSE)
308 print_st_err(mdev, os, ns, rv);
309 goto abort;
310 }
311
d24ae219 312 if (drbd_send_state_req(mdev, mask, val)) {
b8907339
PR
313 rv = SS_CW_FAILED_BY_PEER;
314 if (f & CS_VERBOSE)
315 print_st_err(mdev, os, ns, rv);
316 goto abort;
317 }
318
319 wait_event(mdev->state_wait,
320 (rv = _req_st_cond(mdev, mask, val)));
321
322 if (rv < SS_SUCCESS) {
b8907339
PR
323 if (f & CS_VERBOSE)
324 print_st_err(mdev, os, ns, rv);
325 goto abort;
326 }
327 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
78bae59b 328 ns = apply_mask_val(drbd_read_state(mdev), mask, val);
b8907339 329 rv = _drbd_set_state(mdev, ns, f, &done);
b8907339
PR
330 } else {
331 rv = _drbd_set_state(mdev, ns, f, &done);
332 }
333
334 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
335
336 if (f & CS_WAIT_COMPLETE && rv == SS_SUCCESS) {
337 D_ASSERT(current != mdev->tconn->worker.task);
338 wait_for_completion(&done);
339 }
340
341abort:
342 if (f & CS_SERIALIZE)
8410da8f 343 mutex_unlock(mdev->state_mutex);
b8907339
PR
344
345 return rv;
346}
347
348/**
349 * _drbd_request_state() - Request a state change (with flags)
350 * @mdev: DRBD device.
351 * @mask: mask of state bits to change.
352 * @val: value of new state bits.
353 * @f: flags
354 *
355 * Cousin of drbd_request_state(), useful with the CS_WAIT_COMPLETE
356 * flag, or when logging of failed state change requests is not desired.
357 */
358enum drbd_state_rv
359_drbd_request_state(struct drbd_conf *mdev, union drbd_state mask,
360 union drbd_state val, enum chg_state_flags f)
361{
362 enum drbd_state_rv rv;
363
364 wait_event(mdev->state_wait,
365 (rv = drbd_req_state(mdev, mask, val, f)) != SS_IN_TRANSIENT_STATE);
366
367 return rv;
368}
369
370static void print_st(struct drbd_conf *mdev, char *name, union drbd_state ns)
371{
372 dev_err(DEV, " %s = { cs:%s ro:%s/%s ds:%s/%s %c%c%c%c%c%c }\n",
373 name,
374 drbd_conn_str(ns.conn),
375 drbd_role_str(ns.role),
376 drbd_role_str(ns.peer),
377 drbd_disk_str(ns.disk),
378 drbd_disk_str(ns.pdsk),
379 is_susp(ns) ? 's' : 'r',
380 ns.aftr_isp ? 'a' : '-',
381 ns.peer_isp ? 'p' : '-',
382 ns.user_isp ? 'u' : '-',
383 ns.susp_fen ? 'F' : '-',
384 ns.susp_nod ? 'N' : '-'
385 );
386}
387
388void print_st_err(struct drbd_conf *mdev, union drbd_state os,
389 union drbd_state ns, enum drbd_state_rv err)
390{
391 if (err == SS_IN_TRANSIENT_STATE)
392 return;
393 dev_err(DEV, "State change failed: %s\n", drbd_set_st_err_str(err));
394 print_st(mdev, " state", os);
395 print_st(mdev, "wanted", ns);
396}
397
435693e8 398static long print_state_change(char *pb, union drbd_state os, union drbd_state ns,
bbeb641c
PR
399 enum chg_state_flags flags)
400{
435693e8 401 char *pbp;
bbeb641c
PR
402 pbp = pb;
403 *pbp = 0;
706cb24c 404
435693e8 405 if (ns.role != os.role && flags & CS_DC_ROLE)
bbeb641c
PR
406 pbp += sprintf(pbp, "role( %s -> %s ) ",
407 drbd_role_str(os.role),
408 drbd_role_str(ns.role));
435693e8 409 if (ns.peer != os.peer && flags & CS_DC_PEER)
bbeb641c
PR
410 pbp += sprintf(pbp, "peer( %s -> %s ) ",
411 drbd_role_str(os.peer),
412 drbd_role_str(ns.peer));
435693e8 413 if (ns.conn != os.conn && flags & CS_DC_CONN)
bbeb641c
PR
414 pbp += sprintf(pbp, "conn( %s -> %s ) ",
415 drbd_conn_str(os.conn),
416 drbd_conn_str(ns.conn));
435693e8 417 if (ns.disk != os.disk && flags & CS_DC_DISK)
bbeb641c
PR
418 pbp += sprintf(pbp, "disk( %s -> %s ) ",
419 drbd_disk_str(os.disk),
420 drbd_disk_str(ns.disk));
435693e8 421 if (ns.pdsk != os.pdsk && flags & CS_DC_PDSK)
bbeb641c
PR
422 pbp += sprintf(pbp, "pdsk( %s -> %s ) ",
423 drbd_disk_str(os.pdsk),
424 drbd_disk_str(ns.pdsk));
706cb24c
PR
425
426 return pbp - pb;
427}
428
429static void drbd_pr_state_change(struct drbd_conf *mdev, union drbd_state os, union drbd_state ns,
430 enum chg_state_flags flags)
431{
432 char pb[300];
433 char *pbp = pb;
434
435 pbp += print_state_change(pbp, os, ns, flags ^ CS_DC_MASK);
436
bbeb641c
PR
437 if (ns.aftr_isp != os.aftr_isp)
438 pbp += sprintf(pbp, "aftr_isp( %d -> %d ) ",
439 os.aftr_isp,
440 ns.aftr_isp);
441 if (ns.peer_isp != os.peer_isp)
442 pbp += sprintf(pbp, "peer_isp( %d -> %d ) ",
443 os.peer_isp,
444 ns.peer_isp);
445 if (ns.user_isp != os.user_isp)
446 pbp += sprintf(pbp, "user_isp( %d -> %d ) ",
447 os.user_isp,
448 ns.user_isp);
435693e8 449
706cb24c 450 if (pbp != pb)
bbeb641c
PR
451 dev_info(DEV, "%s\n", pb);
452}
b8907339 453
435693e8
PR
454static void conn_pr_state_change(struct drbd_tconn *tconn, union drbd_state os, union drbd_state ns,
455 enum chg_state_flags flags)
456{
457 char pb[300];
706cb24c
PR
458 char *pbp = pb;
459
460 pbp += print_state_change(pbp, os, ns, flags);
435693e8 461
706cb24c
PR
462 if (is_susp(ns) != is_susp(os) && flags & CS_DC_SUSP)
463 pbp += sprintf(pbp, "susp( %d -> %d ) ",
464 is_susp(os),
465 is_susp(ns));
466
467 if (pbp != pb)
435693e8
PR
468 conn_info(tconn, "%s\n", pb);
469}
470
471
b8907339
PR
472/**
473 * is_valid_state() - Returns an SS_ error code if ns is not valid
474 * @mdev: DRBD device.
475 * @ns: State to consider.
476 */
477static enum drbd_state_rv
478is_valid_state(struct drbd_conf *mdev, union drbd_state ns)
479{
480 /* See drbd_state_sw_errors in drbd_strings.c */
481
482 enum drbd_fencing_p fp;
483 enum drbd_state_rv rv = SS_SUCCESS;
44ed167d 484 struct net_conf *nc;
b8907339
PR
485
486 fp = FP_DONT_CARE;
487 if (get_ldev(mdev)) {
488 fp = mdev->ldev->dc.fencing;
489 put_ldev(mdev);
490 }
491
44ed167d
PR
492 rcu_read_lock();
493 nc = rcu_dereference(mdev->tconn->net_conf);
494 if (nc) {
495 if (!nc->two_primaries && ns.role == R_PRIMARY) {
047e95e2
PR
496 if (ns.peer == R_PRIMARY)
497 rv = SS_TWO_PRIMARIES;
cb703454 498 else if (conn_highest_peer(mdev->tconn) == R_PRIMARY)
047e95e2 499 rv = SS_O_VOL_PEER_PRI;
44ed167d 500 }
b8907339
PR
501 }
502
503 if (rv <= 0)
504 /* already found a reason to abort */;
505 else if (ns.role == R_SECONDARY && mdev->open_cnt)
506 rv = SS_DEVICE_IN_USE;
507
508 else if (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.disk < D_UP_TO_DATE)
509 rv = SS_NO_UP_TO_DATE_DISK;
510
511 else if (fp >= FP_RESOURCE &&
512 ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk >= D_UNKNOWN)
513 rv = SS_PRIMARY_NOP;
514
515 else if (ns.role == R_PRIMARY && ns.disk <= D_INCONSISTENT && ns.pdsk <= D_INCONSISTENT)
516 rv = SS_NO_UP_TO_DATE_DISK;
517
518 else if (ns.conn > C_CONNECTED && ns.disk < D_INCONSISTENT)
519 rv = SS_NO_LOCAL_DISK;
520
521 else if (ns.conn > C_CONNECTED && ns.pdsk < D_INCONSISTENT)
522 rv = SS_NO_REMOTE_DISK;
523
524 else if (ns.conn > C_CONNECTED && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)
525 rv = SS_NO_UP_TO_DATE_DISK;
526
527 else if ((ns.conn == C_CONNECTED ||
528 ns.conn == C_WF_BITMAP_S ||
529 ns.conn == C_SYNC_SOURCE ||
530 ns.conn == C_PAUSED_SYNC_S) &&
531 ns.disk == D_OUTDATED)
532 rv = SS_CONNECTED_OUTDATES;
533
534 else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
44ed167d 535 (nc->verify_alg[0] == 0))
b8907339
PR
536 rv = SS_NO_VERIFY_ALG;
537
538 else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
539 mdev->tconn->agreed_pro_version < 88)
540 rv = SS_NOT_SUPPORTED;
541
542 else if (ns.conn >= C_CONNECTED && ns.pdsk == D_UNKNOWN)
543 rv = SS_CONNECTED_OUTDATES;
544
44ed167d
PR
545 rcu_read_unlock();
546
b8907339
PR
547 return rv;
548}
549
550/**
a75f34ad 551 * is_valid_soft_transition() - Returns an SS_ error code if the state transition is not possible
3509502d
PR
552 * This function limits state transitions that may be declined by DRBD. I.e.
553 * user requests (aka soft transitions).
b8907339
PR
554 * @mdev: DRBD device.
555 * @ns: new state.
556 * @os: old state.
557 */
558static enum drbd_state_rv
a75f34ad 559is_valid_soft_transition(union drbd_state os, union drbd_state ns)
b8907339
PR
560{
561 enum drbd_state_rv rv = SS_SUCCESS;
562
563 if ((ns.conn == C_STARTING_SYNC_T || ns.conn == C_STARTING_SYNC_S) &&
564 os.conn > C_CONNECTED)
565 rv = SS_RESYNC_RUNNING;
566
567 if (ns.conn == C_DISCONNECTING && os.conn == C_STANDALONE)
568 rv = SS_ALREADY_STANDALONE;
569
570 if (ns.disk > D_ATTACHING && os.disk == D_DISKLESS)
571 rv = SS_IS_DISKLESS;
572
573 if (ns.conn == C_WF_CONNECTION && os.conn < C_UNCONNECTED)
574 rv = SS_NO_NET_CONFIG;
575
576 if (ns.disk == D_OUTDATED && os.disk < D_OUTDATED && os.disk != D_ATTACHING)
577 rv = SS_LOWER_THAN_OUTDATED;
578
579 if (ns.conn == C_DISCONNECTING && os.conn == C_UNCONNECTED)
580 rv = SS_IN_TRANSIENT_STATE;
581
2325eb66
PR
582 /* if (ns.conn == os.conn && ns.conn == C_WF_REPORT_PARAMS)
583 rv = SS_IN_TRANSIENT_STATE; */
b8907339
PR
584
585 if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) && os.conn < C_CONNECTED)
586 rv = SS_NEED_CONNECTION;
587
588 if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
589 ns.conn != os.conn && os.conn > C_CONNECTED)
590 rv = SS_RESYNC_RUNNING;
591
592 if ((ns.conn == C_STARTING_SYNC_S || ns.conn == C_STARTING_SYNC_T) &&
593 os.conn < C_CONNECTED)
594 rv = SS_NEED_CONNECTION;
595
596 if ((ns.conn == C_SYNC_TARGET || ns.conn == C_SYNC_SOURCE)
597 && os.conn < C_WF_REPORT_PARAMS)
598 rv = SS_NEED_CONNECTION; /* No NetworkFailure -> SyncTarget etc... */
599
600 return rv;
601}
602
3509502d 603static enum drbd_state_rv
fda74117 604is_valid_conn_transition(enum drbd_conns oc, enum drbd_conns nc)
3509502d 605{
d9cc6e23
LE
606 /* no change -> nothing to do, at least for the connection part */
607 if (oc == nc)
608 return SS_NOTHING_TO_DO;
3509502d 609
d9cc6e23
LE
610 /* disconnect of an unconfigured connection does not make sense */
611 if (oc == C_STANDALONE && nc == C_DISCONNECTING)
612 return SS_ALREADY_STANDALONE;
613
614 /* from C_STANDALONE, we start with C_UNCONNECTED */
615 if (oc == C_STANDALONE && nc != C_UNCONNECTED)
616 return SS_NEED_CONNECTION;
3509502d
PR
617
618 /* After a network error only C_UNCONNECTED or C_DISCONNECTING may follow. */
fda74117 619 if (oc >= C_TIMEOUT && oc <= C_TEAR_DOWN && nc != C_UNCONNECTED && nc != C_DISCONNECTING)
d9cc6e23 620 return SS_IN_TRANSIENT_STATE;
3509502d
PR
621
622 /* After C_DISCONNECTING only C_STANDALONE may follow */
fda74117 623 if (oc == C_DISCONNECTING && nc != C_STANDALONE)
d9cc6e23 624 return SS_IN_TRANSIENT_STATE;
3509502d 625
d9cc6e23 626 return SS_SUCCESS;
fda74117
PR
627}
628
629
630/**
631 * is_valid_transition() - Returns an SS_ error code if the state transition is not possible
632 * This limits hard state transitions. Hard state transitions are facts there are
633 * imposed on DRBD by the environment. E.g. disk broke or network broke down.
634 * But those hard state transitions are still not allowed to do everything.
635 * @ns: new state.
636 * @os: old state.
637 */
638static enum drbd_state_rv
639is_valid_transition(union drbd_state os, union drbd_state ns)
640{
641 enum drbd_state_rv rv;
642
643 rv = is_valid_conn_transition(os.conn, ns.conn);
644
3509502d
PR
645 /* we cannot fail (again) if we already detached */
646 if (ns.disk == D_FAILED && os.disk == D_DISKLESS)
647 rv = SS_IS_DISKLESS;
648
4308a0a3
PR
649 /* if we are only D_ATTACHING yet,
650 * we can (and should) go directly to D_DISKLESS. */
651 if (ns.disk == D_FAILED && os.disk == D_ATTACHING) {
652 printk("TODO: FIX ME\n");
653 rv = SS_IS_DISKLESS;
654 }
655
3509502d
PR
656 return rv;
657}
658
b8907339
PR
659/**
660 * sanitize_state() - Resolves implicitly necessary additional changes to a state transition
661 * @mdev: DRBD device.
662 * @os: old state.
663 * @ns: new state.
664 * @warn_sync_abort:
665 *
666 * When we loose connection, we have to set the state of the peers disk (pdsk)
667 * to D_UNKNOWN. This rule and many more along those lines are in this function.
668 */
4308a0a3
PR
669static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state ns,
670 const char **warn_sync_abort)
b8907339
PR
671{
672 enum drbd_fencing_p fp;
673 enum drbd_disk_state disk_min, disk_max, pdsk_min, pdsk_max;
674
675 fp = FP_DONT_CARE;
676 if (get_ldev(mdev)) {
677 fp = mdev->ldev->dc.fencing;
678 put_ldev(mdev);
679 }
680
3509502d 681 /* Implications from connection to peer and peer_isp */
b8907339
PR
682 if (ns.conn < C_CONNECTED) {
683 ns.peer_isp = 0;
684 ns.peer = R_UNKNOWN;
685 if (ns.pdsk > D_UNKNOWN || ns.pdsk < D_INCONSISTENT)
686 ns.pdsk = D_UNKNOWN;
687 }
688
689 /* Clear the aftr_isp when becoming unconfigured */
690 if (ns.conn == C_STANDALONE && ns.disk == D_DISKLESS && ns.role == R_SECONDARY)
691 ns.aftr_isp = 0;
692
4308a0a3 693 /* An implication of the disk states onto the connection state */
b8907339 694 /* Abort resync if a disk fails/detaches */
4308a0a3 695 if (ns.conn > C_CONNECTED && (ns.disk <= D_FAILED || ns.pdsk <= D_FAILED)) {
b8907339
PR
696 if (warn_sync_abort)
697 *warn_sync_abort =
4308a0a3 698 ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T ?
b8907339
PR
699 "Online-verify" : "Resync";
700 ns.conn = C_CONNECTED;
701 }
702
703 /* Connection breaks down before we finished "Negotiating" */
704 if (ns.conn < C_CONNECTED && ns.disk == D_NEGOTIATING &&
705 get_ldev_if_state(mdev, D_NEGOTIATING)) {
706 if (mdev->ed_uuid == mdev->ldev->md.uuid[UI_CURRENT]) {
707 ns.disk = mdev->new_state_tmp.disk;
708 ns.pdsk = mdev->new_state_tmp.pdsk;
709 } else {
710 dev_alert(DEV, "Connection lost while negotiating, no data!\n");
711 ns.disk = D_DISKLESS;
712 ns.pdsk = D_UNKNOWN;
713 }
714 put_ldev(mdev);
715 }
716
717 /* D_CONSISTENT and D_OUTDATED vanish when we get connected */
718 if (ns.conn >= C_CONNECTED && ns.conn < C_AHEAD) {
719 if (ns.disk == D_CONSISTENT || ns.disk == D_OUTDATED)
720 ns.disk = D_UP_TO_DATE;
721 if (ns.pdsk == D_CONSISTENT || ns.pdsk == D_OUTDATED)
722 ns.pdsk = D_UP_TO_DATE;
723 }
724
725 /* Implications of the connection stat on the disk states */
726 disk_min = D_DISKLESS;
727 disk_max = D_UP_TO_DATE;
728 pdsk_min = D_INCONSISTENT;
729 pdsk_max = D_UNKNOWN;
730 switch ((enum drbd_conns)ns.conn) {
731 case C_WF_BITMAP_T:
732 case C_PAUSED_SYNC_T:
733 case C_STARTING_SYNC_T:
734 case C_WF_SYNC_UUID:
735 case C_BEHIND:
736 disk_min = D_INCONSISTENT;
737 disk_max = D_OUTDATED;
738 pdsk_min = D_UP_TO_DATE;
739 pdsk_max = D_UP_TO_DATE;
740 break;
741 case C_VERIFY_S:
742 case C_VERIFY_T:
743 disk_min = D_UP_TO_DATE;
744 disk_max = D_UP_TO_DATE;
745 pdsk_min = D_UP_TO_DATE;
746 pdsk_max = D_UP_TO_DATE;
747 break;
748 case C_CONNECTED:
749 disk_min = D_DISKLESS;
750 disk_max = D_UP_TO_DATE;
751 pdsk_min = D_DISKLESS;
752 pdsk_max = D_UP_TO_DATE;
753 break;
754 case C_WF_BITMAP_S:
755 case C_PAUSED_SYNC_S:
756 case C_STARTING_SYNC_S:
757 case C_AHEAD:
758 disk_min = D_UP_TO_DATE;
759 disk_max = D_UP_TO_DATE;
760 pdsk_min = D_INCONSISTENT;
761 pdsk_max = D_CONSISTENT; /* D_OUTDATED would be nice. But explicit outdate necessary*/
762 break;
763 case C_SYNC_TARGET:
764 disk_min = D_INCONSISTENT;
765 disk_max = D_INCONSISTENT;
766 pdsk_min = D_UP_TO_DATE;
767 pdsk_max = D_UP_TO_DATE;
768 break;
769 case C_SYNC_SOURCE:
770 disk_min = D_UP_TO_DATE;
771 disk_max = D_UP_TO_DATE;
772 pdsk_min = D_INCONSISTENT;
773 pdsk_max = D_INCONSISTENT;
774 break;
775 case C_STANDALONE:
776 case C_DISCONNECTING:
777 case C_UNCONNECTED:
778 case C_TIMEOUT:
779 case C_BROKEN_PIPE:
780 case C_NETWORK_FAILURE:
781 case C_PROTOCOL_ERROR:
782 case C_TEAR_DOWN:
783 case C_WF_CONNECTION:
784 case C_WF_REPORT_PARAMS:
785 case C_MASK:
786 break;
787 }
788 if (ns.disk > disk_max)
789 ns.disk = disk_max;
790
791 if (ns.disk < disk_min) {
792 dev_warn(DEV, "Implicitly set disk from %s to %s\n",
793 drbd_disk_str(ns.disk), drbd_disk_str(disk_min));
794 ns.disk = disk_min;
795 }
796 if (ns.pdsk > pdsk_max)
797 ns.pdsk = pdsk_max;
798
799 if (ns.pdsk < pdsk_min) {
800 dev_warn(DEV, "Implicitly set pdsk from %s to %s\n",
801 drbd_disk_str(ns.pdsk), drbd_disk_str(pdsk_min));
802 ns.pdsk = pdsk_min;
803 }
804
805 if (fp == FP_STONITH &&
4308a0a3 806 (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk > D_OUTDATED))
b8907339
PR
807 ns.susp_fen = 1; /* Suspend IO while fence-peer handler runs (peer lost) */
808
f399002e 809 if (mdev->tconn->res_opts.on_no_data == OND_SUSPEND_IO &&
4308a0a3 810 (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE))
b8907339
PR
811 ns.susp_nod = 1; /* Suspend IO while no data available (no accessible data available) */
812
813 if (ns.aftr_isp || ns.peer_isp || ns.user_isp) {
814 if (ns.conn == C_SYNC_SOURCE)
815 ns.conn = C_PAUSED_SYNC_S;
816 if (ns.conn == C_SYNC_TARGET)
817 ns.conn = C_PAUSED_SYNC_T;
818 } else {
819 if (ns.conn == C_PAUSED_SYNC_S)
820 ns.conn = C_SYNC_SOURCE;
821 if (ns.conn == C_PAUSED_SYNC_T)
822 ns.conn = C_SYNC_TARGET;
823 }
824
825 return ns;
826}
827
828void drbd_resume_al(struct drbd_conf *mdev)
829{
830 if (test_and_clear_bit(AL_SUSPENDED, &mdev->flags))
831 dev_info(DEV, "Resumed AL updates\n");
832}
833
834/* helper for __drbd_set_state */
835static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs)
836{
837 if (mdev->tconn->agreed_pro_version < 90)
838 mdev->ov_start_sector = 0;
839 mdev->rs_total = drbd_bm_bits(mdev);
840 mdev->ov_position = 0;
841 if (cs == C_VERIFY_T) {
842 /* starting online verify from an arbitrary position
843 * does not fit well into the existing protocol.
844 * on C_VERIFY_T, we initialize ov_left and friends
845 * implicitly in receive_DataRequest once the
846 * first P_OV_REQUEST is received */
847 mdev->ov_start_sector = ~(sector_t)0;
848 } else {
849 unsigned long bit = BM_SECT_TO_BIT(mdev->ov_start_sector);
850 if (bit >= mdev->rs_total) {
851 mdev->ov_start_sector =
852 BM_BIT_TO_SECT(mdev->rs_total - 1);
853 mdev->rs_total = 1;
854 } else
855 mdev->rs_total -= bit;
856 mdev->ov_position = mdev->ov_start_sector;
857 }
858 mdev->ov_left = mdev->rs_total;
859}
860
861/**
862 * __drbd_set_state() - Set a new DRBD state
863 * @mdev: DRBD device.
864 * @ns: new state.
865 * @flags: Flags
866 * @done: Optional completion, that will get completed after the after_state_ch() finished
867 *
868 * Caller needs to hold req_lock, and global_state_lock. Do not call directly.
869 */
870enum drbd_state_rv
871__drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,
872 enum chg_state_flags flags, struct completion *done)
873{
874 union drbd_state os;
875 enum drbd_state_rv rv = SS_SUCCESS;
876 const char *warn_sync_abort = NULL;
877 struct after_state_chg_work *ascw;
878
78bae59b 879 os = drbd_read_state(mdev);
b8907339 880
4308a0a3 881 ns = sanitize_state(mdev, ns, &warn_sync_abort);
b8907339
PR
882 if (ns.i == os.i)
883 return SS_NOTHING_TO_DO;
884
3509502d
PR
885 rv = is_valid_transition(os, ns);
886 if (rv < SS_SUCCESS)
887 return rv;
888
b8907339
PR
889 if (!(flags & CS_HARD)) {
890 /* pre-state-change checks ; only look at ns */
891 /* See drbd_state_sw_errors in drbd_strings.c */
892
893 rv = is_valid_state(mdev, ns);
894 if (rv < SS_SUCCESS) {
895 /* If the old state was illegal as well, then let
896 this happen...*/
897
898 if (is_valid_state(mdev, os) == rv)
a75f34ad 899 rv = is_valid_soft_transition(os, ns);
b8907339 900 } else
a75f34ad 901 rv = is_valid_soft_transition(os, ns);
b8907339
PR
902 }
903
904 if (rv < SS_SUCCESS) {
905 if (flags & CS_VERBOSE)
906 print_st_err(mdev, os, ns, rv);
907 return rv;
908 }
909
910 if (warn_sync_abort)
911 dev_warn(DEV, "%s aborted.\n", warn_sync_abort);
912
435693e8 913 drbd_pr_state_change(mdev, os, ns, flags);
b8907339 914
706cb24c
PR
915 /* Display changes to the susp* flags that where caused by the call to
916 sanitize_state(). Only display it here if we where not called from
917 _conn_request_state() */
918 if (!(flags & CS_DC_SUSP))
919 conn_pr_state_change(mdev->tconn, os, ns, (flags & ~CS_DC_MASK) | CS_DC_SUSP);
920
b8907339
PR
921 /* if we are going -> D_FAILED or D_DISKLESS, grab one extra reference
922 * on the ldev here, to be sure the transition -> D_DISKLESS resp.
923 * drbd_ldev_destroy() won't happen before our corresponding
924 * after_state_ch works run, where we put_ldev again. */
925 if ((os.disk != D_FAILED && ns.disk == D_FAILED) ||
926 (os.disk != D_DISKLESS && ns.disk == D_DISKLESS))
927 atomic_inc(&mdev->local_cnt);
928
da9fbc27 929 mdev->state.i = ns.i;
8e0af25f
PR
930 mdev->tconn->susp = ns.susp;
931 mdev->tconn->susp_nod = ns.susp_nod;
932 mdev->tconn->susp_fen = ns.susp_fen;
b8907339
PR
933
934 if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING)
935 drbd_print_uuids(mdev, "attached to UUIDs");
936
937 wake_up(&mdev->misc_wait);
938 wake_up(&mdev->state_wait);
2a67d8b9 939 wake_up(&mdev->tconn->ping_wait);
b8907339
PR
940
941 /* aborted verify run. log the last position */
942 if ((os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) &&
943 ns.conn < C_CONNECTED) {
944 mdev->ov_start_sector =
945 BM_BIT_TO_SECT(drbd_bm_bits(mdev) - mdev->ov_left);
946 dev_info(DEV, "Online Verify reached sector %llu\n",
947 (unsigned long long)mdev->ov_start_sector);
948 }
949
950 if ((os.conn == C_PAUSED_SYNC_T || os.conn == C_PAUSED_SYNC_S) &&
951 (ns.conn == C_SYNC_TARGET || ns.conn == C_SYNC_SOURCE)) {
952 dev_info(DEV, "Syncer continues.\n");
953 mdev->rs_paused += (long)jiffies
954 -(long)mdev->rs_mark_time[mdev->rs_last_mark];
955 if (ns.conn == C_SYNC_TARGET)
956 mod_timer(&mdev->resync_timer, jiffies);
957 }
958
959 if ((os.conn == C_SYNC_TARGET || os.conn == C_SYNC_SOURCE) &&
960 (ns.conn == C_PAUSED_SYNC_T || ns.conn == C_PAUSED_SYNC_S)) {
961 dev_info(DEV, "Resync suspended\n");
962 mdev->rs_mark_time[mdev->rs_last_mark] = jiffies;
963 }
964
965 if (os.conn == C_CONNECTED &&
966 (ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T)) {
967 unsigned long now = jiffies;
968 int i;
969
970 set_ov_position(mdev, ns.conn);
971 mdev->rs_start = now;
972 mdev->rs_last_events = 0;
973 mdev->rs_last_sect_ev = 0;
974 mdev->ov_last_oos_size = 0;
975 mdev->ov_last_oos_start = 0;
976
977 for (i = 0; i < DRBD_SYNC_MARKS; i++) {
978 mdev->rs_mark_left[i] = mdev->ov_left;
979 mdev->rs_mark_time[i] = now;
980 }
981
982 drbd_rs_controller_reset(mdev);
983
984 if (ns.conn == C_VERIFY_S) {
985 dev_info(DEV, "Starting Online Verify from sector %llu\n",
986 (unsigned long long)mdev->ov_position);
987 mod_timer(&mdev->resync_timer, jiffies);
988 }
989 }
990
991 if (get_ldev(mdev)) {
992 u32 mdf = mdev->ldev->md.flags & ~(MDF_CONSISTENT|MDF_PRIMARY_IND|
993 MDF_CONNECTED_IND|MDF_WAS_UP_TO_DATE|
994 MDF_PEER_OUT_DATED|MDF_CRASHED_PRIMARY);
995
996 if (test_bit(CRASHED_PRIMARY, &mdev->flags))
997 mdf |= MDF_CRASHED_PRIMARY;
998 if (mdev->state.role == R_PRIMARY ||
999 (mdev->state.pdsk < D_INCONSISTENT && mdev->state.peer == R_PRIMARY))
1000 mdf |= MDF_PRIMARY_IND;
1001 if (mdev->state.conn > C_WF_REPORT_PARAMS)
1002 mdf |= MDF_CONNECTED_IND;
1003 if (mdev->state.disk > D_INCONSISTENT)
1004 mdf |= MDF_CONSISTENT;
1005 if (mdev->state.disk > D_OUTDATED)
1006 mdf |= MDF_WAS_UP_TO_DATE;
1007 if (mdev->state.pdsk <= D_OUTDATED && mdev->state.pdsk >= D_INCONSISTENT)
1008 mdf |= MDF_PEER_OUT_DATED;
1009 if (mdf != mdev->ldev->md.flags) {
1010 mdev->ldev->md.flags = mdf;
1011 drbd_md_mark_dirty(mdev);
1012 }
1013 if (os.disk < D_CONSISTENT && ns.disk >= D_CONSISTENT)
1014 drbd_set_ed_uuid(mdev, mdev->ldev->md.uuid[UI_CURRENT]);
1015 put_ldev(mdev);
1016 }
1017
1018 /* Peer was forced D_UP_TO_DATE & R_PRIMARY, consider to resync */
1019 if (os.disk == D_INCONSISTENT && os.pdsk == D_INCONSISTENT &&
1020 os.peer == R_SECONDARY && ns.peer == R_PRIMARY)
1021 set_bit(CONSIDER_RESYNC, &mdev->flags);
1022
1023 /* Receiver should clean up itself */
1024 if (os.conn != C_DISCONNECTING && ns.conn == C_DISCONNECTING)
1025 drbd_thread_stop_nowait(&mdev->tconn->receiver);
1026
1027 /* Now the receiver finished cleaning up itself, it should die */
1028 if (os.conn != C_STANDALONE && ns.conn == C_STANDALONE)
1029 drbd_thread_stop_nowait(&mdev->tconn->receiver);
1030
1031 /* Upon network failure, we need to restart the receiver. */
1032 if (os.conn > C_TEAR_DOWN &&
1033 ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT)
1034 drbd_thread_restart_nowait(&mdev->tconn->receiver);
1035
1036 /* Resume AL writing if we get a connection */
1037 if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED)
1038 drbd_resume_al(mdev);
1039
1040 ascw = kmalloc(sizeof(*ascw), GFP_ATOMIC);
1041 if (ascw) {
1042 ascw->os = os;
1043 ascw->ns = ns;
1044 ascw->flags = flags;
1045 ascw->w.cb = w_after_state_ch;
a21e9298 1046 ascw->w.mdev = mdev;
b8907339
PR
1047 ascw->done = done;
1048 drbd_queue_work(&mdev->tconn->data.work, &ascw->w);
1049 } else {
bbeb641c 1050 dev_err(DEV, "Could not kmalloc an ascw\n");
b8907339
PR
1051 }
1052
1053 return rv;
1054}
1055
99920dc5 1056static int w_after_state_ch(struct drbd_work *w, int unused)
b8907339
PR
1057{
1058 struct after_state_chg_work *ascw =
1059 container_of(w, struct after_state_chg_work, w);
00d56944 1060 struct drbd_conf *mdev = w->mdev;
b8907339
PR
1061
1062 after_state_ch(mdev, ascw->os, ascw->ns, ascw->flags);
1063 if (ascw->flags & CS_WAIT_COMPLETE) {
1064 D_ASSERT(ascw->done != NULL);
1065 complete(ascw->done);
1066 }
1067 kfree(ascw);
1068
99920dc5 1069 return 0;
b8907339
PR
1070}
1071
1072static void abw_start_sync(struct drbd_conf *mdev, int rv)
1073{
1074 if (rv) {
1075 dev_err(DEV, "Writing the bitmap failed not starting resync.\n");
1076 _drbd_request_state(mdev, NS(conn, C_CONNECTED), CS_VERBOSE);
1077 return;
1078 }
1079
1080 switch (mdev->state.conn) {
1081 case C_STARTING_SYNC_T:
1082 _drbd_request_state(mdev, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE);
1083 break;
1084 case C_STARTING_SYNC_S:
1085 drbd_start_resync(mdev, C_SYNC_SOURCE);
1086 break;
1087 }
1088}
1089
1090int drbd_bitmap_io_from_worker(struct drbd_conf *mdev,
1091 int (*io_fn)(struct drbd_conf *),
1092 char *why, enum bm_flag flags)
1093{
1094 int rv;
1095
1096 D_ASSERT(current == mdev->tconn->worker.task);
1097
1098 /* open coded non-blocking drbd_suspend_io(mdev); */
1099 set_bit(SUSPEND_IO, &mdev->flags);
1100
1101 drbd_bm_lock(mdev, why, flags);
1102 rv = io_fn(mdev);
1103 drbd_bm_unlock(mdev);
1104
1105 drbd_resume_io(mdev);
1106
1107 return rv;
1108}
1109
1110/**
1111 * after_state_ch() - Perform after state change actions that may sleep
1112 * @mdev: DRBD device.
1113 * @os: old state.
1114 * @ns: new state.
1115 * @flags: Flags
1116 */
1117static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
1118 union drbd_state ns, enum chg_state_flags flags)
1119{
1120 enum drbd_fencing_p fp;
3b98c0c2
LE
1121 struct sib_info sib;
1122
1123 sib.sib_reason = SIB_STATE_CHANGE;
1124 sib.os = os;
1125 sib.ns = ns;
b8907339
PR
1126
1127 if (os.conn != C_CONNECTED && ns.conn == C_CONNECTED) {
1128 clear_bit(CRASHED_PRIMARY, &mdev->flags);
1129 if (mdev->p_uuid)
1130 mdev->p_uuid[UI_FLAGS] &= ~((u64)2);
1131 }
1132
1133 fp = FP_DONT_CARE;
1134 if (get_ldev(mdev)) {
1135 fp = mdev->ldev->dc.fencing;
1136 put_ldev(mdev);
1137 }
1138
1139 /* Inform userspace about the change... */
3b98c0c2 1140 drbd_bcast_event(mdev, &sib);
b8907339
PR
1141
1142 if (!(os.role == R_PRIMARY && os.disk < D_UP_TO_DATE && os.pdsk < D_UP_TO_DATE) &&
1143 (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE))
1144 drbd_khelper(mdev, "pri-on-incon-degr");
1145
1146 /* Here we have the actions that are performed after a
1147 state change. This function might sleep */
1148
b8907339 1149 if (ns.susp_nod) {
a6d00c8e
PR
1150 enum drbd_req_event what = NOTHING;
1151
1152 if (os.conn < C_CONNECTED && conn_lowest_conn(mdev->tconn) >= C_CONNECTED)
b8907339
PR
1153 what = RESEND;
1154
a6d00c8e 1155 if (os.disk == D_ATTACHING && conn_lowest_disk(mdev->tconn) > D_ATTACHING)
b8907339
PR
1156 what = RESTART_FROZEN_DISK_IO;
1157
a6d00c8e 1158 if (what != NOTHING) {
b8907339 1159 spin_lock_irq(&mdev->tconn->req_lock);
a6d00c8e
PR
1160 _tl_restart(mdev->tconn, what);
1161 _drbd_set_state(_NS(mdev, susp_nod, 0), CS_VERBOSE, NULL);
b8907339
PR
1162 spin_unlock_irq(&mdev->tconn->req_lock);
1163 }
b8907339
PR
1164 }
1165
1166 /* Became sync source. With protocol >= 96, we still need to send out
1167 * the sync uuid now. Need to do that before any drbd_send_state, or
1168 * the other side may go "paused sync" before receiving the sync uuids,
1169 * which is unexpected. */
1170 if ((os.conn != C_SYNC_SOURCE && os.conn != C_PAUSED_SYNC_S) &&
1171 (ns.conn == C_SYNC_SOURCE || ns.conn == C_PAUSED_SYNC_S) &&
1172 mdev->tconn->agreed_pro_version >= 96 && get_ldev(mdev)) {
1173 drbd_gen_and_send_sync_uuid(mdev);
1174 put_ldev(mdev);
1175 }
1176
1177 /* Do not change the order of the if above and the two below... */
1178 if (os.pdsk == D_DISKLESS && ns.pdsk > D_DISKLESS) { /* attach on the peer */
1179 drbd_send_uuids(mdev);
1180 drbd_send_state(mdev);
1181 }
1182 /* No point in queuing send_bitmap if we don't have a connection
1183 * anymore, so check also the _current_ state, not only the new state
1184 * at the time this work was queued. */
1185 if (os.conn != C_WF_BITMAP_S && ns.conn == C_WF_BITMAP_S &&
1186 mdev->state.conn == C_WF_BITMAP_S)
1187 drbd_queue_bitmap_io(mdev, &drbd_send_bitmap, NULL,
1188 "send_bitmap (WFBitMapS)",
1189 BM_LOCKED_TEST_ALLOWED);
1190
1191 /* Lost contact to peer's copy of the data */
1192 if ((os.pdsk >= D_INCONSISTENT &&
1193 os.pdsk != D_UNKNOWN &&
1194 os.pdsk != D_OUTDATED)
1195 && (ns.pdsk < D_INCONSISTENT ||
1196 ns.pdsk == D_UNKNOWN ||
1197 ns.pdsk == D_OUTDATED)) {
1198 if (get_ldev(mdev)) {
1199 if ((ns.role == R_PRIMARY || ns.peer == R_PRIMARY) &&
1200 mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
2aebfabb 1201 if (drbd_suspended(mdev)) {
b8907339
PR
1202 set_bit(NEW_CUR_UUID, &mdev->flags);
1203 } else {
1204 drbd_uuid_new_current(mdev);
1205 drbd_send_uuids(mdev);
1206 }
1207 }
1208 put_ldev(mdev);
1209 }
1210 }
1211
1212 if (ns.pdsk < D_INCONSISTENT && get_ldev(mdev)) {
1213 if (ns.peer == R_PRIMARY && mdev->ldev->md.uuid[UI_BITMAP] == 0) {
1214 drbd_uuid_new_current(mdev);
1215 drbd_send_uuids(mdev);
1216 }
1217
1218 /* D_DISKLESS Peer becomes secondary */
1219 if (os.peer == R_PRIMARY && ns.peer == R_SECONDARY)
1220 /* We may still be Primary ourselves.
1221 * No harm done if the bitmap still changes,
1222 * redirtied pages will follow later. */
1223 drbd_bitmap_io_from_worker(mdev, &drbd_bm_write,
1224 "demote diskless peer", BM_LOCKED_SET_ALLOWED);
1225 put_ldev(mdev);
1226 }
1227
1228 /* Write out all changed bits on demote.
1229 * Though, no need to da that just yet
1230 * if there is a resync going on still */
1231 if (os.role == R_PRIMARY && ns.role == R_SECONDARY &&
1232 mdev->state.conn <= C_CONNECTED && get_ldev(mdev)) {
1233 /* No changes to the bitmap expected this time, so assert that,
1234 * even though no harm was done if it did change. */
1235 drbd_bitmap_io_from_worker(mdev, &drbd_bm_write,
1236 "demote", BM_LOCKED_TEST_ALLOWED);
1237 put_ldev(mdev);
1238 }
1239
1240 /* Last part of the attaching process ... */
1241 if (ns.conn >= C_CONNECTED &&
1242 os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) {
1243 drbd_send_sizes(mdev, 0, 0); /* to start sync... */
1244 drbd_send_uuids(mdev);
1245 drbd_send_state(mdev);
1246 }
1247
1248 /* We want to pause/continue resync, tell peer. */
1249 if (ns.conn >= C_CONNECTED &&
1250 ((os.aftr_isp != ns.aftr_isp) ||
1251 (os.user_isp != ns.user_isp)))
1252 drbd_send_state(mdev);
1253
1254 /* In case one of the isp bits got set, suspend other devices. */
1255 if ((!os.aftr_isp && !os.peer_isp && !os.user_isp) &&
1256 (ns.aftr_isp || ns.peer_isp || ns.user_isp))
1257 suspend_other_sg(mdev);
1258
1259 /* Make sure the peer gets informed about eventual state
1260 changes (ISP bits) while we were in WFReportParams. */
1261 if (os.conn == C_WF_REPORT_PARAMS && ns.conn >= C_CONNECTED)
1262 drbd_send_state(mdev);
1263
1264 if (os.conn != C_AHEAD && ns.conn == C_AHEAD)
1265 drbd_send_state(mdev);
1266
1267 /* We are in the progress to start a full sync... */
1268 if ((os.conn != C_STARTING_SYNC_T && ns.conn == C_STARTING_SYNC_T) ||
1269 (os.conn != C_STARTING_SYNC_S && ns.conn == C_STARTING_SYNC_S))
1270 /* no other bitmap changes expected during this phase */
1271 drbd_queue_bitmap_io(mdev,
1272 &drbd_bmio_set_n_write, &abw_start_sync,
1273 "set_n_write from StartingSync", BM_LOCKED_TEST_ALLOWED);
1274
1275 /* We are invalidating our self... */
1276 if (os.conn < C_CONNECTED && ns.conn < C_CONNECTED &&
1277 os.disk > D_INCONSISTENT && ns.disk == D_INCONSISTENT)
1278 /* other bitmap operation expected during this phase */
1279 drbd_queue_bitmap_io(mdev, &drbd_bmio_set_n_write, NULL,
1280 "set_n_write from invalidate", BM_LOCKED_MASK);
1281
1282 /* first half of local IO error, failure to attach,
1283 * or administrative detach */
1284 if (os.disk != D_FAILED && ns.disk == D_FAILED) {
1285 enum drbd_io_error_p eh;
1286 int was_io_error;
1287 /* corresponding get_ldev was in __drbd_set_state, to serialize
1288 * our cleanup here with the transition to D_DISKLESS,
1289 * so it is safe to dreference ldev here. */
1290 eh = mdev->ldev->dc.on_io_error;
1291 was_io_error = test_and_clear_bit(WAS_IO_ERROR, &mdev->flags);
1292
1293 /* current state still has to be D_FAILED,
1294 * there is only one way out: to D_DISKLESS,
1295 * and that may only happen after our put_ldev below. */
1296 if (mdev->state.disk != D_FAILED)
1297 dev_err(DEV,
1298 "ASSERT FAILED: disk is %s during detach\n",
1299 drbd_disk_str(mdev->state.disk));
1300
927036f9 1301 if (!drbd_send_state(mdev))
b8907339
PR
1302 dev_warn(DEV, "Notified peer that I am detaching my disk\n");
1303 else
1304 dev_err(DEV, "Sending state for detaching disk failed\n");
1305
1306 drbd_rs_cancel_all(mdev);
1307
1308 /* In case we want to get something to stable storage still,
1309 * this may be the last chance.
1310 * Following put_ldev may transition to D_DISKLESS. */
1311 drbd_md_sync(mdev);
1312 put_ldev(mdev);
1313
1314 if (was_io_error && eh == EP_CALL_HELPER)
1315 drbd_khelper(mdev, "local-io-error");
1316 }
1317
1318 /* second half of local IO error, failure to attach,
1319 * or administrative detach,
1320 * after local_cnt references have reached zero again */
1321 if (os.disk != D_DISKLESS && ns.disk == D_DISKLESS) {
1322 /* We must still be diskless,
1323 * re-attach has to be serialized with this! */
1324 if (mdev->state.disk != D_DISKLESS)
1325 dev_err(DEV,
1326 "ASSERT FAILED: disk is %s while going diskless\n",
1327 drbd_disk_str(mdev->state.disk));
1328
1329 mdev->rs_total = 0;
1330 mdev->rs_failed = 0;
1331 atomic_set(&mdev->rs_pending_cnt, 0);
1332
927036f9 1333 if (!drbd_send_state(mdev))
b8907339
PR
1334 dev_warn(DEV, "Notified peer that I'm now diskless.\n");
1335 /* corresponding get_ldev in __drbd_set_state
1336 * this may finally trigger drbd_ldev_destroy. */
1337 put_ldev(mdev);
1338 }
1339
1340 /* Notify peer that I had a local IO error, and did not detached.. */
1341 if (os.disk == D_UP_TO_DATE && ns.disk == D_INCONSISTENT)
1342 drbd_send_state(mdev);
1343
1344 /* Disks got bigger while they were detached */
1345 if (ns.disk > D_NEGOTIATING && ns.pdsk > D_NEGOTIATING &&
1346 test_and_clear_bit(RESYNC_AFTER_NEG, &mdev->flags)) {
1347 if (ns.conn == C_CONNECTED)
1348 resync_after_online_grow(mdev);
1349 }
1350
1351 /* A resync finished or aborted, wake paused devices... */
1352 if ((os.conn > C_CONNECTED && ns.conn <= C_CONNECTED) ||
1353 (os.peer_isp && !ns.peer_isp) ||
1354 (os.user_isp && !ns.user_isp))
1355 resume_next_sg(mdev);
1356
1357 /* sync target done with resync. Explicitly notify peer, even though
1358 * it should (at least for non-empty resyncs) already know itself. */
1359 if (os.disk < D_UP_TO_DATE && os.conn >= C_SYNC_SOURCE && ns.conn == C_CONNECTED)
1360 drbd_send_state(mdev);
1361
1362 /* This triggers bitmap writeout of potentially still unwritten pages
1363 * if the resync finished cleanly, or aborted because of peer disk
1364 * failure, or because of connection loss.
1365 * For resync aborted because of local disk failure, we cannot do
1366 * any bitmap writeout anymore.
1367 * No harm done if some bits change during this phase.
1368 */
1369 if (os.conn > C_CONNECTED && ns.conn <= C_CONNECTED && get_ldev(mdev)) {
1370 drbd_queue_bitmap_io(mdev, &drbd_bm_write, NULL,
1371 "write from resync_finished", BM_LOCKED_SET_ALLOWED);
1372 put_ldev(mdev);
1373 }
1374
1375 if (ns.disk == D_DISKLESS &&
1376 ns.conn == C_STANDALONE &&
1377 ns.role == R_SECONDARY) {
1378 if (os.aftr_isp != ns.aftr_isp)
1379 resume_next_sg(mdev);
1380 }
1381
b8907339
PR
1382 drbd_md_sync(mdev);
1383}
1384
bbeb641c
PR
1385struct after_conn_state_chg_work {
1386 struct drbd_work w;
1387 enum drbd_conns oc;
8c7e16c3 1388 union drbd_state ns_min;
5f082f98 1389 union drbd_state ns_max; /* new, max state, over all mdevs */
bbeb641c
PR
1390 enum chg_state_flags flags;
1391};
1392
99920dc5 1393static int w_after_conn_state_ch(struct drbd_work *w, int unused)
bbeb641c
PR
1394{
1395 struct after_conn_state_chg_work *acscw =
1396 container_of(w, struct after_conn_state_chg_work, w);
1397 struct drbd_tconn *tconn = w->tconn;
1398 enum drbd_conns oc = acscw->oc;
5f082f98 1399 union drbd_state ns_max = acscw->ns_max;
a6d00c8e
PR
1400 union drbd_state ns_min = acscw->ns_min;
1401 struct drbd_conf *mdev;
1402 int vnr;
bbeb641c
PR
1403
1404 kfree(acscw);
1405
b8907339 1406 /* Upon network configuration, we need to start the receiver */
5f082f98 1407 if (oc == C_STANDALONE && ns_max.conn == C_UNCONNECTED)
b8907339
PR
1408 drbd_thread_start(&tconn->receiver);
1409
f3dfa40a
LE
1410 if (oc == C_DISCONNECTING && ns_max.conn == C_STANDALONE) {
1411 struct net_conf *old_conf;
1412
a0095508 1413 mutex_lock(&tconn->conf_update);
f3dfa40a
LE
1414 old_conf = tconn->net_conf;
1415 rcu_assign_pointer(tconn->net_conf, NULL);
1416 conn_free_crypto(tconn);
a0095508 1417 mutex_unlock(&tconn->conf_update);
f3dfa40a
LE
1418
1419 synchronize_rcu();
1420 kfree(old_conf);
1421 }
1422
a6d00c8e
PR
1423 if (ns_max.susp_fen) {
1424 /* case1: The outdate peer handler is successful: */
1425 if (ns_max.pdsk <= D_OUTDATED) {
1426 tl_clear(tconn);
695d08fa 1427 rcu_read_lock();
a6d00c8e
PR
1428 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1429 if (test_bit(NEW_CUR_UUID, &mdev->flags)) {
1430 drbd_uuid_new_current(mdev);
1431 clear_bit(NEW_CUR_UUID, &mdev->flags);
1432 }
1433 }
695d08fa 1434 rcu_read_unlock();
a6d00c8e
PR
1435 conn_request_state(tconn,
1436 (union drbd_state) { { .susp_fen = 1 } },
1437 (union drbd_state) { { .susp_fen = 0 } },
1438 CS_VERBOSE);
1439 }
1440 /* case2: The connection was established again: */
1441 if (ns_min.conn >= C_CONNECTED) {
695d08fa 1442 rcu_read_lock();
a6d00c8e
PR
1443 idr_for_each_entry(&tconn->volumes, mdev, vnr)
1444 clear_bit(NEW_CUR_UUID, &mdev->flags);
695d08fa 1445 rcu_read_unlock();
a6d00c8e
PR
1446 spin_lock_irq(&tconn->req_lock);
1447 _tl_restart(tconn, RESEND);
1448 _conn_request_state(tconn,
1449 (union drbd_state) { { .susp_fen = 1 } },
1450 (union drbd_state) { { .susp_fen = 0 } },
1451 CS_VERBOSE);
1452 spin_unlock_irq(&tconn->req_lock);
1453 }
1454 }
9dc9fbb3 1455 kref_put(&tconn->kref, &conn_destroy);
99920dc5 1456 return 0;
bbeb641c
PR
1457}
1458
435693e8 1459void conn_old_common_state(struct drbd_tconn *tconn, union drbd_state *pcs, enum chg_state_flags *pf)
88ef594e 1460{
435693e8 1461 enum chg_state_flags flags = ~0;
da9fbc27 1462 union drbd_dev_state os, cs = {}; /* old_state, common_state */
88ef594e 1463 struct drbd_conf *mdev;
435693e8 1464 int vnr, first_vol = 1;
88ef594e 1465
695d08fa 1466 rcu_read_lock();
88ef594e
PR
1467 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1468 os = mdev->state;
1469
435693e8
PR
1470 if (first_vol) {
1471 cs = os;
1472 first_vol = 0;
1473 continue;
1474 }
1475
1476 if (cs.role != os.role)
1477 flags &= ~CS_DC_ROLE;
1478
1479 if (cs.peer != os.peer)
1480 flags &= ~CS_DC_PEER;
1481
1482 if (cs.conn != os.conn)
1483 flags &= ~CS_DC_CONN;
88ef594e 1484
435693e8
PR
1485 if (cs.disk != os.disk)
1486 flags &= ~CS_DC_DISK;
88ef594e 1487
435693e8
PR
1488 if (cs.pdsk != os.pdsk)
1489 flags &= ~CS_DC_PDSK;
1490 }
695d08fa 1491 rcu_read_unlock();
435693e8
PR
1492
1493 *pf |= CS_DC_MASK;
1494 *pf &= flags;
da9fbc27 1495 (*pcs).i = cs.i;
88ef594e 1496}
bbeb641c 1497
bd0c824a
PR
1498static enum drbd_state_rv
1499conn_is_valid_transition(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
88ef594e 1500 enum chg_state_flags flags)
bbeb641c 1501{
bd0c824a 1502 enum drbd_state_rv rv = SS_SUCCESS;
bbeb641c 1503 union drbd_state ns, os;
bd0c824a
PR
1504 struct drbd_conf *mdev;
1505 int vnr;
bbeb641c 1506
695d08fa 1507 rcu_read_lock();
bd0c824a 1508 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
78bae59b 1509 os = drbd_read_state(mdev);
bd0c824a
PR
1510 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
1511
778bcf2e
PR
1512 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED)
1513 ns.disk = os.disk;
1514
bd0c824a
PR
1515 if (ns.i == os.i)
1516 continue;
bbeb641c 1517
bd0c824a
PR
1518 rv = is_valid_transition(os, ns);
1519 if (rv < SS_SUCCESS)
1520 break;
1521
1522 if (!(flags & CS_HARD)) {
1523 rv = is_valid_state(mdev, ns);
1524 if (rv < SS_SUCCESS) {
1525 if (is_valid_state(mdev, os) == rv)
1526 rv = is_valid_soft_transition(os, ns);
1527 } else
1528 rv = is_valid_soft_transition(os, ns);
1529 }
1530 if (rv < SS_SUCCESS)
1531 break;
bbeb641c 1532 }
695d08fa 1533 rcu_read_unlock();
bbeb641c 1534
bd0c824a
PR
1535 if (rv < SS_SUCCESS && flags & CS_VERBOSE)
1536 print_st_err(mdev, os, ns, rv);
1537
1538 return rv;
bbeb641c
PR
1539}
1540
8c7e16c3 1541void
bd0c824a 1542conn_set_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
8c7e16c3 1543 union drbd_state *pns_min, union drbd_state *pns_max, enum chg_state_flags flags)
bbeb641c 1544{
8c7e16c3
PR
1545 union drbd_state ns, os, ns_max = { };
1546 union drbd_state ns_min = {
1547 { .role = R_MASK,
1548 .peer = R_MASK,
1549 .disk = D_MASK,
1550 .pdsk = D_MASK
1551 } };
bd0c824a 1552 struct drbd_conf *mdev;
bbeb641c 1553 enum drbd_state_rv rv;
bd0c824a 1554 int vnr;
bbeb641c 1555
bd0c824a
PR
1556 if (mask.conn == C_MASK)
1557 tconn->cstate = val.conn;
1558
695d08fa 1559 rcu_read_lock();
bd0c824a 1560 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
78bae59b 1561 os = drbd_read_state(mdev);
bd0c824a
PR
1562 ns = apply_mask_val(os, mask, val);
1563 ns = sanitize_state(mdev, ns, NULL);
bbeb641c 1564
778bcf2e
PR
1565 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED)
1566 ns.disk = os.disk;
1567
bd0c824a
PR
1568 rv = __drbd_set_state(mdev, ns, flags, NULL);
1569 if (rv < SS_SUCCESS)
1570 BUG();
bbeb641c 1571
8c7e16c3
PR
1572 ns.i = mdev->state.i;
1573 ns_max.role = max_role(ns.role, ns_max.role);
1574 ns_max.peer = max_role(ns.peer, ns_max.peer);
1575 ns_max.conn = max_t(enum drbd_conns, ns.conn, ns_max.conn);
1576 ns_max.disk = max_t(enum drbd_disk_state, ns.disk, ns_max.disk);
1577 ns_max.pdsk = max_t(enum drbd_disk_state, ns.pdsk, ns_max.pdsk);
1578
1579 ns_min.role = min_role(ns.role, ns_min.role);
1580 ns_min.peer = min_role(ns.peer, ns_min.peer);
1581 ns_min.conn = min_t(enum drbd_conns, ns.conn, ns_min.conn);
1582 ns_min.disk = min_t(enum drbd_disk_state, ns.disk, ns_min.disk);
1583 ns_min.pdsk = min_t(enum drbd_disk_state, ns.pdsk, ns_min.pdsk);
bd0c824a 1584 }
695d08fa 1585 rcu_read_unlock();
bbeb641c 1586
8c7e16c3
PR
1587 ns_min.susp = ns_max.susp = tconn->susp;
1588 ns_min.susp_nod = ns_max.susp_nod = tconn->susp_nod;
1589 ns_min.susp_fen = ns_max.susp_fen = tconn->susp_fen;
1590
1591 *pns_min = ns_min;
1592 *pns_max = ns_max;
bbeb641c
PR
1593}
1594
df24aa45
PR
1595static enum drbd_state_rv
1596_conn_rq_cond(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val)
1597{
df24aa45
PR
1598 enum drbd_state_rv rv;
1599
1600 if (test_and_clear_bit(CONN_WD_ST_CHG_OKAY, &tconn->flags))
1601 return SS_CW_SUCCESS;
1602
1603 if (test_and_clear_bit(CONN_WD_ST_CHG_FAIL, &tconn->flags))
1604 return SS_CW_FAILED_BY_PEER;
1605
df24aa45
PR
1606 spin_lock_irq(&tconn->req_lock);
1607 rv = tconn->cstate != C_WF_REPORT_PARAMS ? SS_CW_NO_NEED : SS_UNKNOWN_ERROR;
1608
1609 if (rv == SS_UNKNOWN_ERROR)
435693e8 1610 rv = conn_is_valid_transition(tconn, mask, val, 0);
df24aa45 1611
bd0c824a
PR
1612 if (rv == SS_SUCCESS)
1613 rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
df24aa45
PR
1614
1615 spin_unlock_irq(&tconn->req_lock);
1616
1617 return rv;
1618}
1619
1620static enum drbd_state_rv
1621conn_cl_wide(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
1622 enum chg_state_flags f)
1623{
1624 enum drbd_state_rv rv;
1625
1626 spin_unlock_irq(&tconn->req_lock);
1627 mutex_lock(&tconn->cstate_mutex);
1628
caee1c3a 1629 if (conn_send_state_req(tconn, mask, val)) {
df24aa45
PR
1630 rv = SS_CW_FAILED_BY_PEER;
1631 /* if (f & CS_VERBOSE)
1632 print_st_err(mdev, os, ns, rv); */
1633 goto abort;
1634 }
1635
1636 wait_event(tconn->ping_wait, (rv = _conn_rq_cond(tconn, mask, val)));
1637
1638abort:
1639 mutex_unlock(&tconn->cstate_mutex);
1640 spin_lock_irq(&tconn->req_lock);
1641
1642 return rv;
1643}
1644
bbeb641c
PR
1645enum drbd_state_rv
1646_conn_request_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
1647 enum chg_state_flags flags)
1648{
1649 enum drbd_state_rv rv = SS_SUCCESS;
bbeb641c
PR
1650 struct after_conn_state_chg_work *acscw;
1651 enum drbd_conns oc = tconn->cstate;
8c7e16c3 1652 union drbd_state ns_max, ns_min, os;
bbeb641c 1653
bbeb641c
PR
1654 rv = is_valid_conn_transition(oc, val.conn);
1655 if (rv < SS_SUCCESS)
1656 goto abort;
1657
88ef594e 1658 rv = conn_is_valid_transition(tconn, mask, val, flags);
bbeb641c
PR
1659 if (rv < SS_SUCCESS)
1660 goto abort;
1661
df24aa45
PR
1662 if (oc == C_WF_REPORT_PARAMS && val.conn == C_DISCONNECTING &&
1663 !(flags & (CS_LOCAL_ONLY | CS_HARD))) {
1664 rv = conn_cl_wide(tconn, mask, val, flags);
1665 if (rv < SS_SUCCESS)
1666 goto abort;
1667 }
1668
435693e8 1669 conn_old_common_state(tconn, &os, &flags);
706cb24c 1670 flags |= CS_DC_SUSP;
8c7e16c3 1671 conn_set_state(tconn, mask, val, &ns_min, &ns_max, flags);
5f082f98 1672 conn_pr_state_change(tconn, os, ns_max, flags);
bbeb641c
PR
1673
1674 acscw = kmalloc(sizeof(*acscw), GFP_ATOMIC);
1675 if (acscw) {
435693e8 1676 acscw->oc = os.conn;
8c7e16c3 1677 acscw->ns_min = ns_min;
5f082f98 1678 acscw->ns_max = ns_max;
bbeb641c
PR
1679 acscw->flags = flags;
1680 acscw->w.cb = w_after_conn_state_ch;
9dc9fbb3 1681 kref_get(&tconn->kref);
bbeb641c
PR
1682 acscw->w.tconn = tconn;
1683 drbd_queue_work(&tconn->data.work, &acscw->w);
1684 } else {
1685 conn_err(tconn, "Could not kmalloc an acscw\n");
b8907339 1686 }
bbeb641c
PR
1687
1688abort:
bbeb641c
PR
1689 return rv;
1690}
1691
1692enum drbd_state_rv
1693conn_request_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
1694 enum chg_state_flags flags)
1695{
1696 enum drbd_state_rv rv;
1697
1698 spin_lock_irq(&tconn->req_lock);
1699 rv = _conn_request_state(tconn, mask, val, flags);
1700 spin_unlock_irq(&tconn->req_lock);
1701
1702 return rv;
b8907339 1703}