mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
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:
parent
186debd6ed
commit
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;
|
||||
|
Loading…
Reference in New Issue
Block a user