[SCSI] iterate over devices individually for /proc/scsi/scsi
authorJeff Mahoney <jeffm@suse.com>
Wed, 27 Apr 2011 20:22:20 +0000 (16:22 -0400)
committerJames Bottomley <James.Bottomley@suse.de>
Sun, 1 May 2011 18:04:02 +0000 (13:04 -0500)
commite37c4913c555bd149eba3af953fb5d3a1686dfbd
treeba9fbba3ba75f4a1153825c7833f977f8c6d50c6
parent9c324b8ba8e3ee8772a0c716d557e1582699d481
[SCSI] iterate over devices individually for /proc/scsi/scsi

On systems with very large numbers (> 1600 or so) of SCSI devices,
cat /proc/scsi/scsi ends up failing with -ENOMEM. This is due to
the show routine simply iterating over all of the devices with
bus_for_each_dev(), and trying to dump all of them into the buffer
at the same time. On my test system (using scsi_debug with 4064 devices),
the output ends up being ~ 632k, far more than kmalloc will typically allow.

This patch defines its own seq_file opreations to iterate over the scsi
devices.The result is that each show() operation only dumps ~ 180 bytes
into the buffer at a time so we don't run out of memory.

If the "Attached devices" header isn't required, we can dump the
sfile->private bit completely.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/scsi_proc.c