aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorSeymour, Shane M <shane.seymour@hpe.com>2015-10-12 00:31:17 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-11-09 20:17:27 -0500
commitd9b43a10f0d04564c6e05de3728c3cbba64c644d (patch)
tree5661a5a688a92e9260af7e7d5cea0a04acca5cf3 /drivers/scsi
parentc59ab4e5afade13fdb65efc99c07fb8455aecba5 (diff)
st: allow debug output to be enabled or disabled via sysfs
Change st driver to allow enabling or disabling debug output via sysfs file /sys/bus/scsi/drivers/st/debug_flag. Previously the only way to enable debug output was: 1. loading the driver with the module parameter debug_flag=1 2. an ioctl call (this method was also the only way to dynamically disable debug output). To use the ioctl you need a second tape drive (if you are actively testing the first tape drive) since a second process cannot open the first tape drive if it is in use. The this change is only functional if the value of the macro DEBUG in st.c is a non-zero value (which it is by default). Signed-off-by: Shane Seymour <shane.seymour@hpe.com> Reviewed-by: Laurence Oberman <oberman.l@gmail.com> Acked-by: Kai Mäkisara <kai.makisara@kolumbus.fi> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/st.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index b37b9b00c4b4..e0a1e52a04e7 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -4452,11 +4452,41 @@ static ssize_t version_show(struct device_driver *ddd, char *buf)
4452} 4452}
4453static DRIVER_ATTR_RO(version); 4453static DRIVER_ATTR_RO(version);
4454 4454
4455#if DEBUG
4456static ssize_t debug_flag_store(struct device_driver *ddp,
4457 const char *buf, size_t count)
4458{
4459/* We only care what the first byte of the data is the rest is unused.
4460 * if it's a '1' we turn on debug and if it's a '0' we disable it. All
4461 * other values have -EINVAL returned if they are passed in.
4462 */
4463 if (count > 0) {
4464 if (buf[0] == '0') {
4465 debugging = NO_DEBUG;
4466 return count;
4467 } else if (buf[0] == '1') {
4468 debugging = 1;
4469 return count;
4470 }
4471 }
4472 return -EINVAL;
4473}
4474
4475static ssize_t debug_flag_show(struct device_driver *ddp, char *buf)
4476{
4477 return scnprintf(buf, PAGE_SIZE, "%d\n", debugging);
4478}
4479static DRIVER_ATTR_RW(debug_flag);
4480#endif
4481
4455static struct attribute *st_drv_attrs[] = { 4482static struct attribute *st_drv_attrs[] = {
4456 &driver_attr_try_direct_io.attr, 4483 &driver_attr_try_direct_io.attr,
4457 &driver_attr_fixed_buffer_size.attr, 4484 &driver_attr_fixed_buffer_size.attr,
4458 &driver_attr_max_sg_segs.attr, 4485 &driver_attr_max_sg_segs.attr,
4459 &driver_attr_version.attr, 4486 &driver_attr_version.attr,
4487#if DEBUG
4488 &driver_attr_debug_flag.attr,
4489#endif
4460 NULL, 4490 NULL,
4461}; 4491};
4462ATTRIBUTE_GROUPS(st_drv); 4492ATTRIBUTE_GROUPS(st_drv);