Messages in this thread | | | Date | Thu, 23 Dec 2010 18:04:11 +0100 | From | Jerome Marchand <> | Subject | Re: [PATCH] block: fix accounting bug on cross partition merges |
| |
On 12/23/2010 04:39 PM, Vivek Goyal wrote: >> diff --git a/block/blk-core.c b/block/blk-core.c >> index 4ce953f..72d12d2 100644 >> --- a/block/blk-core.c >> +++ b/block/blk-core.c >> @@ -64,13 +64,21 @@ static void drive_stat_acct(struct request *rq, int new_io) >> return; >> >> cpu = part_stat_lock(); >> - part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq)); >> >> - if (!new_io) >> + if (!new_io) { >> + part = rq->part; >> part_stat_inc(cpu, part, merges[rw]); >> - else { >> + } else { >> + part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq)); >> + if(part->partno && !kref_test_and_get(&part->ref)) >> + /* > > Do we have to check this part->partno both while taking and releasing > reference. Can't we take one extra reference for disk->part0, at > alloc_disk_node() time so that it is never freed and only freed when > disk is going away and gendisk is being freed. > > That way, you don't have to differentiate between disk->part0 and rest > of the partitions while taking or dropping references.
We could do it in any way, as long as we don't end up trying to free disk->part0. I choose not to touch part0->ref at all, but we could also drop all the part->partno test, and get a reference on part0 when we use it as a backup. I have no strong opinion about a way or an other.
Jerome
> > Thanks > Vivek
| |