Re: [PATCH 10/29] drivers, md: convert stripe_head.count from atomic_t to refcount_t

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 08, 2017 at 09:39:30AM +0000, Reshetova, Elena wrote:
> > On Mon, Mar 06, 2017 at 04:20:57PM +0200, Elena Reshetova wrote:
> > > 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@xxxxxxxxx>
> > > Signed-off-by: Hans Liljestrand <ishkamiel@xxxxxxxxx>
> > > Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx>
> > > Signed-off-by: David Windsor <dwindsor@xxxxxxxxx>
> > > ---
> > >  drivers/md/raid5-cache.c |  8 +++---
> > >  drivers/md/raid5.c       | 66 ++++++++++++++++++++++++------------------------
> > >  drivers/md/raid5.h       |  3 ++-
> > >  3 files changed, 39 insertions(+), 38 deletions(-)
> > >
> > > diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
> > > index 3f307be..6c05e12 100644
> > > --- a/drivers/md/raid5-cache.c
> > > +++ b/drivers/md/raid5-cache.c
> > 
> > snip
> > >  	       sh->check_state, sh->reconstruct_state);
> > >
> > >  	analyse_stripe(sh, &s);
> > > @@ -4924,7 +4924,7 @@ static void activate_bit_delay(struct r5conf *conf,
> > >  		struct stripe_head *sh = list_entry(head.next, struct
> > stripe_head, lru);
> > >  		int hash;
> > >  		list_del_init(&sh->lru);
> > > -		atomic_inc(&sh->count);
> > > +		refcount_inc(&sh->count);
> > >  		hash = sh->hash_lock_index;
> > >  		__release_stripe(conf, sh,
> > &temp_inactive_list[hash]);
> > >  	}
> > > @@ -5240,7 +5240,7 @@ static struct stripe_head *__get_priority_stripe(struct
> > r5conf *conf, int group)
> > >  		sh->group = NULL;
> > >  	}
> > >  	list_del_init(&sh->lru);
> > > -	BUG_ON(atomic_inc_return(&sh->count) != 1);
> > > +	BUG_ON(refcount_inc_not_zero(&sh->count));
> > 
> > This changes the behavior. refcount_inc_not_zero doesn't inc if original value is 0
> 
> Hm.. So, you want to inc here in any case and BUG if the end result differs from 1. 
> So essentially you want to only increment here from zero to one under normal conditions... This is a challenge for refcount_t and against the design.
> Is it ok just to maybe do this here:
> 
> -	BUG_ON(atomic_inc_return(&sh->count) != 1);
> +	BUG_ON(refcount_read(&sh->count) != 0);
> +	refcount_set((&sh->count, 1);

this looks ok


> Do we have an issue with locking in this case? Or maybe it is then better to leave this one to be atomic_t without protection since it isn't a real refcounter as it turns out. 

There is no lock issue, the count should be 0 in the list. It's a refcounter actually, so good to do the convert.

Thanks,
Shaohua
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux