From: Greg E. <edw...@sg...> - 2006-05-12 19:04:03
|
While tracking down some other issues relating to passing a bogus dump device to /sys/dump/dumpdev, one of the unintended results of passing in a bad device is the default polling value is switched. For systems that need to use polling, this means you would need to echo 1 > /sys/dump/polling before it would set up a [correct] device. This includes running configdump. Patch below saves off the default value and resets it at the end if the call to dump_block_intr_open() also failed. Greg --- drivers/dump/dump_blockdev.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) Index: linux-2.6.16/drivers/dump/dump_blockdev.c =================================================================== --- linux-2.6.16.orig/drivers/dump/dump_blockdev.c 2006-05-12 13:26:49.698440429 -0500 +++ linux-2.6.16/drivers/dump/dump_blockdev.c 2006-05-12 13:44:59.522854094 -0500 @@ -468,6 +468,8 @@ static int dump_block_open(struct dump_dev *dev, const char *arg) { unsigned long devid; + int poll = dump_config.polling; + int ret; if ((sscanf(arg, "%lx", &devid)) != 1) return -EINVAL; @@ -475,21 +477,27 @@ dump_block_open(struct dump_dev *dev, co if (devid < 0) return -EINVAL; - if (dump_config.polling){ + if (poll) { polling_mode = 1; if (!dump_block_poll_open(dev, devid)) { return 0; } else { /* - * If polling I/O isn't supported by this - * device, fall back to interrupt-driven mode. + * Either polling I/O isn't supported by this + * device, or we were fed a bogus device. Let's + * try to fall back to interrupt-driven mode. */ dump_config.polling = 0; } } polling_mode = 0; - return dump_block_intr_open(dev, devid); + ret = dump_block_intr_open(dev, devid); + if (ret && (dump_config.polling != poll)) { + /* reset default polling value */ + dump_config.polling = poll; + } + return ret; } /* |