Lines Matching refs:reg
288 struct o2hb_region *reg =
293 "milliseconds\n", reg->hr_dev_name,
294 jiffies_to_msecs(jiffies - reg->hr_last_timeout_start));
298 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
299 set_bit(reg->hr_region_num, o2hb_failed_region_bitmap);
320 static void o2hb_arm_timeout(struct o2hb_region *reg)
323 if (atomic_read(®->hr_steady_iterations) != 0)
331 clear_bit(reg->hr_region_num, o2hb_failed_region_bitmap);
334 cancel_delayed_work(®->hr_write_timeout_work);
335 schedule_delayed_work(®->hr_write_timeout_work,
338 cancel_delayed_work(®->hr_nego_timeout_work);
340 schedule_delayed_work(®->hr_nego_timeout_work,
342 memset(reg->hr_nego_node_bitmap, 0, sizeof(reg->hr_nego_node_bitmap));
345 static void o2hb_disarm_timeout(struct o2hb_region *reg)
347 cancel_delayed_work_sync(®->hr_write_timeout_work);
348 cancel_delayed_work_sync(®->hr_nego_timeout_work);
373 struct o2hb_region *reg;
375 reg = container_of(work, struct o2hb_region, hr_nego_timeout_work.work);
379 if (reg->hr_last_hb_status)
387 if (!test_bit(master_node, reg->hr_nego_node_bitmap)) {
390 config_item_name(®->hr_item), reg->hr_dev_name);
391 set_bit(master_node, reg->hr_nego_node_bitmap);
393 if (memcmp(reg->hr_nego_node_bitmap, live_node_bitmap,
394 sizeof(reg->hr_nego_node_bitmap))) {
398 schedule_delayed_work(®->hr_nego_timeout_work,
405 config_item_name(®->hr_item), reg->hr_dev_name);
407 o2hb_arm_timeout(reg);
416 ret = o2hb_send_nego_msg(reg->hr_key,
425 o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, config_item_name(®->hr_item),
426 reg->hr_dev_name, master_node);
427 ret = o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
438 struct o2hb_region *reg = data;
443 nego_msg->node_num, config_item_name(®->hr_item), reg->hr_dev_name);
445 set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap);
455 struct o2hb_region *reg = data;
458 config_item_name(®->hr_item), reg->hr_dev_name);
459 o2hb_arm_timeout(reg);
505 static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg,
513 unsigned int bits = reg->hr_block_bits;
514 unsigned int spp = reg->hr_slots_per_page;
531 bio->bi_iter.bi_sector = (reg->hr_start_block + cs) << (bits - 9);
532 bio_set_dev(bio, reg->hr_bdev);
540 page = reg->hr_slot_data[current_page];
560 static int o2hb_read_slots(struct o2hb_region *reg,
572 bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots,
594 static int o2hb_issue_node_write(struct o2hb_region *reg,
605 bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1, REQ_OP_WRITE,
621 static u32 o2hb_compute_block_crc_le(struct o2hb_region *reg,
633 ret = crc32_le(0, (unsigned char *) hb_block, reg->hr_block_bytes);
649 static int o2hb_verify_crc(struct o2hb_region *reg,
655 computed = o2hb_compute_block_crc_le(reg, hb_block);
667 static int o2hb_check_own_slot(struct o2hb_region *reg)
673 slot = ®->hr_slots[o2nm_this_node()];
697 "ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg->hr_dev_name,
706 static inline void o2hb_prepare_block(struct o2hb_region *reg,
715 slot = ®->hr_slots[node_num];
718 memset(hb_block, 0, reg->hr_block_bytes);
730 hb_block->hb_cksum = cpu_to_le32(o2hb_compute_block_crc_le(reg,
843 static void o2hb_set_quorum_device(struct o2hb_region *reg)
853 if (atomic_read(®->hr_steady_iterations) != 0)
858 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
866 if (memcmp(reg->hr_live_node_bitmap, o2hb_live_node_bitmap,
871 config_item_name(®->hr_item), reg->hr_dev_name);
873 set_bit(reg->hr_region_num, o2hb_quorum_region_bitmap);
886 static int o2hb_check_slot(struct o2hb_region *reg,
893 struct o2hb_disk_heartbeat_block *hb_block = reg->hr_tmp_block;
900 memcpy(hb_block, slot->ds_raw_block, reg->hr_block_bytes);
915 if (!o2hb_verify_crc(reg, hb_block)) {
930 slot->ds_node_num, reg->hr_dev_name);
980 set_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
1013 slot->ds_node_num, reg->hr_dev_name, slot_dead_ms,
1030 clear_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
1078 static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
1116 ret = o2hb_read_slots(reg, lowest_node, highest_node + 1);
1125 own_slot_ok = o2hb_check_own_slot(reg);
1128 o2hb_prepare_block(reg, reg->hr_generation);
1130 ret = o2hb_issue_node_write(reg, &write_wc);
1139 membership_change |= o2hb_check_slot(reg, ®->hr_slots[i]);
1153 write_wc.wc_error, reg->hr_dev_name);
1160 o2hb_set_quorum_device(reg);
1161 o2hb_arm_timeout(reg);
1162 reg->hr_last_timeout_start = jiffies;
1167 if (atomic_read(®->hr_steady_iterations) != 0) {
1169 if (atomic_dec_and_test(®->hr_steady_iterations))
1174 if (atomic_read(®->hr_steady_iterations) != 0) {
1175 if (atomic_dec_and_test(®->hr_unsteady_iterations)) {
1178 config_item_name(®->hr_item),
1179 reg->hr_dev_name);
1180 atomic_set(®->hr_steady_iterations, 0);
1181 reg->hr_aborted_start = 1;
1198 struct o2hb_region *reg = data;
1211 reg->hr_node_deleted = 1;
1217 !reg->hr_unclean_stop && !reg->hr_aborted_start) {
1225 ret = o2hb_do_disk_heartbeat(reg);
1226 reg->hr_last_hb_status = ret;
1238 elapsed_msec < reg->hr_timeout_ms) {
1241 msleep_interruptible(reg->hr_timeout_ms - elapsed_msec);
1245 o2hb_disarm_timeout(reg);
1248 for(i = 0; !reg->hr_unclean_stop && i < reg->hr_blocks; i++)
1249 o2hb_shutdown_slot(®->hr_slots[i]);
1256 if (!reg->hr_unclean_stop && !reg->hr_aborted_start) {
1257 o2hb_prepare_block(reg, 0);
1258 ret = o2hb_issue_node_write(reg, &write_wc);
1277 struct o2hb_region *reg;
1303 reg = (struct o2hb_region *)db->db_data;
1304 memcpy(map, reg->hr_live_node_bitmap, db->db_size);
1309 reg = (struct o2hb_region *)db->db_data;
1311 reg->hr_region_num);
1315 reg = (struct o2hb_region *)db->db_data;
1316 lts = reg->hr_last_timeout_start;
1324 reg = (struct o2hb_region *)db->db_data;
1326 !!reg->hr_item_pinned);
1501 struct o2hb_region *reg = to_o2hb_region(item);
1503 mlog(ML_HEARTBEAT, "hb region release (%s)\n", reg->hr_dev_name);
1505 kfree(reg->hr_tmp_block);
1507 if (reg->hr_slot_data) {
1508 for (i = 0; i < reg->hr_num_pages; i++) {
1509 page = reg->hr_slot_data[i];
1513 kfree(reg->hr_slot_data);
1516 if (reg->hr_bdev)
1517 blkdev_put(reg->hr_bdev, FMODE_READ|FMODE_WRITE);
1519 kfree(reg->hr_slots);
1521 debugfs_remove_recursive(reg->hr_debug_dir);
1522 kfree(reg->hr_db_livenodes);
1523 kfree(reg->hr_db_regnum);
1524 kfree(reg->hr_db_elapsed_time);
1525 kfree(reg->hr_db_pinned);
1528 list_del(®->hr_all_item);
1531 o2net_unregister_handler_list(®->hr_handler_list);
1532 kfree(reg);
1535 static int o2hb_read_block_input(struct o2hb_region *reg,
1571 struct o2hb_region *reg = to_o2hb_region(item);
1576 if (reg->hr_bdev)
1579 status = o2hb_read_block_input(reg, page, &block_bytes,
1584 reg->hr_block_bytes = (unsigned int)block_bytes;
1585 reg->hr_block_bits = block_bits;
1600 struct o2hb_region *reg = to_o2hb_region(item);
1604 if (reg->hr_bdev)
1611 reg->hr_start_block = tmp;
1625 struct o2hb_region *reg = to_o2hb_region(item);
1629 if (reg->hr_bdev)
1639 reg->hr_blocks = (unsigned int)tmp;
1654 static void o2hb_init_region_params(struct o2hb_region *reg)
1656 reg->hr_slots_per_page = PAGE_SIZE >> reg->hr_block_bits;
1657 reg->hr_timeout_ms = O2HB_REGION_TIMEOUT_MS;
1660 reg->hr_start_block, reg->hr_blocks);
1662 reg->hr_block_bytes, reg->hr_block_bits);
1663 mlog(ML_HEARTBEAT, "hr_timeout_ms = %u\n", reg->hr_timeout_ms);
1667 static int o2hb_map_slot_data(struct o2hb_region *reg)
1671 unsigned int spp = reg->hr_slots_per_page;
1676 reg->hr_tmp_block = kmalloc(reg->hr_block_bytes, GFP_KERNEL);
1677 if (reg->hr_tmp_block == NULL)
1680 reg->hr_slots = kcalloc(reg->hr_blocks,
1682 if (reg->hr_slots == NULL)
1685 for(i = 0; i < reg->hr_blocks; i++) {
1686 slot = ®->hr_slots[i];
1692 reg->hr_num_pages = (reg->hr_blocks + spp - 1) / spp;
1695 reg->hr_num_pages, reg->hr_blocks, spp);
1697 reg->hr_slot_data = kcalloc(reg->hr_num_pages, sizeof(struct page *),
1699 if (!reg->hr_slot_data)
1702 for(i = 0; i < reg->hr_num_pages; i++) {
1707 reg->hr_slot_data[i] = page;
1712 (j < spp) && ((j + last_slot) < reg->hr_blocks);
1714 BUG_ON((j + last_slot) >= reg->hr_blocks);
1716 slot = ®->hr_slots[j + last_slot];
1720 raw += reg->hr_block_bytes;
1730 static int o2hb_populate_slot_data(struct o2hb_region *reg)
1736 ret = o2hb_read_slots(reg, 0, reg->hr_blocks);
1744 for(i = 0; i < reg->hr_blocks; i++) {
1745 slot = ®->hr_slots[i];
1763 struct o2hb_region *reg = to_o2hb_region(item);
1772 if (reg->hr_bdev)
1791 if (reg->hr_blocks == 0 || reg->hr_start_block == 0 ||
1792 reg->hr_block_bytes == 0)
1798 reg->hr_bdev = blkdev_get_by_dev(f.file->f_mapping->host->i_rdev,
1800 if (IS_ERR(reg->hr_bdev)) {
1801 ret = PTR_ERR(reg->hr_bdev);
1802 reg->hr_bdev = NULL;
1806 bdevname(reg->hr_bdev, reg->hr_dev_name);
1808 sectsize = bdev_logical_block_size(reg->hr_bdev);
1809 if (sectsize != reg->hr_block_bytes) {
1812 reg->hr_block_bytes, sectsize);
1817 o2hb_init_region_params(reg);
1821 get_random_bytes(®->hr_generation,
1822 sizeof(reg->hr_generation));
1823 } while (reg->hr_generation == 0);
1825 ret = o2hb_map_slot_data(reg);
1831 ret = o2hb_populate_slot_data(reg);
1837 INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout);
1838 INIT_DELAYED_WORK(®->hr_nego_timeout_work, o2hb_nego_timeout);
1856 atomic_set(®->hr_steady_iterations, live_threshold);
1858 atomic_set(®->hr_unsteady_iterations, (live_threshold * 3));
1860 hb_task = kthread_run(o2hb_thread, reg, "o2hb-%s",
1861 reg->hr_item.ci_name);
1869 reg->hr_task = hb_task;
1873 atomic_read(®->hr_steady_iterations) == 0 ||
1874 reg->hr_node_deleted);
1876 atomic_set(®->hr_steady_iterations, 0);
1877 reg->hr_aborted_start = 1;
1880 if (reg->hr_aborted_start) {
1885 if (reg->hr_node_deleted) {
1892 hb_task = reg->hr_task;
1894 set_bit(reg->hr_region_num, o2hb_live_region_bitmap);
1904 config_item_name(®->hr_item), reg->hr_dev_name);
1908 blkdev_put(reg->hr_bdev, FMODE_READ | FMODE_WRITE);
1909 reg->hr_bdev = NULL;
1919 struct o2hb_region *reg = to_o2hb_region(item);
1923 if (reg->hr_task)
1924 pid = task_pid_nr(reg->hr_task);
1972 static void o2hb_debug_region_init(struct o2hb_region *reg,
1977 dir = debugfs_create_dir(config_item_name(®->hr_item), parent);
1978 reg->hr_debug_dir = dir;
1980 o2hb_debug_create(O2HB_DEBUG_LIVENODES, dir, &(reg->hr_db_livenodes),
1981 sizeof(*(reg->hr_db_livenodes)),
1983 sizeof(reg->hr_live_node_bitmap), O2NM_MAX_NODES,
1984 reg);
1986 o2hb_debug_create(O2HB_DEBUG_REGION_NUMBER, dir, &(reg->hr_db_regnum),
1987 sizeof(*(reg->hr_db_regnum)),
1988 O2HB_DB_TYPE_REGION_NUMBER, 0, O2NM_MAX_NODES, reg);
1991 &(reg->hr_db_elapsed_time),
1992 sizeof(*(reg->hr_db_elapsed_time)),
1993 O2HB_DB_TYPE_REGION_ELAPSED_TIME, 0, 0, reg);
1995 o2hb_debug_create(O2HB_DEBUG_REGION_PINNED, dir, &(reg->hr_db_pinned),
1996 sizeof(*(reg->hr_db_pinned)),
1997 O2HB_DB_TYPE_REGION_PINNED, 0, 0, reg);
2004 struct o2hb_region *reg = NULL;
2007 reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL);
2008 if (reg == NULL)
2017 reg->hr_region_num = 0;
2019 reg->hr_region_num = find_first_zero_bit(o2hb_region_bitmap,
2021 if (reg->hr_region_num >= O2NM_MAX_REGIONS) {
2026 set_bit(reg->hr_region_num, o2hb_region_bitmap);
2028 list_add_tail(®->hr_all_item, &o2hb_all_regions);
2031 config_item_init_type_name(®->hr_item, name, &o2hb_region_type);
2037 reg->hr_key = crc32_le(reg->hr_region_num + O2NM_MAX_REGIONS,
2039 INIT_LIST_HEAD(®->hr_handler_list);
2040 ret = o2net_register_handler(O2HB_NEGO_TIMEOUT_MSG, reg->hr_key,
2043 reg, NULL, ®->hr_handler_list);
2047 ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key,
2050 reg, NULL, ®->hr_handler_list);
2054 o2hb_debug_region_init(reg, o2hb_debug_dir);
2056 return ®->hr_item;
2059 o2net_unregister_handler_list(®->hr_handler_list);
2062 list_del(®->hr_all_item);
2064 clear_bit(reg->hr_region_num, o2hb_region_bitmap);
2067 kfree(reg);
2075 struct o2hb_region *reg = to_o2hb_region(item);
2080 hb_task = reg->hr_task;
2081 reg->hr_task = NULL;
2082 reg->hr_item_dropped = 1;
2090 clear_bit(reg->hr_region_num, o2hb_region_bitmap);
2091 clear_bit(reg->hr_region_num, o2hb_live_region_bitmap);
2092 if (test_bit(reg->hr_region_num, o2hb_quorum_region_bitmap))
2094 clear_bit(reg->hr_region_num, o2hb_quorum_region_bitmap);
2097 ((atomic_read(®->hr_steady_iterations) == 0) ?
2099 reg->hr_dev_name);
2104 * check reg->hr_task
2106 if (atomic_read(®->hr_steady_iterations) != 0) {
2107 reg->hr_aborted_start = 1;
2108 atomic_set(®->hr_steady_iterations, 0);
2271 struct o2hb_region *reg;
2276 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2277 if (reg->hr_item_dropped)
2280 uuid = config_item_name(®->hr_item);
2289 if (reg->hr_item_pinned || reg->hr_item_dropped)
2293 ret = o2nm_depend_item(®->hr_item);
2296 reg->hr_item_pinned = 1;
2323 struct o2hb_region *reg;
2329 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2330 if (reg->hr_item_dropped)
2333 uuid = config_item_name(®->hr_item);
2340 if (reg->hr_item_pinned) {
2342 o2nm_undepend_item(®->hr_item);
2343 reg->hr_item_pinned = 0;
2508 struct o2hb_region *reg;
2514 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item)
2515 reg->hr_unclean_stop = 1;
2523 struct o2hb_region *reg;
2530 list_for_each_entry(reg, &o2hb_all_regions, hr_all_item) {
2531 if (reg->hr_item_dropped)
2534 mlog(0, "Region: %s\n", config_item_name(®->hr_item));
2536 memcpy(p, config_item_name(®->hr_item),