block: fix bug in ptbl lookup cache
authorNeil Brown <neilb@suse.de>
Wed, 7 Jan 2009 07:55:39 +0000 (08:55 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Fri, 9 Jan 2009 20:46:13 +0000 (21:46 +0100)
Neil writes:

   Hi Jens,

    I've found a little bug for you.  It was introduced by
        a6f23657d3072bde6844055bbc2290e497f33fbc

        block: add one-hit cache for disk partition lookup

    and has the effect of killing my machine whenever I try to assemble
    an md array :-(
    One of the devices in the array has partitions, and mdadm always
    deletes partitions before putting a whole-device in an array (as it
    can cause confusion).  The next IO to that device locks the machine.
    I don't really understand exactly why it locks up, but it happens in
    disk_map_sector_rcu().  This patch fixes it.

Which is due to a missing clear of the (now) stale partition lookup
data. So clear that when we delete a partition.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/partitions/check.c

index 5198ada67398f83019066002a733fdc54a5b8f90..6d720243f5f4a29a43a7b50dd005bbff32a7b0aa 100644 (file)
@@ -334,6 +334,7 @@ void delete_partition(struct gendisk *disk, int partno)
 
        blk_free_devt(part_devt(part));
        rcu_assign_pointer(ptbl->part[partno], NULL);
+       rcu_assign_pointer(ptbl->last_lookup, NULL);
        kobject_put(part->holder_dir);
        device_del(part_to_dev(part));