diff options
author | Neil Brown <neilb@suse.de> | 2009-01-07 02:55:39 -0500 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-01-09 15:46:13 -0500 |
commit | 54b0d127696aba2ef1ec5430301c968ab539fa0d (patch) | |
tree | be6d3ddccce6a17a053ea6e286bf2822bc6ee912 /fs/partitions | |
parent | 2150edc6c5cf00f7adb54538b9ea2a3e9cedca3f (diff) |
block: fix bug in ptbl lookup cache
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>
Diffstat (limited to 'fs/partitions')
-rw-r--r-- | fs/partitions/check.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 5198ada67398..6d720243f5f4 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -334,6 +334,7 @@ void delete_partition(struct gendisk *disk, int partno) | |||
334 | 334 | ||
335 | blk_free_devt(part_devt(part)); | 335 | blk_free_devt(part_devt(part)); |
336 | rcu_assign_pointer(ptbl->part[partno], NULL); | 336 | rcu_assign_pointer(ptbl->part[partno], NULL); |
337 | rcu_assign_pointer(ptbl->last_lookup, NULL); | ||
337 | kobject_put(part->holder_dir); | 338 | kobject_put(part->holder_dir); |
338 | device_del(part_to_dev(part)); | 339 | device_del(part_to_dev(part)); |
339 | 340 | ||