]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/util.h
Update bcachefs sources to e99d29e402 bcachefs: zstd support, compression refactoring
[bcachefs-tools-debian] / libbcachefs / util.h
index 99ad359fd48845b727aa510f9fd47c705de51af3..d475f986ad30b4584a9f117d5a05e0b4592b0d82 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _BCACHE_UTIL_H
-#define _BCACHE_UTIL_H
+#ifndef _BCACHEFS_UTIL_H
+#define _BCACHEFS_UTIL_H
 
 #include <linux/bio.h>
 #include <linux/blkdev.h>
@@ -34,8 +34,12 @@ struct closure;
 #define atomic64_sub_bug(i, v) BUG_ON(atomic64_sub_return(i, v) < 0)
 #define atomic64_add_bug(i, v) BUG_ON(atomic64_add_return(i, v) < 0)
 
-#define memcpy(_dst, _src, _len)                                       \
+#define memcpy(dst, src, len)                                          \
 ({                                                                     \
+       void *_dst = (dst);                                             \
+       const void *_src = (src);                                       \
+       size_t _len = (len);                                            \
+                                                                       \
        BUG_ON(!((void *) (_dst) >= (void *) (_src) + (_len) ||         \
                 (void *) (_dst) + (_len) <= (void *) (_src)));         \
        memcpy(_dst, _src, _len);                                       \
@@ -356,10 +360,12 @@ ssize_t bch2_hprint(char *buf, s64 v);
 
 bool bch2_is_zero(const void *, size_t);
 
-ssize_t bch2_snprint_string_list(char *buf, size_t size, const char * const list[],
-                           size_t selected);
+ssize_t bch2_scnprint_string_list(char *, size_t, const char * const[], size_t);
+
+ssize_t bch2_read_string_list(const char *, const char * const[]);
 
-ssize_t bch2_read_string_list(const char *buf, const char * const list[]);
+ssize_t bch2_scnprint_flag_list(char *, size_t, const char * const[], u64);
+u64 bch2_read_flag_list(char *, const char * const[]);
 
 struct time_stats {
        spinlock_t      lock;
@@ -787,4 +793,43 @@ void sort_cmp_size(void *base, size_t num, size_t size,
          int (*cmp_func)(const void *, const void *, size_t),
          void (*swap_func)(void *, void *, size_t));
 
-#endif /* _BCACHE_UTIL_H */
+/* just the memmove, doesn't update @_nr */
+#define __array_insert_item(_array, _nr, _pos)                         \
+       memmove(&(_array)[(_pos) + 1],                                  \
+               &(_array)[(_pos)],                                      \
+               sizeof((_array)[0]) * ((_nr) - (_pos)))
+
+#define array_insert_item(_array, _nr, _pos, _new_item)                        \
+do {                                                                   \
+       __array_insert_item(_array, _nr, _pos);                         \
+       (_nr)++;                                                        \
+       (_array)[(_pos)] = (_new_item);                                 \
+} while (0)
+
+#define array_remove_items(_array, _nr, _pos, _nr_to_remove)           \
+do {                                                                   \
+       (_nr) -= (_nr_to_remove);                                       \
+       memmove(&(_array)[(_pos)],                                      \
+               &(_array)[(_pos) + (_nr_to_remove)],                    \
+               sizeof((_array)[0]) * ((_nr) - (_pos)));                \
+} while (0)
+
+#define array_remove_item(_array, _nr, _pos)                           \
+       array_remove_items(_array, _nr, _pos, 1)
+
+#define bubble_sort(_base, _nr, _cmp)                                  \
+do {                                                                   \
+       ssize_t _i, _end;                                               \
+       bool _swapped = true;                                           \
+                                                                       \
+       for (_end = (ssize_t) (_nr) - 1; _end > 0 && _swapped; --_end) {\
+               _swapped = false;                                       \
+               for (_i = 0; _i < _end; _i++)                           \
+                       if (_cmp((_base)[_i], (_base)[_i + 1]) > 0) {   \
+                               swap((_base)[_i], (_base)[_i + 1]);     \
+                               _swapped = true;                        \
+                       }                                               \
+       }                                                               \
+} while (0)
+
+#endif /* _BCACHEFS_UTIL_H */