Commit d5791d13 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Fix invalid access errors in blk_lookup_devt

Commit 30f2f0eb ("block: do_mounts -
accept root=<non-existant partition>") extended blk_lookup_devt() to be
able to look up partitions that had not yet been registered, but in the
process made the assumption that the '&block_class.devices' list only
contains disk devices and that you can do 'dev_to_disk(dev)' on them.

That isn't actually true.  The block_class device list also contains the
partitions we've discovered so far, and you can't just do a
'dev_to_disk()' on those.

So make sure to only work on devices that block/genhd.c has registered
itself, something we can test by checking the 'dev->type' member.  This
makes the loop in blk_lookup_devt() match the other such loops in this

[ We may want to do an alternate version that knows to handle _either_
  whole-disk devices or partitions, but for now this is the minimal fix
  for a series of crashes reported by Mariusz Kozlowski in

  and Ingo in

Reported-by: default avatarMariusz Kozlowski <>
Reported-by: default avatarIngo Molnar <>
Cc: Neil Brown <>
Cc: Joao Luis Meloni Assirati <>
Acked-by: default avatarKay Sievers <>
Cc: Greg Kroah-Hartman <>
Signed-off-by: default avatarLinus Torvalds <>
parent f751aa12
...@@ -660,6 +660,8 @@ dev_t blk_lookup_devt(const char *name, int part) ...@@ -660,6 +660,8 @@ dev_t blk_lookup_devt(const char *name, int part)
mutex_lock(&block_class_lock); mutex_lock(&block_class_lock);
list_for_each_entry(dev, &block_class.devices, node) { list_for_each_entry(dev, &block_class.devices, node) {
if (dev->type != &disk_type)
if (strcmp(dev->bus_id, name) == 0) { if (strcmp(dev->bus_id, name) == 0) {
struct gendisk *disk = dev_to_disk(dev); struct gendisk *disk = dev_to_disk(dev);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment