Lines Matching refs:reg
284 struct o2hb_region *reg =
289 "milliseconds\n", reg->hr_bdev,
290 jiffies_to_msecs(jiffies - reg->hr_last_timeout_start));
294 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
295 set_bit(reg->hr_region_num, o2hb_failed_region_bitmap);
316 static void o2hb_arm_timeout(struct o2hb_region *reg)
319 if (atomic_read(®->hr_steady_iterations) != 0)
327 clear_bit(reg->hr_region_num, o2hb_failed_region_bitmap);
330 cancel_delayed_work(®->hr_write_timeout_work);
331 schedule_delayed_work(®->hr_write_timeout_work,
334 cancel_delayed_work(®->hr_nego_timeout_work);
336 schedule_delayed_work(®->hr_nego_timeout_work,
338 bitmap_zero(reg->hr_nego_node_bitmap, O2NM_MAX_NODES);
341 static void o2hb_disarm_timeout(struct o2hb_region *reg)
343 cancel_delayed_work_sync(®->hr_write_timeout_work);
344 cancel_delayed_work_sync(®->hr_nego_timeout_work);
369 struct o2hb_region *reg;
371 reg = container_of(work, struct o2hb_region, hr_nego_timeout_work.work);
375 if (reg->hr_last_hb_status)
383 if (!test_bit(master_node, reg->hr_nego_node_bitmap)) {
386 config_item_name(®->hr_item), reg->hr_bdev);
387 set_bit(master_node, reg->hr_nego_node_bitmap);
389 if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap,
394 schedule_delayed_work(®->hr_nego_timeout_work,
401 config_item_name(®->hr_item), reg->hr_bdev);
403 o2hb_arm_timeout(reg);
412 ret = o2hb_send_nego_msg(reg->hr_key,
421 o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, config_item_name(®->hr_item),
422 reg->hr_bdev, master_node);
423 ret = o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
434 struct o2hb_region *reg = data;
439 nego_msg->node_num, config_item_name(®->hr_item), reg->hr_bdev);
441 set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap);
451 struct o2hb_region *reg = data;
454 config_item_name(®->hr_item), reg->hr_bdev);
455 o2hb_arm_timeout(reg);
501 static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg,
508 unsigned int bits = reg->hr_block_bits;
509 unsigned int spp = reg->hr_slots_per_page;
518 bio = bio_alloc(reg->hr_bdev, 16, opf, GFP_ATOMIC);
526 bio->bi_iter.bi_sector = (reg->hr_start_block + cs) << (bits - 9);
533 page = reg->hr_slot_data[current_page];
553 static int o2hb_read_slots(struct o2hb_region *reg,
565 bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots,
587 static int o2hb_issue_node_write(struct o2hb_region *reg,
598 bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1,
614 static u32 o2hb_compute_block_crc_le(struct o2hb_region *reg,
626 ret = crc32_le(0, (unsigned char *) hb_block, reg->hr_block_bytes);
642 static int o2hb_verify_crc(struct o2hb_region *reg,
648 computed = o2hb_compute_block_crc_le(reg, hb_block);
660 static int o2hb_check_own_slot(struct o2hb_region *reg)
666 slot = ®->hr_slots[o2nm_this_node()];
690 "ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg->hr_bdev,
699 static inline void o2hb_prepare_block(struct o2hb_region *reg,
708 slot = ®->hr_slots[node_num];
711 memset(hb_block, 0, reg->hr_block_bytes);
723 hb_block->hb_cksum = cpu_to_le32(o2hb_compute_block_crc_le(reg,
836 static void o2hb_set_quorum_device(struct o2hb_region *reg)
846 if (atomic_read(®->hr_steady_iterations) != 0)
851 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
859 if (!bitmap_equal(reg->hr_live_node_bitmap, o2hb_live_node_bitmap,
864 config_item_name(®->hr_item), reg->hr_bdev);
866 set_bit(reg->hr_region_num, o2hb_quorum_region_bitmap);
879 static int o2hb_check_slot(struct o2hb_region *reg,
886 struct o2hb_disk_heartbeat_block *hb_block = reg->hr_tmp_block;
893 memcpy(hb_block, slot->ds_raw_block, reg->hr_block_bytes);
908 if (!o2hb_verify_crc(reg, hb_block)) {
923 slot->ds_node_num, reg->hr_bdev);
973 set_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
1006 slot->ds_node_num, reg->hr_bdev, slot_dead_ms,
1023 clear_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
1071 static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
1109 ret = o2hb_read_slots(reg, lowest_node, highest_node + 1);
1118 own_slot_ok = o2hb_check_own_slot(reg);
1121 o2hb_prepare_block(reg, reg->hr_generation);
1123 ret = o2hb_issue_node_write(reg, &write_wc);
1132 membership_change |= o2hb_check_slot(reg, ®->hr_slots[i]);
1146 write_wc.wc_error, reg->hr_bdev);
1153 o2hb_set_quorum_device(reg);
1154 o2hb_arm_timeout(reg);
1155 reg->hr_last_timeout_start = jiffies;
1160 if (atomic_read(®->hr_steady_iterations) != 0) {
1162 if (atomic_dec_and_test(®->hr_steady_iterations))
1167 if (atomic_read(®->hr_steady_iterations) != 0) {
1168 if (atomic_dec_and_test(®->hr_unsteady_iterations)) {
1171 config_item_name(®->hr_item),
1172 reg->hr_bdev);
1173 atomic_set(®->hr_steady_iterations, 0);
1174 reg->hr_aborted_start = 1;
1191 struct o2hb_region *reg = data;
1204 reg->hr_node_deleted = 1;
1210 !reg->hr_unclean_stop && !reg->hr_aborted_start) {
1218 ret = o2hb_do_disk_heartbeat(reg);
1219 reg->hr_last_hb_status = ret;
1231 elapsed_msec < reg->hr_timeout_ms) {
1234 msleep_interruptible(reg->hr_timeout_ms - elapsed_msec);
1238 o2hb_disarm_timeout(reg);
1241 for(i = 0; !reg->hr_unclean_stop && i < reg->hr_blocks; i++)
1242 o2hb_shutdown_slot(®->hr_slots[i]);
1249 if (!reg->hr_unclean_stop && !reg->hr_aborted_start) {
1250 o2hb_prepare_block(reg, 0);
1251 ret = o2hb_issue_node_write(reg, &write_wc);
1270 struct o2hb_region *reg;
1296 reg = (struct o2hb_region *)db->db_data;
1297 memcpy(map, reg->hr_live_node_bitmap, db->db_size);
1302 reg = (struct o2hb_region *)db->db_data;
1304 reg->hr_region_num);
1308 reg = (struct o2hb_region *)db->db_data;
1309 lts = reg->hr_last_timeout_start;
1317 reg = (struct o2hb_region *)db->db_data;
1319 !!reg->hr_item_pinned);
1490 struct o2hb_region *reg = to_o2hb_region(item);
1492 mlog(ML_HEARTBEAT, "hb region release (%pg)\n", reg->hr_bdev);
1494 kfree(reg->hr_tmp_block);
1496 if (reg->hr_slot_data) {
1497 for (i = 0; i < reg->hr_num_pages; i++) {
1498 page = reg->hr_slot_data[i];
1502 kfree(reg->hr_slot_data);
1505 if (reg->hr_bdev)
1506 blkdev_put(reg->hr_bdev, NULL);
1508 kfree(reg->hr_slots);
1510 debugfs_remove_recursive(reg->hr_debug_dir);
1511 kfree(reg->hr_db_livenodes);
1512 kfree(reg->hr_db_regnum);
1513 kfree(reg->hr_db_elapsed_time);
1514 kfree(reg->hr_db_pinned);
1517 list_del(®->hr_all_item);
1520 o2net_unregister_handler_list(®->hr_handler_list);
1521 kfree(reg);
1524 static int o2hb_read_block_input(struct o2hb_region *reg,
1560 struct o2hb_region *reg = to_o2hb_region(item);
1565 if (reg->hr_bdev)
1568 status = o2hb_read_block_input(reg, page, &block_bytes,
1573 reg->hr_block_bytes = (unsigned int)block_bytes;
1574 reg->hr_block_bits = block_bits;
1589 struct o2hb_region *reg = to_o2hb_region(item);
1594 if (reg->hr_bdev)
1601 reg->hr_start_block = tmp;
1615 struct o2hb_region *reg = to_o2hb_region(item);
1619 if (reg->hr_bdev)
1629 reg->hr_blocks = (unsigned int)tmp;
1644 static void o2hb_init_region_params(struct o2hb_region *reg)
1646 reg->hr_slots_per_page = PAGE_SIZE >> reg->hr_block_bits;
1647 reg->hr_timeout_ms = O2HB_REGION_TIMEOUT_MS;
1650 reg->hr_start_block, reg->hr_blocks);
1652 reg->hr_block_bytes, reg->hr_block_bits);
1653 mlog(ML_HEARTBEAT, "hr_timeout_ms = %u\n", reg->hr_timeout_ms);
1657 static int o2hb_map_slot_data(struct o2hb_region *reg)
1661 unsigned int spp = reg->hr_slots_per_page;
1666 reg->hr_tmp_block = kmalloc(reg->hr_block_bytes, GFP_KERNEL);
1667 if (reg->hr_tmp_block == NULL)
1670 reg->hr_slots = kcalloc(reg->hr_blocks,
1672 if (reg->hr_slots == NULL)
1675 for(i = 0; i < reg->hr_blocks; i++) {
1676 slot = ®->hr_slots[i];
1682 reg->hr_num_pages = (reg->hr_blocks + spp - 1) / spp;
1685 reg->hr_num_pages, reg->hr_blocks, spp);
1687 reg->hr_slot_data = kcalloc(reg->hr_num_pages, sizeof(struct page *),
1689 if (!reg->hr_slot_data)
1692 for(i = 0; i < reg->hr_num_pages; i++) {
1697 reg->hr_slot_data[i] = page;
1702 (j < spp) && ((j + last_slot) < reg->hr_blocks);
1704 BUG_ON((j + last_slot) >= reg->hr_blocks);
1706 slot = ®->hr_slots[j + last_slot];
1710 raw += reg->hr_block_bytes;
1720 static int o2hb_populate_slot_data(struct o2hb_region *reg)
1726 ret = o2hb_read_slots(reg, 0, reg->hr_blocks);
1734 for(i = 0; i < reg->hr_blocks; i++) {
1735 slot = ®->hr_slots[i];
1753 struct o2hb_region *reg = to_o2hb_region(item);
1762 if (reg->hr_bdev)
1781 if (reg->hr_blocks == 0 || reg->hr_start_block == 0 ||
1782 reg->hr_block_bytes == 0)
1788 reg->hr_bdev = blkdev_get_by_dev(f.file->f_mapping->host->i_rdev,
1791 if (IS_ERR(reg->hr_bdev)) {
1792 ret = PTR_ERR(reg->hr_bdev);
1793 reg->hr_bdev = NULL;
1797 sectsize = bdev_logical_block_size(reg->hr_bdev);
1798 if (sectsize != reg->hr_block_bytes) {
1801 reg->hr_block_bytes, sectsize);
1806 o2hb_init_region_params(reg);
1810 get_random_bytes(®->hr_generation,
1811 sizeof(reg->hr_generation));
1812 } while (reg->hr_generation == 0);
1814 ret = o2hb_map_slot_data(reg);
1820 ret = o2hb_populate_slot_data(reg);
1826 INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout);
1827 INIT_DELAYED_WORK(®->hr_nego_timeout_work, o2hb_nego_timeout);
1845 atomic_set(®->hr_steady_iterations, live_threshold);
1847 atomic_set(®->hr_unsteady_iterations, (live_threshold * 3));
1849 hb_task = kthread_run(o2hb_thread, reg, "o2hb-%s",
1850 reg->hr_item.ci_name);
1858 reg->hr_task = hb_task;
1862 atomic_read(®->hr_steady_iterations) == 0 ||
1863 reg->hr_node_deleted);
1865 atomic_set(®->hr_steady_iterations, 0);
1866 reg->hr_aborted_start = 1;
1869 if (reg->hr_aborted_start) {
1874 if (reg->hr_node_deleted) {
1881 hb_task = reg->hr_task;
1883 set_bit(reg->hr_region_num, o2hb_live_region_bitmap);
1893 config_item_name(®->hr_item), reg->hr_bdev);
1897 blkdev_put(reg->hr_bdev, NULL);
1898 reg->hr_bdev = NULL;
1908 struct o2hb_region *reg = to_o2hb_region(item);
1912 if (reg->hr_task)
1913 pid = task_pid_nr(reg->hr_task);
1961 static void o2hb_debug_region_init(struct o2hb_region *reg,
1966 dir = debugfs_create_dir(config_item_name(®->hr_item), parent);
1967 reg->hr_debug_dir = dir;
1969 o2hb_debug_create(O2HB_DEBUG_LIVENODES, dir, &(reg->hr_db_livenodes),
1970 sizeof(*(reg->hr_db_livenodes)),
1972 sizeof(reg->hr_live_node_bitmap), O2NM_MAX_NODES,
1973 reg);
1975 o2hb_debug_create(O2HB_DEBUG_REGION_NUMBER, dir, &(reg->hr_db_regnum),
1976 sizeof(*(reg->hr_db_regnum)),
1977 O2HB_DB_TYPE_REGION_NUMBER, 0, O2NM_MAX_NODES, reg);
1980 &(reg->hr_db_elapsed_time),
1981 sizeof(*(reg->hr_db_elapsed_time)),
1982 O2HB_DB_TYPE_REGION_ELAPSED_TIME, 0, 0, reg);
1984 o2hb_debug_create(O2HB_DEBUG_REGION_PINNED, dir, &(reg->hr_db_pinned),
1985 sizeof(*(reg->hr_db_pinned)),
1986 O2HB_DB_TYPE_REGION_PINNED, 0, 0, reg);
1993 struct o2hb_region *reg = NULL;
1996 reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL);
1997 if (reg == NULL)
2006 reg->hr_region_num = 0;
2008 reg->hr_region_num = find_first_zero_bit(o2hb_region_bitmap,
2010 if (reg->hr_region_num >= O2NM_MAX_REGIONS) {
2015 set_bit(reg->hr_region_num, o2hb_region_bitmap);
2017 list_add_tail(®->hr_all_item, &o2hb_all_regions);
2020 config_item_init_type_name(®->hr_item, name, &o2hb_region_type);
2026 reg->hr_key = crc32_le(reg->hr_region_num + O2NM_MAX_REGIONS,
2028 INIT_LIST_HEAD(®->hr_handler_list);
2029 ret = o2net_register_handler(O2HB_NEGO_TIMEOUT_MSG, reg->hr_key,
2032 reg, NULL, ®->hr_handler_list);
2036 ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key,
2039 reg, NULL, ®->hr_handler_list);
2043 o2hb_debug_region_init(reg, o2hb_debug_dir);
2045 return ®->hr_item;
2048 o2net_unregister_handler_list(®->hr_handler_list);
2051 list_del(®->hr_all_item);
2053 clear_bit(reg->hr_region_num, o2hb_region_bitmap);
2056 kfree(reg);
2064 struct o2hb_region *reg = to_o2hb_region(item);
2069 hb_task = reg->hr_task;
2070 reg->hr_task = NULL;
2071 reg->hr_item_dropped = 1;
2079 clear_bit(reg->hr_region_num, o2hb_region_bitmap);
2080 clear_bit(reg->hr_region_num, o2hb_live_region_bitmap);
2081 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
2083 clear_bit(reg->hr_region_num, o2hb_quorum_region_bitmap);
2086 ((atomic_read(®->hr_steady_iterations) == 0) ?
2088 reg->hr_bdev);
2093 * check reg->hr_task
2095 if (atomic_read(®->hr_steady_iterations) != 0) {
2096 reg->hr_aborted_start = 1;
2097 atomic_set(®->hr_steady_iterations, 0);
2260 struct o2hb_region *reg;
2265 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2266 if (reg->hr_item_dropped)
2269 uuid = config_item_name(®->hr_item);
2278 if (reg->hr_item_pinned || reg->hr_item_dropped)
2282 ret = o2nm_depend_item(®->hr_item);
2285 reg->hr_item_pinned = 1;
2312 struct o2hb_region *reg;
2318 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2319 if (reg->hr_item_dropped)
2322 uuid = config_item_name(®->hr_item);
2329 if (reg->hr_item_pinned) {
2331 o2nm_undepend_item(®->hr_item);
2332 reg->hr_item_pinned = 0;
2497 struct o2hb_region *reg;
2503 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item)
2504 reg->hr_unclean_stop = 1;
2512 struct o2hb_region *reg;
2519 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2520 if (reg->hr_item_dropped)
2523 mlog(0, "Region: %s\n", config_item_name(®->hr_item));
2525 memcpy(p, config_item_name(®->hr_item),