btrfs: convert scrub_parity.refs from atomic_t to refcount_t
refcount_t type and corresponding API should be used instead of atomic_t when the variable is used as a reference counter. This allows to avoid accidental refcounter overflows that might lead to use-after-free situations. Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> Signed-off-by: Hans Liljestrand <ishkamiel@gmail.com> Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: David Windsor <dwindsor@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Родитель
186debd6ed
Коммит
78a764504d
|
@ -142,7 +142,7 @@ struct scrub_parity {
|
|||
|
||||
int stripe_len;
|
||||
|
||||
atomic_t refs;
|
||||
refcount_t refs;
|
||||
|
||||
struct list_head spages;
|
||||
|
||||
|
@ -2822,12 +2822,12 @@ static inline int scrub_calc_parity_bitmap_len(int nsectors)
|
|||
|
||||
static void scrub_parity_get(struct scrub_parity *sparity)
|
||||
{
|
||||
atomic_inc(&sparity->refs);
|
||||
refcount_inc(&sparity->refs);
|
||||
}
|
||||
|
||||
static void scrub_parity_put(struct scrub_parity *sparity)
|
||||
{
|
||||
if (!atomic_dec_and_test(&sparity->refs))
|
||||
if (!refcount_dec_and_test(&sparity->refs))
|
||||
return;
|
||||
|
||||
scrub_parity_check_and_repair(sparity);
|
||||
|
@ -2879,7 +2879,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
|
|||
sparity->scrub_dev = sdev;
|
||||
sparity->logic_start = logic_start;
|
||||
sparity->logic_end = logic_end;
|
||||
atomic_set(&sparity->refs, 1);
|
||||
refcount_set(&sparity->refs, 1);
|
||||
INIT_LIST_HEAD(&sparity->spages);
|
||||
sparity->dbitmap = sparity->bitmap;
|
||||
sparity->ebitmap = (void *)sparity->bitmap + bitmap_len;
|
||||
|
|
Загрузка…
Ссылка в новой задаче