Lines Matching refs:ns
26 union drbd_state ns;
281 union drbd_state ns, enum chg_state_flags flags,
285 static enum drbd_state_rv is_valid_transition(union drbd_state os, union drbd_state ns);
287 union drbd_state ns, enum sanitize_state_warnings *warn);
465 * @ns: new (wanted) state.
468 union drbd_state os, union drbd_state ns)
470 return (os.conn >= C_CONNECTED && ns.conn >= C_CONNECTED &&
471 ((os.role != R_PRIMARY && ns.role == R_PRIMARY) ||
472 (os.conn != C_STARTING_SYNC_T && ns.conn == C_STARTING_SYNC_T) ||
473 (os.conn != C_STARTING_SYNC_S && ns.conn == C_STARTING_SYNC_S) ||
474 (os.disk != D_FAILED && ns.disk == D_FAILED))) ||
475 (os.conn >= C_CONNECTED && ns.conn == C_DISCONNECTING) ||
476 (os.conn == C_CONNECTED && ns.conn == C_VERIFY_S) ||
477 (os.conn == C_CONNECTED && ns.conn == C_WF_REPORT_PARAMS);
483 union drbd_state ns;
484 ns.i = (os.i & ~mask.i) | val.i;
485 return ns;
493 union drbd_state ns;
497 ns = apply_mask_val(drbd_read_state(device), mask, val);
498 rv = _drbd_set_state(device, ns, f, NULL);
520 union drbd_state os, ns;
532 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL);
533 rv = is_valid_transition(os, ns);
537 if (!cl_wide_st_chg(device, os, ns))
540 rv = is_valid_state(device, ns);
542 rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection);
568 union drbd_state os, ns;
581 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL);
582 rv = is_valid_transition(os, ns);
588 if (cl_wide_st_chg(device, os, ns)) {
589 rv = is_valid_state(device, ns);
591 rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection);
596 print_st_err(device, os, ns, rv);
603 print_st_err(device, os, ns, rv);
612 print_st_err(device, os, ns, rv);
616 ns = apply_mask_val(drbd_read_state(device), mask, val);
617 rv = _drbd_set_state(device, ns, f, &done);
619 rv = _drbd_set_state(device, ns, f, &done);
715 static void print_st(struct drbd_device *device, const char *name, union drbd_state ns)
719 drbd_conn_str(ns.conn),
720 drbd_role_str(ns.role),
721 drbd_role_str(ns.peer),
722 drbd_disk_str(ns.disk),
723 drbd_disk_str(ns.pdsk),
724 is_susp(ns) ? 's' : 'r',
725 ns.aftr_isp ? 'a' : '-',
726 ns.peer_isp ? 'p' : '-',
727 ns.user_isp ? 'u' : '-',
728 ns.susp_fen ? 'F' : '-',
729 ns.susp_nod ? 'N' : '-'
734 union drbd_state ns, enum drbd_state_rv err)
740 print_st(device, "wanted", ns);
743 static long print_state_change(char *pb, union drbd_state os, union drbd_state ns,
750 if (ns.role != os.role && flags & CS_DC_ROLE)
753 drbd_role_str(ns.role));
754 if (ns.peer != os.peer && flags & CS_DC_PEER)
757 drbd_role_str(ns.peer));
758 if (ns.conn != os.conn && flags & CS_DC_CONN)
761 drbd_conn_str(ns.conn));
762 if (ns.disk != os.disk && flags & CS_DC_DISK)
765 drbd_disk_str(ns.disk));
766 if (ns.pdsk != os.pdsk && flags & CS_DC_PDSK)
769 drbd_disk_str(ns.pdsk));
774 static void drbd_pr_state_change(struct drbd_device *device, union drbd_state os, union drbd_state ns,
780 pbp += print_state_change(pbp, os, ns, flags ^ CS_DC_MASK);
782 if (ns.aftr_isp != os.aftr_isp)
785 ns.aftr_isp);
786 if (ns.peer_isp != os.peer_isp)
789 ns.peer_isp);
790 if (ns.user_isp != os.user_isp)
793 ns.user_isp);
799 static void conn_pr_state_change(struct drbd_connection *connection, union drbd_state os, union drbd_state ns,
805 pbp += print_state_change(pbp, os, ns, flags);
807 if (is_susp(ns) != is_susp(os) && flags & CS_DC_SUSP)
810 is_susp(ns));
818 * is_valid_state() - Returns an SS_ error code if ns is not valid
820 * @ns: State to consider.
823 is_valid_state(struct drbd_device *device, union drbd_state ns)
840 if (!nc->two_primaries && ns.role == R_PRIMARY) {
841 if (ns.peer == R_PRIMARY)
850 else if (ns.role == R_SECONDARY && device->open_cnt)
853 else if (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.disk < D_UP_TO_DATE)
857 ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk >= D_UNKNOWN)
860 else if (ns.role == R_PRIMARY && ns.disk <= D_INCONSISTENT && ns.pdsk <= D_INCONSISTENT)
863 else if (ns.conn > C_CONNECTED && ns.disk < D_INCONSISTENT)
866 else if (ns.conn > C_CONNECTED && ns.pdsk < D_INCONSISTENT)
869 else if (ns.conn > C_CONNECTED && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)
872 else if ((ns.conn == C_CONNECTED ||
873 ns.conn == C_WF_BITMAP_S ||
874 ns.conn == C_SYNC_SOURCE ||
875 ns.conn == C_PAUSED_SYNC_S) &&
876 ns.disk == D_OUTDATED)
879 else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
883 else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
887 else if (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)
890 else if ((ns.conn == C_STARTING_SYNC_S || ns.conn == C_STARTING_SYNC_T) &&
891 ns.pdsk == D_UNKNOWN)
894 else if (ns.conn >= C_CONNECTED && ns.pdsk == D_UNKNOWN)
908 * @ns: new state.
912 is_valid_soft_transition(union drbd_state os, union drbd_state ns, struct drbd_connection *connection)
916 if ((ns.conn == C_STARTING_SYNC_T || ns.conn == C_STARTING_SYNC_S) &&
920 if (ns.conn == C_DISCONNECTING && os.conn == C_STANDALONE)
923 if (ns.disk > D_ATTACHING && os.disk == D_DISKLESS)
926 if (ns.conn == C_WF_CONNECTION && os.conn < C_UNCONNECTED)
929 if (ns.disk == D_OUTDATED && os.disk < D_OUTDATED && os.disk != D_ATTACHING)
932 if (ns.conn == C_DISCONNECTING && os.conn == C_UNCONNECTED)
938 !((ns.conn == C_WF_REPORT_PARAMS && os.conn == C_WF_CONNECTION) ||
939 (ns.conn >= C_CONNECTED && os.conn == C_WF_REPORT_PARAMS)))
945 if (os.role != R_PRIMARY && ns.role == R_PRIMARY
946 && ns.pdsk == D_UP_TO_DATE
947 && ns.disk != D_UP_TO_DATE && ns.disk != D_DISKLESS
948 && (ns.conn <= C_WF_SYNC_UUID || ns.conn != os.conn))
951 if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) && os.conn < C_CONNECTED)
954 if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) &&
955 ns.conn != os.conn && os.conn > C_CONNECTED)
958 if ((ns.conn == C_STARTING_SYNC_S || ns.conn == C_STARTING_SYNC_T) &&
962 if ((ns.conn == C_SYNC_TARGET || ns.conn == C_SYNC_SOURCE)
966 if (ns.conn == C_DISCONNECTING && ns.pdsk == D_OUTDATED &&
1010 * @ns: new state.
1014 is_valid_transition(union drbd_state os, union drbd_state ns)
1018 rv = is_valid_conn_transition(os.conn, ns.conn);
1021 if (ns.disk == D_FAILED && os.disk == D_DISKLESS)
1046 * @ns: new state.
1053 union drbd_state ns, enum sanitize_state_warnings *warn)
1070 if (ns.conn < C_CONNECTED) {
1071 ns.peer_isp = 0;
1072 ns.peer = R_UNKNOWN;
1073 if (ns.pdsk > D_UNKNOWN || ns.pdsk < D_INCONSISTENT)
1074 ns.pdsk = D_UNKNOWN;
1078 if (ns.conn == C_STANDALONE && ns.disk == D_DISKLESS && ns.role == R_SECONDARY)
1079 ns.aftr_isp = 0;
1083 if (ns.conn > C_CONNECTED && (ns.disk <= D_FAILED || ns.pdsk <= D_FAILED)) {
1085 *warn = ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T ?
1087 ns.conn = C_CONNECTED;
1091 if (ns.conn < C_CONNECTED && ns.disk == D_NEGOTIATING &&
1094 ns.disk = device->new_state_tmp.disk;
1095 ns.pdsk = device->new_state_tmp.pdsk;
1099 ns.disk = D_DISKLESS;
1100 ns.pdsk = D_UNKNOWN;
1106 if (ns.conn >= C_CONNECTED && ns.conn < C_AHEAD) {
1107 if (ns.disk == D_CONSISTENT || ns.disk == D_OUTDATED)
1108 ns.disk = D_UP_TO_DATE;
1109 if (ns.pdsk == D_CONSISTENT || ns.pdsk == D_OUTDATED)
1110 ns.pdsk = D_UP_TO_DATE;
1118 switch ((enum drbd_conns)ns.conn) {
1176 if (ns.disk > disk_max)
1177 ns.disk = disk_max;
1179 if (ns.disk < disk_min) {
1182 ns.disk = disk_min;
1184 if (ns.pdsk > pdsk_max)
1185 ns.pdsk = pdsk_max;
1187 if (ns.pdsk < pdsk_min) {
1190 ns.pdsk = pdsk_min;
1194 (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk > D_OUTDATED) &&
1196 ns.susp_fen = 1; /* Suspend IO while fence-peer handler runs (peer lost) */
1199 (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE) &&
1201 ns.susp_nod = 1; /* Suspend IO while no data available (no accessible data available) */
1203 if (ns.aftr_isp || ns.peer_isp || ns.user_isp) {
1204 if (ns.conn == C_SYNC_SOURCE)
1205 ns.conn = C_PAUSED_SYNC_S;
1206 if (ns.conn == C_SYNC_TARGET)
1207 ns.conn = C_PAUSED_SYNC_T;
1209 if (ns.conn == C_PAUSED_SYNC_S)
1210 ns.conn = C_SYNC_SOURCE;
1211 if (ns.conn == C_PAUSED_SYNC_T)
1212 ns.conn = C_SYNC_TARGET;
1215 return ns;
1254 * @ns: new state.
1261 _drbd_set_state(struct drbd_device *device, union drbd_state ns,
1274 ns = sanitize_state(device, os, ns, &ssw);
1275 if (ns.i == os.i)
1278 rv = is_valid_transition(os, ns);
1283 /* pre-state-change checks ; only look at ns */
1286 rv = is_valid_state(device, ns);
1292 rv = is_valid_soft_transition(os, ns, connection);
1294 rv = is_valid_soft_transition(os, ns, connection);
1299 print_st_err(device, os, ns, rv);
1305 drbd_pr_state_change(device, os, ns, flags);
1311 conn_pr_state_change(connection, os, ns,
1318 if ((os.disk != D_FAILED && ns.disk == D_FAILED) ||
1319 (os.disk != D_DISKLESS && ns.disk == D_DISKLESS))
1322 if (!is_sync_state(os.conn) && is_sync_state(ns.conn))
1332 device->state.i = ns.i;
1333 device->resource->susp = ns.susp;
1334 device->resource->susp_nod = ns.susp_nod;
1335 device->resource->susp_fen = ns.susp_fen;
1342 drbd_should_do_remote((union drbd_dev_state)ns.i))
1345 if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING)
1349 if (os.conn == C_WF_REPORT_PARAMS && ns.conn != C_WF_REPORT_PARAMS &&
1362 ns.conn <= C_CONNECTED) {
1371 (ns.conn == C_SYNC_TARGET || ns.conn == C_SYNC_SOURCE)) {
1375 if (ns.conn == C_SYNC_TARGET)
1380 (ns.conn == C_PAUSED_SYNC_T || ns.conn == C_PAUSED_SYNC_S)) {
1386 (ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T)) {
1390 set_ov_position(device, ns.conn);
1403 if (ns.conn == C_VERIFY_S) {
1433 if (os.disk < D_CONSISTENT && ns.disk >= D_CONSISTENT)
1440 os.peer == R_SECONDARY && ns.peer == R_PRIMARY)
1444 if (os.conn != C_DISCONNECTING && ns.conn == C_DISCONNECTING)
1448 if (os.conn != C_STANDALONE && ns.conn == C_STANDALONE)
1453 ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT)
1457 if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED) {
1466 ns.disk > D_NEGOTIATING)
1472 ascw->ns = ns;
1493 after_state_ch(device, ascw->os, ascw->ns, ascw->flags, ascw->state_change);
1674 static bool lost_contact_to_peer_data(enum drbd_disk_state os, enum drbd_disk_state ns)
1677 && (ns < D_INCONSISTENT || ns == D_UNKNOWN || ns == D_OUTDATED))
1687 && (ns == D_DISKLESS || ns == D_FAILED || ns == D_OUTDATED))
1697 * @ns: new state.
1701 union drbd_state ns, enum chg_state_flags flags,
1713 sib.ns = ns;
1716 && (ns.disk == D_UP_TO_DATE && ns.pdsk == D_UP_TO_DATE)) {
1726 (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE))
1732 if (ns.susp_nod) {
1753 if (ns.susp_fen) {
1785 (ns.conn == C_SYNC_SOURCE || ns.conn == C_PAUSED_SYNC_S) &&
1793 ns.pdsk > D_DISKLESS && ns.pdsk != D_UNKNOWN) { /* attach on the peer */
1802 drbd_send_state(peer_device, ns);
1807 if (os.conn != C_WF_BITMAP_S && ns.conn == C_WF_BITMAP_S &&
1814 if (lost_contact_to_peer_data(os.pdsk, ns.pdsk)) {
1816 if ((ns.role == R_PRIMARY || ns.peer == R_PRIMARY) &&
1817 device->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
1829 if (ns.pdsk < D_INCONSISTENT && get_ldev(device)) {
1830 if (os.peer != R_PRIMARY && ns.peer == R_PRIMARY &&
1831 device->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
1836 if (os.peer == R_PRIMARY && ns.peer == R_SECONDARY)
1848 if (os.role == R_PRIMARY && ns.role == R_SECONDARY &&
1858 if (ns.conn >= C_CONNECTED &&
1859 os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) {
1862 drbd_send_state(peer_device, ns);
1866 if (ns.conn >= C_CONNECTED &&
1867 ((os.aftr_isp != ns.aftr_isp) ||
1868 (os.user_isp != ns.user_isp)))
1869 drbd_send_state(peer_device, ns);
1873 (ns.aftr_isp || ns.peer_isp || ns.user_isp))
1878 if (os.conn == C_WF_REPORT_PARAMS && ns.conn >= C_CONNECTED)
1879 drbd_send_state(peer_device, ns);
1881 if (os.conn != C_AHEAD && ns.conn == C_AHEAD)
1882 drbd_send_state(peer_device, ns);
1885 if ((os.conn != C_STARTING_SYNC_T && ns.conn == C_STARTING_SYNC_T) ||
1886 (os.conn != C_STARTING_SYNC_S && ns.conn == C_STARTING_SYNC_S))
1894 if (os.disk != D_FAILED && ns.disk == D_FAILED) {
1939 if (ns.conn >= C_CONNECTED)
1940 drbd_send_state(peer_device, ns);
1955 if (os.disk != D_DISKLESS && ns.disk == D_DISKLESS) {
1963 if (ns.conn >= C_CONNECTED)
1964 drbd_send_state(peer_device, ns);
1971 if (os.disk == D_UP_TO_DATE && ns.disk == D_INCONSISTENT && ns.conn >= C_CONNECTED)
1972 drbd_send_state(peer_device, ns);
1975 if (ns.disk > D_NEGOTIATING && ns.pdsk > D_NEGOTIATING &&
1977 if (ns.conn == C_CONNECTED)
1982 if ((os.conn > C_CONNECTED && ns.conn <= C_CONNECTED) ||
1983 (os.peer_isp && !ns.peer_isp) ||
1984 (os.user_isp && !ns.user_isp))
1989 if (os.disk < D_UP_TO_DATE && os.conn >= C_SYNC_SOURCE && ns.conn == C_CONNECTED)
1990 drbd_send_state(peer_device, ns);
1995 if (os.conn == C_VERIFY_S && ns.conn == C_CONNECTED
1997 drbd_send_state(peer_device, ns);
2011 (ns.conn == C_CONNECTED || ns.conn >= C_AHEAD) && get_ldev(device)) {
2017 if (ns.disk == D_DISKLESS &&
2018 ns.conn == C_STANDALONE &&
2019 ns.role == R_SECONDARY) {
2020 if (os.aftr_isp != ns.aftr_isp)
2155 union drbd_state ns, os;
2163 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL);
2165 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED)
2166 ns.disk = os.disk;
2168 if (ns.i == os.i)
2171 rv = is_valid_transition(os, ns);
2174 rv = is_valid_state(device, ns);
2177 rv = is_valid_soft_transition(os, ns, connection);
2179 rv = is_valid_soft_transition(os, ns, connection);
2184 print_st_err(device, os, ns, rv);
2197 union drbd_state ns, os, ns_max = { };
2224 ns = apply_mask_val(os, mask, val);
2225 ns = sanitize_state(device, os, ns, NULL);
2227 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED)
2228 ns.disk = os.disk;
2230 rv = _drbd_set_state(device, ns, flags, NULL);
2232 ns.i = device->state.i;
2233 ns_max.role = max_role(ns.role, ns_max.role);
2234 ns_max.peer = max_role(ns.peer, ns_max.peer);
2235 ns_max.conn = max_t(enum drbd_conns, ns.conn, ns_max.conn);
2236 ns_max.disk = max_t(enum drbd_disk_state, ns.disk, ns_max.disk);
2237 ns_max.pdsk = max_t(enum drbd_disk_state, ns.pdsk, ns_max.pdsk);
2239 ns_min.role = min_role(ns.role, ns_min.role);
2240 ns_min.peer = min_role(ns.peer, ns_min.peer);
2241 ns_min.conn = min_t(enum drbd_conns, ns.conn, ns_min.conn);
2242 ns_min.disk = min_t(enum drbd_disk_state, ns.disk, ns_min.disk);
2243 ns_min.pdsk = min_t(enum drbd_disk_state, ns.pdsk, ns_min.pdsk);