> > On Fri, Oct 23, 2020 at 09:47:59AM +0200, Laurent Cremmer wrote: > > The third instance spotted by manual examination. > > It is friday, I might be overlooking something obvious, so bear with me. > > > In static long region_add(...) and static long region_cgh(...) , releasing > > the acquired lock when exiting via their error path was removed. > > This will cause these functions to return with a lock held if they do not > > succeed. > > If they do not suceed, it means that allocate_file_region_entries returned > non-zero, which means that we hit: > > spin_unlock(&resv->lock); > for (i = 0; i < to_allocate; i++) { > trg = kmalloc(sizeof(*trg), GFP_KERNEL); > if (!trg) > goto out_of_memory; > list_add(&trg->link, &allocated_regions); > } > > So, we do spin_unlock before jumping to out_of_memory. > > > A a new function allocate_file_region_entries was also introduced that > > must be called with a lock held and returned with the lock held. > > However the lock is temporarily released during processing but will not > > be reacquired on error. > > As stated above, region_add/region_chr exit immediately on allocate_file_region_entries > failure, so it does not need to acquire the lock. > I came to the same conclusion with the help of David's remarks :-) . And in the end, this patch would be more about fixing the readability of the code than fixing a live problem per-se. If it ain't broken, don't fix it as they say :-) It is friday, so thanks for taking the time to look into this. > > -- > Oscar Salvador > SUSE L3