aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_state.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-03-25 07:02:20 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:44:56 -0500
commitbd0c824a9db54bfbf5a26a5bb9b604d65c25b904 (patch)
treea2db4667e1e82e37c50707ec7022479af1e83399 /drivers/block/drbd/drbd_state.c
parent4a76b1612f35d8c3e5c3e77e10c7d72eed79dfe0 (diff)
drbd: Use the idr_for_each_entry() iterator instead of idr_for_each()
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_state.c')
-rw-r--r--drivers/block/drbd/drbd_state.c150
1 files changed, 75 insertions, 75 deletions
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c
index b4f668db3296..85cfbeadd513 100644
--- a/drivers/block/drbd/drbd_state.c
+++ b/drivers/block/drbd/drbd_state.c
@@ -1378,9 +1378,6 @@ static void print_conn_state_change(struct drbd_tconn *tconn, enum drbd_conns oc
1378} 1378}
1379 1379
1380struct _is_valid_itr_params { 1380struct _is_valid_itr_params {
1381 enum chg_state_flags flags;
1382 union drbd_state mask, val;
1383 union drbd_state ms; /* maximal state, over all mdevs */
1384 enum drbd_conns oc; 1381 enum drbd_conns oc;
1385 enum { 1382 enum {
1386 OC_UNINITIALIZED, 1383 OC_UNINITIALIZED,
@@ -1389,69 +1386,86 @@ struct _is_valid_itr_params {
1389 } oc_state; 1386 } oc_state;
1390}; 1387};
1391 1388
1392static int _is_valid_itr_fn(int vnr, void *p, void *data) 1389static enum drbd_state_rv
1390conn_is_valid_transition(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
1391 enum chg_state_flags flags, struct _is_valid_itr_params *params)
1393{ 1392{
1394 struct drbd_conf *mdev = (struct drbd_conf *)p; 1393 enum drbd_state_rv rv = SS_SUCCESS;
1395 struct _is_valid_itr_params *params = (struct _is_valid_itr_params *)data;
1396 enum chg_state_flags flags = params->flags;
1397 union drbd_state ns, os; 1394 union drbd_state ns, os;
1398 enum drbd_state_rv rv; 1395 struct drbd_conf *mdev;
1396 int vnr;
1399 1397
1400 os = mdev->state; 1398 params->oc_state = OC_UNINITIALIZED;
1401 ns = apply_mask_val(os, params->mask, params->val); 1399 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1402 ns = sanitize_state(mdev, ns, NULL); 1400 os = mdev->state;
1403 rv = is_valid_state(mdev, ns); 1401 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
1402
1403 switch (params->oc_state) {
1404 case OC_UNINITIALIZED:
1405 params->oc = os.conn;
1406 params->oc_state = OC_CONSISTENT;
1407 break;
1408 case OC_CONSISTENT:
1409 if (params->oc != os.conn)
1410 params->oc_state = OC_INCONSISTENT;
1411 break;
1412 case OC_INCONSISTENT:
1413 break;
1414 }
1404 1415
1405 if (rv < SS_SUCCESS) { 1416 if (ns.i == os.i)
1406 /* If the old state was illegal as well, then let this happen...*/ 1417 continue;
1407 1418
1408 if (is_valid_state(mdev, os) == rv) 1419 rv = is_valid_transition(os, ns);
1409 rv = is_valid_soft_transition(os, ns); 1420 if (rv < SS_SUCCESS)
1410 } else 1421 break;
1411 rv = is_valid_soft_transition(os, ns); 1422
1412 1423 if (!(flags & CS_HARD)) {
1413 switch (params->oc_state) { 1424 rv = is_valid_state(mdev, ns);
1414 case OC_UNINITIALIZED: 1425 if (rv < SS_SUCCESS) {
1415 params->oc = os.conn; 1426 if (is_valid_state(mdev, os) == rv)
1416 params->oc_state = OC_CONSISTENT; 1427 rv = is_valid_soft_transition(os, ns);
1417 break; 1428 } else
1418 case OC_CONSISTENT: 1429 rv = is_valid_soft_transition(os, ns);
1419 if (params->oc != os.conn) 1430 }
1420 params->oc_state = OC_INCONSISTENT; 1431 if (rv < SS_SUCCESS)
1421 break; 1432 break;
1422 case OC_INCONSISTENT:
1423 break;
1424 } 1433 }
1425 1434
1426 if (rv < SS_SUCCESS) { 1435 if (rv < SS_SUCCESS && flags & CS_VERBOSE)
1427 if (flags & CS_VERBOSE) 1436 print_st_err(mdev, os, ns, rv);
1428 print_st_err(mdev, os, ns, rv); 1437
1429 return rv; 1438 return rv;
1430 } else
1431 return 0;
1432} 1439}
1433 1440
1434static int _set_state_itr_fn(int vnr, void *p, void *data) 1441static union drbd_state
1442conn_set_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state val,
1443 enum chg_state_flags flags)
1435{ 1444{
1436 struct drbd_conf *mdev = (struct drbd_conf *)p; 1445 union drbd_state ns, os, ms = { };
1437 struct _is_valid_itr_params *params = (struct _is_valid_itr_params *)data; 1446 struct drbd_conf *mdev;
1438 enum chg_state_flags flags = params->flags;
1439 union drbd_state os, ns, ms = params->ms;
1440 enum drbd_state_rv rv; 1447 enum drbd_state_rv rv;
1448 int vnr;
1441 1449
1442 os = mdev->state; 1450 if (mask.conn == C_MASK)
1443 ns = apply_mask_val(os, params->mask, params->val); 1451 tconn->cstate = val.conn;
1444 ns = sanitize_state(mdev, ns, NULL); 1452
1453 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1454 os = mdev->state;
1455 ns = apply_mask_val(os, mask, val);
1456 ns = sanitize_state(mdev, ns, NULL);
1445 1457
1446 rv = __drbd_set_state(mdev, ns, flags, NULL); 1458 rv = __drbd_set_state(mdev, ns, flags, NULL);
1459 if (rv < SS_SUCCESS)
1460 BUG();
1447 1461
1448 ms.role = max_role(ns.role, ms.role); 1462 ms.role = max_role(mdev->state.role, ms.role);
1449 ms.peer = max_role(ns.peer, ms.peer); 1463 ms.peer = max_role(mdev->state.peer, ms.peer);
1450 ms.disk = max_t(enum drbd_role, mdev->state.disk, ms.disk); 1464 ms.disk = max_t(enum drbd_disk_state, mdev->state.disk, ms.disk);
1451 ms.pdsk = max_t(enum drbd_role, mdev->state.pdsk, ms.pdsk); 1465 ms.pdsk = max_t(enum drbd_disk_state, mdev->state.pdsk, ms.pdsk);
1452 params->ms = ms; 1466 }
1453 1467
1454 return 0; 1468 return ms;
1455} 1469}
1456 1470
1457static enum drbd_state_rv 1471static enum drbd_state_rv
@@ -1466,18 +1480,14 @@ _conn_rq_cond(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state
1466 if (test_and_clear_bit(CONN_WD_ST_CHG_FAIL, &tconn->flags)) 1480 if (test_and_clear_bit(CONN_WD_ST_CHG_FAIL, &tconn->flags))
1467 return SS_CW_FAILED_BY_PEER; 1481 return SS_CW_FAILED_BY_PEER;
1468 1482
1469 params.flags = CS_NO_CSTATE_CHG; /* ΓΆΓΆ think */
1470 params.mask = mask;
1471 params.val = val;
1472
1473 spin_lock_irq(&tconn->req_lock); 1483 spin_lock_irq(&tconn->req_lock);
1474 rv = tconn->cstate != C_WF_REPORT_PARAMS ? SS_CW_NO_NEED : SS_UNKNOWN_ERROR; 1484 rv = tconn->cstate != C_WF_REPORT_PARAMS ? SS_CW_NO_NEED : SS_UNKNOWN_ERROR;
1475 1485
1476 if (rv == SS_UNKNOWN_ERROR) 1486 if (rv == SS_UNKNOWN_ERROR)
1477 rv = idr_for_each(&tconn->volumes, _is_valid_itr_fn, &params); 1487 rv = conn_is_valid_transition(tconn, mask, val, CS_NO_CSTATE_CHG, &params);
1478 1488
1479 if (rv == 0) /* idr_for_each semantics */ 1489 if (rv == SS_SUCCESS)
1480 rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */ 1490 rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
1481 1491
1482 spin_unlock_irq(&tconn->req_lock); 1492 spin_unlock_irq(&tconn->req_lock);
1483 1493
@@ -1517,22 +1527,13 @@ _conn_request_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_
1517 struct _is_valid_itr_params params; 1527 struct _is_valid_itr_params params;
1518 struct after_conn_state_chg_work *acscw; 1528 struct after_conn_state_chg_work *acscw;
1519 enum drbd_conns oc = tconn->cstate; 1529 enum drbd_conns oc = tconn->cstate;
1530 union drbd_state ms;
1520 1531
1521 rv = is_valid_conn_transition(oc, val.conn); 1532 rv = is_valid_conn_transition(oc, val.conn);
1522 if (rv < SS_SUCCESS) 1533 if (rv < SS_SUCCESS)
1523 goto abort; 1534 goto abort;
1524 1535
1525 params.flags = flags; 1536 rv = conn_is_valid_transition(tconn, mask, val, flags, &params);
1526 params.mask = mask;
1527 params.val = val;
1528 params.oc_state = OC_UNINITIALIZED;
1529
1530 if (!(flags & CS_HARD))
1531 rv = idr_for_each(&tconn->volumes, _is_valid_itr_fn, &params);
1532
1533 if (rv == 0) /* idr_for_each semantics */
1534 rv = SS_SUCCESS;
1535
1536 if (rv < SS_SUCCESS) 1537 if (rv < SS_SUCCESS)
1537 goto abort; 1538 goto abort;
1538 1539
@@ -1546,17 +1547,16 @@ _conn_request_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_
1546 if (params.oc_state == OC_CONSISTENT) { 1547 if (params.oc_state == OC_CONSISTENT) {
1547 oc = params.oc; 1548 oc = params.oc;
1548 print_conn_state_change(tconn, oc, val.conn); 1549 print_conn_state_change(tconn, oc, val.conn);
1549 params.flags |= CS_NO_CSTATE_CHG; 1550 flags |= CS_NO_CSTATE_CHG;
1550 } 1551 }
1551 tconn->cstate = val.conn; 1552
1552 params.ms.i = 0; 1553 ms = conn_set_state(tconn, mask, val, flags);
1553 params.ms.conn = val.conn; 1554 ms.conn = val.conn;
1554 idr_for_each(&tconn->volumes, _set_state_itr_fn, &params);
1555 1555
1556 acscw = kmalloc(sizeof(*acscw), GFP_ATOMIC); 1556 acscw = kmalloc(sizeof(*acscw), GFP_ATOMIC);
1557 if (acscw) { 1557 if (acscw) {
1558 acscw->oc = oc; 1558 acscw->oc = oc;
1559 acscw->nms = params.ms; 1559 acscw->nms = ms;
1560 acscw->flags = flags; 1560 acscw->flags = flags;
1561 acscw->w.cb = w_after_conn_state_ch; 1561 acscw->w.cb = w_after_conn_state_ch;
1562 acscw->w.tconn = tconn; 1562 acscw->w.tconn = tconn;