linux/fs/ocfs2/heartbeat.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* -*- mode: c; c-basic-offset: 8; -*-
   3 * vim: noexpandtab sw=8 ts=8 sts=0:
   4 *
   5 * heartbeat.c
   6 *
   7 * Register ourselves with the heartbaet service, keep our node maps
   8 * up to date, and fire off recovery when needed.
   9 *
  10 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
  11 */
  12
  13#include <linux/fs.h>
  14#include <linux/types.h>
  15#include <linux/highmem.h>
  16
  17#include <cluster/masklog.h>
  18
  19#include "ocfs2.h"
  20
  21#include "alloc.h"
  22#include "heartbeat.h"
  23#include "inode.h"
  24#include "journal.h"
  25#include "ocfs2_trace.h"
  26
  27#include "buffer_head_io.h"
  28
  29static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map,
  30                                            int bit);
  31static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map,
  32                                              int bit);
  33
  34/* special case -1 for now
  35 * TODO: should *really* make sure the calling func never passes -1!!  */
  36static void ocfs2_node_map_init(struct ocfs2_node_map *map)
  37{
  38        map->num_nodes = OCFS2_NODE_MAP_MAX_NODES;
  39        memset(map->map, 0, BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES) *
  40               sizeof(unsigned long));
  41}
  42
  43void ocfs2_init_node_maps(struct ocfs2_super *osb)
  44{
  45        spin_lock_init(&osb->node_map_lock);
  46        ocfs2_node_map_init(&osb->osb_recovering_orphan_dirs);
  47}
  48
  49void ocfs2_do_node_down(int node_num, void *data)
  50{
  51        struct ocfs2_super *osb = data;
  52
  53        BUG_ON(osb->node_num == node_num);
  54
  55        trace_ocfs2_do_node_down(node_num);
  56
  57        if (!osb->cconn) {
  58                /*
  59                 * No cluster connection means we're not even ready to
  60                 * participate yet.  We check the slots after the cluster
  61                 * comes up, so we will notice the node death then.  We
  62                 * can safely ignore it here.
  63                 */
  64                return;
  65        }
  66
  67        ocfs2_recovery_thread(osb, node_num);
  68}
  69
  70static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map,
  71                                            int bit)
  72{
  73        set_bit(bit, map->map);
  74}
  75
  76void ocfs2_node_map_set_bit(struct ocfs2_super *osb,
  77                            struct ocfs2_node_map *map,
  78                            int bit)
  79{
  80        if (bit==-1)
  81                return;
  82        BUG_ON(bit >= map->num_nodes);
  83        spin_lock(&osb->node_map_lock);
  84        __ocfs2_node_map_set_bit(map, bit);
  85        spin_unlock(&osb->node_map_lock);
  86}
  87
  88static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map,
  89                                              int bit)
  90{
  91        clear_bit(bit, map->map);
  92}
  93
  94void ocfs2_node_map_clear_bit(struct ocfs2_super *osb,
  95                              struct ocfs2_node_map *map,
  96                              int bit)
  97{
  98        if (bit==-1)
  99                return;
 100        BUG_ON(bit >= map->num_nodes);
 101        spin_lock(&osb->node_map_lock);
 102        __ocfs2_node_map_clear_bit(map, bit);
 103        spin_unlock(&osb->node_map_lock);
 104}
 105
 106int ocfs2_node_map_test_bit(struct ocfs2_super *osb,
 107                            struct ocfs2_node_map *map,
 108                            int bit)
 109{
 110        int ret;
 111        if (bit >= map->num_nodes) {
 112                mlog(ML_ERROR, "bit=%d map->num_nodes=%d\n", bit, map->num_nodes);
 113                BUG();
 114        }
 115        spin_lock(&osb->node_map_lock);
 116        ret = test_bit(bit, map->map);
 117        spin_unlock(&osb->node_map_lock);
 118        return ret;
 119}
 120
 121