diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-03-25 07:02:20 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:44:56 -0500 |
commit | bd0c824a9db54bfbf5a26a5bb9b604d65c25b904 (patch) | |
tree | a2db4667e1e82e37c50707ec7022479af1e83399 /drivers/block/drbd/drbd_state.c | |
parent | 4a76b1612f35d8c3e5c3e77e10c7d72eed79dfe0 (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.c | 150 |
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 | ||
1380 | struct _is_valid_itr_params { | 1380 | struct _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 | ||
1392 | static int _is_valid_itr_fn(int vnr, void *p, void *data) | 1389 | static enum drbd_state_rv |
1390 | conn_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 | ||
1434 | static int _set_state_itr_fn(int vnr, void *p, void *data) | 1441 | static union drbd_state |
1442 | conn_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 | ||
1457 | static enum drbd_state_rv | 1471 | static 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, ¶ms); | 1487 | rv = conn_is_valid_transition(tconn, mask, val, CS_NO_CSTATE_CHG, ¶ms); |
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, ¶ms); |
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, ¶ms); | ||
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, ¶ms); | ||
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; |