linux/fs/btrfs/misc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3#ifndef BTRFS_MISC_H
   4#define BTRFS_MISC_H
   5
   6#include <linux/sched.h>
   7#include <linux/wait.h>
   8#include <asm/div64.h>
   9#include <linux/rbtree.h>
  10
  11#define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len))
  12
  13static inline void cond_wake_up(struct wait_queue_head *wq)
  14{
  15        /*
  16         * This implies a full smp_mb barrier, see comments for
  17         * waitqueue_active why.
  18         */
  19        if (wq_has_sleeper(wq))
  20                wake_up(wq);
  21}
  22
  23static inline void cond_wake_up_nomb(struct wait_queue_head *wq)
  24{
  25        /*
  26         * Special case for conditional wakeup where the barrier required for
  27         * waitqueue_active is implied by some of the preceding code. Eg. one
  28         * of such atomic operations (atomic_dec_and_return, ...), or a
  29         * unlock/lock sequence, etc.
  30         */
  31        if (waitqueue_active(wq))
  32                wake_up(wq);
  33}
  34
  35static inline u64 div_factor(u64 num, int factor)
  36{
  37        if (factor == 10)
  38                return num;
  39        num *= factor;
  40        return div_u64(num, 10);
  41}
  42
  43static inline u64 div_factor_fine(u64 num, int factor)
  44{
  45        if (factor == 100)
  46                return num;
  47        num *= factor;
  48        return div_u64(num, 100);
  49}
  50
  51/* Copy of is_power_of_two that is 64bit safe */
  52static inline bool is_power_of_two_u64(u64 n)
  53{
  54        return n != 0 && (n & (n - 1)) == 0;
  55}
  56
  57static inline bool has_single_bit_set(u64 n)
  58{
  59        return is_power_of_two_u64(n);
  60}
  61
  62/*
  63 * Simple bytenr based rb_tree relate structures
  64 *
  65 * Any structure wants to use bytenr as single search index should have their
  66 * structure start with these members.
  67 */
  68struct rb_simple_node {
  69        struct rb_node rb_node;
  70        u64 bytenr;
  71};
  72
  73static inline struct rb_node *rb_simple_search(struct rb_root *root, u64 bytenr)
  74{
  75        struct rb_node *node = root->rb_node;
  76        struct rb_simple_node *entry;
  77
  78        while (node) {
  79                entry = rb_entry(node, struct rb_simple_node, rb_node);
  80
  81                if (bytenr < entry->bytenr)
  82                        node = node->rb_left;
  83                else if (bytenr > entry->bytenr)
  84                        node = node->rb_right;
  85                else
  86                        return node;
  87        }
  88        return NULL;
  89}
  90
  91static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr,
  92                                               struct rb_node *node)
  93{
  94        struct rb_node **p = &root->rb_node;
  95        struct rb_node *parent = NULL;
  96        struct rb_simple_node *entry;
  97
  98        while (*p) {
  99                parent = *p;
 100                entry = rb_entry(parent, struct rb_simple_node, rb_node);
 101
 102                if (bytenr < entry->bytenr)
 103                        p = &(*p)->rb_left;
 104                else if (bytenr > entry->bytenr)
 105                        p = &(*p)->rb_right;
 106                else
 107                        return parent;
 108        }
 109
 110        rb_link_node(node, parent, p);
 111        rb_insert_color(node, root);
 112        return NULL;
 113}
 114
 115#endif
 116