diff options
Diffstat (limited to 'fs/bcachefs/darray.h')
-rw-r--r-- | fs/bcachefs/darray.h | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/fs/bcachefs/darray.h b/fs/bcachefs/darray.h index 4080ee99aadd..b4f284fe9652 100644 --- a/fs/bcachefs/darray.h +++ b/fs/bcachefs/darray.h @@ -34,17 +34,17 @@ typedef DARRAY(s16) darray_s16; typedef DARRAY(s32) darray_s32; typedef DARRAY(s64) darray_s64; -int __bch2_darray_resize_noprof(darray_char *, size_t, size_t, gfp_t); +int __bch2_darray_resize_noprof(darray_char *, size_t, size_t, gfp_t, bool); #define __bch2_darray_resize(...) alloc_hooks(__bch2_darray_resize_noprof(__VA_ARGS__)) -#define __darray_resize(_d, _element_size, _new_size, _gfp) \ +#define __darray_resize(_d, _element_size, _new_size, _gfp, _rcu) \ (unlikely((_new_size) > (_d)->size) \ - ? __bch2_darray_resize((_d), (_element_size), (_new_size), (_gfp))\ + ? __bch2_darray_resize((_d), (_element_size), (_new_size), (_gfp), _rcu)\ : 0) #define darray_resize_gfp(_d, _new_size, _gfp) \ - __darray_resize((darray_char *) (_d), sizeof((_d)->data[0]), (_new_size), _gfp) + __darray_resize((darray_char *) (_d), sizeof((_d)->data[0]), (_new_size), _gfp, false) #define darray_resize(_d, _new_size) \ darray_resize_gfp(_d, _new_size, GFP_KERNEL) @@ -55,6 +55,12 @@ int __bch2_darray_resize_noprof(darray_char *, size_t, size_t, gfp_t); #define darray_make_room(_d, _more) \ darray_make_room_gfp(_d, _more, GFP_KERNEL) +#define darray_resize_rcu(_d, _new_size) \ + __darray_resize((darray_char *) (_d), sizeof((_d)->data[0]), (_new_size), GFP_KERNEL, true) + +#define darray_make_room_rcu(_d, _more) \ + darray_resize_rcu((_d), (_d)->nr + (_more)) + #define darray_room(_d) ((_d).size - (_d).nr) #define darray_top(_d) ((_d).data[(_d).nr]) @@ -107,8 +113,11 @@ int __bch2_darray_resize_noprof(darray_char *, size_t, size_t, gfp_t); #define __darray_for_each(_d, _i) \ for ((_i) = (_d).data; _i < (_d).data + (_d).nr; _i++) +#define darray_for_each_from(_d, _i, _start) \ + for (typeof(&(_d).data[0]) _i = _start; _i < (_d).data + (_d).nr; _i++) + #define darray_for_each(_d, _i) \ - for (typeof(&(_d).data[0]) _i = (_d).data; _i < (_d).data + (_d).nr; _i++) + darray_for_each_from(_d, _i, (_d).data) #define darray_for_each_reverse(_d, _i) \ for (typeof(&(_d).data[0]) _i = (_d).data + (_d).nr - 1; _i >= (_d).data && (_d).nr; --_i) |