Messages in this thread |  | | | Date | Wed, 05 Jan 2011 15:09:23 +0100 | | From | Jerome Marchand <> | | Subject | Re: [PATCH 2/2] block: fix accounting bug on cross partition merges |
| |
On 01/05/2011 03:00 PM, Jens Axboe wrote: > On 2011-01-04 16:55, Jerome Marchand wrote: >> + } else { >> + part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq)); >> + if (!kref_test_and_get(&part->ref)) { >> + /* >> + * The partition is already being removed, >> + * the request will be accounted on the disk only >> + * >> + * We take a reference on disk->part0 although that >> + * partition will never be deleted, so we can treat >> + * it as any other partition. >> + */ >> + part = &rq->rq_disk->part0; >> + kref_get(&part->ref); >> + } > > This still doesn't work. So you are inside the if {} block, you know > what someone has dropped the last reference and the call_rcu() is being > scheduled. Adding a reference now will not prevent 'part' from going > away as soon as you do part_stat_unlock().
And what is the problem with that since we don't use 'part' (as returned by disk_map_sector_rcu()), but disk->part0 instead?
> As per my last email, you > need a check in the rcu callback to ensure that the ref is 0. > >
|  |