Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  misc.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef BTRFS_MISC_H
#define BTRFS_MISC_H

#include <linux/types.h>
#include <linux/bitmap.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/mm.h>
#include <linux/pagemap.h>
#include <linux/math64.h>
#include <linux/rbtree.h>

/*
 * Enumerate bits using enum autoincrement. Define the @name as the n-th bit.
 */

#define ENUM_BIT(name)                                  \
 __ ## name ## _BIT,                             \
 name = (1U << __ ## name ## _BIT),              \
 __ ## name ## _SEQ = __ ## name ## _BIT

static inline void cond_wake_up(struct wait_queue_head *wq)
{
 /*
 * This implies a full smp_mb barrier, see comments for
 * waitqueue_active why.
 */

 if (wq_has_sleeper(wq))
  wake_up(wq);
}

static inline void cond_wake_up_nomb(struct wait_queue_head *wq)
{
 /*
 * Special case for conditional wakeup where the barrier required for
 * waitqueue_active is implied by some of the preceding code. Eg. one
 * of such atomic operations (atomic_dec_and_return, ...), or a
 * unlock/lock sequence, etc.
 */

 if (waitqueue_active(wq))
  wake_up(wq);
}

static inline u64 mult_perc(u64 num, u32 percent)
{
 return div_u64(num * percent, 100);
}
/* Copy of is_power_of_two that is 64bit safe */
static inline bool is_power_of_two_u64(u64 n)
{
 return n != 0 && (n & (n - 1)) == 0;
}

static inline bool has_single_bit_set(u64 n)
{
 return is_power_of_two_u64(n);
}

/*
 * Simple bytenr based rb_tree relate structures
 *
 * Any structure wants to use bytenr as single search index should have their
 * structure start with these members.
 */

struct rb_simple_node {
 struct rb_node rb_node;
 u64 bytenr;
};

static inline struct rb_node *rb_simple_search(const struct rb_root *root, u64 bytenr)
{
 struct rb_node *node = root->rb_node;
 struct rb_simple_node *entry;

 while (node) {
  entry = rb_entry(node, struct rb_simple_node, rb_node);

  if (bytenr < entry->bytenr)
   node = node->rb_left;
  else if (bytenr > entry->bytenr)
   node = node->rb_right;
  else
   return node;
 }
 return NULL;
}

/*
 * Search @root from an entry that starts or comes after @bytenr.
 *
 * @root: the root to search.
 * @bytenr: bytenr to search from.
 *
 * Return the rb_node that start at or after @bytenr.  If there is no entry at
 * or after @bytner return NULL.
 */

static inline struct rb_node *rb_simple_search_first(const struct rb_root *root,
           u64 bytenr)
{
 struct rb_node *node = root->rb_node, *ret = NULL;
 struct rb_simple_node *entry, *ret_entry = NULL;

 while (node) {
  entry = rb_entry(node, struct rb_simple_node, rb_node);

  if (bytenr < entry->bytenr) {
   if (!ret || entry->bytenr < ret_entry->bytenr) {
    ret = node;
    ret_entry = entry;
   }

   node = node->rb_left;
  } else if (bytenr > entry->bytenr) {
   node = node->rb_right;
  } else {
   return node;
  }
 }

 return ret;
}

static int rb_simple_node_bytenr_cmp(struct rb_node *newconst struct rb_node *existing)
{
 struct rb_simple_node *new_entry = rb_entry(newstruct rb_simple_node, rb_node);
 struct rb_simple_node *existing_entry = rb_entry(existing, struct rb_simple_node, rb_node);

 if (new_entry->bytenr < existing_entry->bytenr)
  return -1;
 else if (new_entry->bytenr > existing_entry->bytenr)
  return 1;

 return 0;
}

static inline struct rb_node *rb_simple_insert(struct rb_root *root,
            struct rb_simple_node *simple_node)
{
 return rb_find_add(&simple_node->rb_node, root, rb_simple_node_bytenr_cmp);
}

static inline bool bitmap_test_range_all_set(const unsigned long *addr,
          unsigned long start,
          unsigned long nbits)
{
 unsigned long found_zero;

 found_zero = find_next_zero_bit(addr, start + nbits, start);
 return (found_zero == start + nbits);
}

static inline bool bitmap_test_range_all_zero(const unsigned long *addr,
           unsigned long start,
           unsigned long nbits)
{
 unsigned long found_set;

 found_set = find_next_bit(addr, start + nbits, start);
 return (found_set == start + nbits);
}

static inline u64 folio_end(struct folio *folio)
{
 return folio_pos(folio) + folio_size(folio);
}

#endif

Messung V0.5
C=96 H=90 G=93

¤ Dauer der Verarbeitung: 0.21 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge