mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
[S390] dasd: message cleanup
Moved some Messages into s390 debug feature and changed remaining messages to use the dev_xxx and pr_xxx macros. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
f3eb5384cf
commit
fc19f381b3
13 changed files with 743 additions and 637 deletions
|
@ -9,6 +9,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -222,7 +225,7 @@ static int dasd_state_known_to_basic(struct dasd_device *device)
|
|||
return rc;
|
||||
}
|
||||
/* register 'device' debug area, used for all DBF_DEV_XXX calls */
|
||||
device->debug_area = debug_register(dev_name(&device->cdev->dev), 1, 1,
|
||||
device->debug_area = debug_register(dev_name(&device->cdev->dev), 4, 1,
|
||||
8 * sizeof(long));
|
||||
debug_register_view(device->debug_area, &debug_sprintf_view);
|
||||
debug_set_level(device->debug_area, DBF_WARNING);
|
||||
|
@ -763,7 +766,7 @@ static inline int dasd_check_cqr(struct dasd_ccw_req *cqr)
|
|||
return -EINVAL;
|
||||
device = cqr->startdev;
|
||||
if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device,
|
||||
DBF_DEV_EVENT(DBF_WARNING, device,
|
||||
" dasd_ccw_req 0x%08x magic doesn't match"
|
||||
" discipline 0x%08x",
|
||||
cqr->magic,
|
||||
|
@ -783,6 +786,7 @@ int dasd_term_IO(struct dasd_ccw_req *cqr)
|
|||
{
|
||||
struct dasd_device *device;
|
||||
int retries, rc;
|
||||
char errorstring[ERRORLENGTH];
|
||||
|
||||
/* Check the cqr */
|
||||
rc = dasd_check_cqr(cqr);
|
||||
|
@ -816,10 +820,10 @@ int dasd_term_IO(struct dasd_ccw_req *cqr)
|
|||
"device busy, retry later");
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"line %d unknown RC=%d, please "
|
||||
"report to linux390@de.ibm.com",
|
||||
__LINE__, rc);
|
||||
/* internal error 10 - unknown rc*/
|
||||
snprintf(errorstring, ERRORLENGTH, "10 %d", rc);
|
||||
dev_err(&device->cdev->dev, "An error occurred in the "
|
||||
"DASD device driver, reason=%s\n", errorstring);
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
|
@ -837,6 +841,7 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
{
|
||||
struct dasd_device *device;
|
||||
int rc;
|
||||
char errorstring[ERRORLENGTH];
|
||||
|
||||
/* Check the cqr */
|
||||
rc = dasd_check_cqr(cqr);
|
||||
|
@ -844,9 +849,10 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
return rc;
|
||||
device = (struct dasd_device *) cqr->startdev;
|
||||
if (cqr->retries < 0) {
|
||||
DEV_MESSAGE(KERN_DEBUG, device,
|
||||
"start_IO: request %p (%02x/%i) - no retry left.",
|
||||
cqr, cqr->status, cqr->retries);
|
||||
/* internal error 14 - start_IO run out of retries */
|
||||
sprintf(errorstring, "14 %p", cqr);
|
||||
dev_err(&device->cdev->dev, "An error occurred in the DASD "
|
||||
"device driver, reason=%s\n", errorstring);
|
||||
cqr->status = DASD_CQR_ERROR;
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -868,11 +874,11 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
cqr);
|
||||
break;
|
||||
case -EBUSY:
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "%s",
|
||||
"start_IO: device busy, retry later");
|
||||
break;
|
||||
case -ETIMEDOUT:
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "%s",
|
||||
"start_IO: request timeout, retry later");
|
||||
break;
|
||||
case -EACCES:
|
||||
|
@ -882,7 +888,7 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
* Do a retry with all available pathes.
|
||||
*/
|
||||
cqr->lpm = LPM_ANYPATH;
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "%s",
|
||||
"start_IO: selected pathes gone,"
|
||||
" retry on all pathes");
|
||||
break;
|
||||
|
@ -891,13 +897,15 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
"start_IO: -ENODEV device gone, retry");
|
||||
break;
|
||||
case -EIO:
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "%s",
|
||||
"start_IO: -EIO device gone, retry");
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"line %d unknown RC=%d, please report"
|
||||
" to linux390@de.ibm.com", __LINE__, rc);
|
||||
/* internal error 11 - unknown rc */
|
||||
snprintf(errorstring, ERRORLENGTH, "11 %d", rc);
|
||||
dev_err(&device->cdev->dev,
|
||||
"An error occurred in the DASD device driver, "
|
||||
"reason=%s\n", errorstring);
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
|
@ -954,7 +962,7 @@ static void dasd_handle_killed_request(struct ccw_device *cdev,
|
|||
return;
|
||||
cqr = (struct dasd_ccw_req *) intparm;
|
||||
if (cqr->status != DASD_CQR_IN_IO) {
|
||||
MESSAGE(KERN_DEBUG,
|
||||
DBF_EVENT(DBF_DEBUG,
|
||||
"invalid status in handle_killed_request: "
|
||||
"bus_id %s, status %02x",
|
||||
dev_name(&cdev->dev), cqr->status);
|
||||
|
@ -965,8 +973,8 @@ static void dasd_handle_killed_request(struct ccw_device *cdev,
|
|||
if (device == NULL ||
|
||||
device != dasd_device_from_cdev_locked(cdev) ||
|
||||
strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
|
||||
MESSAGE(KERN_DEBUG, "invalid device in request: bus_id %s",
|
||||
dev_name(&cdev->dev));
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: "
|
||||
"bus_id %s", dev_name(&cdev->dev));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1005,11 +1013,11 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
case -EIO:
|
||||
break;
|
||||
case -ETIMEDOUT:
|
||||
printk(KERN_WARNING"%s(%s): request timed out\n",
|
||||
DBF_EVENT(DBF_WARNING, "%s(%s): request timed out\n",
|
||||
__func__, dev_name(&cdev->dev));
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING"%s(%s): unknown error %ld\n",
|
||||
DBF_EVENT(DBF_WARNING, "%s(%s): unknown error %ld\n",
|
||||
__func__, dev_name(&cdev->dev), PTR_ERR(irb));
|
||||
}
|
||||
dasd_handle_killed_request(cdev, intparm);
|
||||
|
@ -1018,10 +1026,6 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
|
||||
now = get_clock();
|
||||
|
||||
DBF_EVENT(DBF_ERR, "Interrupt: bus_id %s CS/DS %04x ip %08x",
|
||||
dev_name(&cdev->dev), ((irb->scsw.cmd.cstat << 8) |
|
||||
irb->scsw.cmd.dstat), (unsigned int) intparm);
|
||||
|
||||
/* check for unsolicited interrupts */
|
||||
cqr = (struct dasd_ccw_req *) intparm;
|
||||
if (!cqr || ((scsw_cc(&irb->scsw) == 1) &&
|
||||
|
@ -1042,8 +1046,8 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
device = (struct dasd_device *) cqr->startdev;
|
||||
if (!device ||
|
||||
strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
|
||||
MESSAGE(KERN_DEBUG, "invalid device in request: bus_id %s",
|
||||
dev_name(&cdev->dev));
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: "
|
||||
"bus_id %s", dev_name(&cdev->dev));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1059,13 +1063,11 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
|
||||
/* check status - the request might have been killed by dyn detach */
|
||||
if (cqr->status != DASD_CQR_IN_IO) {
|
||||
MESSAGE(KERN_DEBUG,
|
||||
"invalid status: bus_id %s, status %02x",
|
||||
dev_name(&cdev->dev), cqr->status);
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "invalid status: bus_id %s, "
|
||||
"status %02x", dev_name(&cdev->dev), cqr->status);
|
||||
return;
|
||||
}
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "Int: CS/DS 0x%04x for cqr %p",
|
||||
((irb->scsw.cmd.cstat << 8) | irb->scsw.cmd.dstat), cqr);
|
||||
|
||||
next = NULL;
|
||||
expires = 0;
|
||||
if (scsw_dstat(&irb->scsw) == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) &&
|
||||
|
@ -1080,18 +1082,23 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
}
|
||||
} else { /* error */
|
||||
memcpy(&cqr->irb, irb, sizeof(struct irb));
|
||||
/* log sense for every failed I/O to s390 debugfeature */
|
||||
dasd_log_sense_dbf(cqr, irb);
|
||||
if (device->features & DASD_FEATURE_ERPLOG) {
|
||||
dasd_log_sense(cqr, irb);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we don't want complex ERP for this request, then just
|
||||
* reset this and retry it in the fastpath
|
||||
*/
|
||||
if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) &&
|
||||
cqr->retries > 0) {
|
||||
DEV_MESSAGE(KERN_DEBUG, device,
|
||||
"default ERP in fastpath (%i retries left)",
|
||||
cqr->retries);
|
||||
if (cqr->lpm == LPM_ANYPATH)
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device,
|
||||
"default ERP in fastpath "
|
||||
"(%i retries left)",
|
||||
cqr->retries);
|
||||
cqr->lpm = LPM_ANYPATH;
|
||||
cqr->status = DASD_CQR_QUEUED;
|
||||
next = cqr;
|
||||
|
@ -1102,10 +1109,6 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
(!device->stopped)) {
|
||||
if (device->discipline->start_IO(next) == 0)
|
||||
expires = next->expires;
|
||||
else
|
||||
DEV_MESSAGE(KERN_DEBUG, device, "%s",
|
||||
"Interrupt fastpath "
|
||||
"failed!");
|
||||
}
|
||||
if (expires != 0)
|
||||
dasd_device_set_timer(device, expires);
|
||||
|
@ -1178,6 +1181,7 @@ static void __dasd_device_process_final_queue(struct dasd_device *device,
|
|||
struct dasd_block *block;
|
||||
void (*callback)(struct dasd_ccw_req *, void *data);
|
||||
void *callback_data;
|
||||
char errorstring[ERRORLENGTH];
|
||||
|
||||
list_for_each_safe(l, n, final_queue) {
|
||||
cqr = list_entry(l, struct dasd_ccw_req, devlist);
|
||||
|
@ -1198,10 +1202,11 @@ static void __dasd_device_process_final_queue(struct dasd_device *device,
|
|||
cqr->status = DASD_CQR_TERMINATED;
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"wrong cqr status in __dasd_process_final_queue "
|
||||
"for cqr %p, status %x",
|
||||
cqr, cqr->status);
|
||||
/* internal error 12 - wrong cqr status*/
|
||||
snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status);
|
||||
dev_err(&device->cdev->dev,
|
||||
"An error occurred in the DASD device driver, "
|
||||
"reason=%s\n", errorstring);
|
||||
BUG();
|
||||
}
|
||||
if (cqr->callback != NULL)
|
||||
|
@ -1226,18 +1231,17 @@ static void __dasd_device_check_expire(struct dasd_device *device)
|
|||
(time_after_eq(jiffies, cqr->expires + cqr->starttime))) {
|
||||
if (device->discipline->term_IO(cqr) != 0) {
|
||||
/* Hmpf, try again in 5 sec */
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"internal error - timeout (%is) expired "
|
||||
"for cqr %p, termination failed, "
|
||||
"retrying in 5s",
|
||||
(cqr->expires/HZ), cqr);
|
||||
dev_err(&device->cdev->dev,
|
||||
"cqr %p timed out (%is) but cannot be "
|
||||
"ended, retrying in 5 s\n",
|
||||
cqr, (cqr->expires/HZ));
|
||||
cqr->expires += 5*HZ;
|
||||
dasd_device_set_timer(device, 5*HZ);
|
||||
} else {
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"internal error - timeout (%is) expired "
|
||||
"for cqr %p (%i retries left)",
|
||||
(cqr->expires/HZ), cqr, cqr->retries);
|
||||
dev_err(&device->cdev->dev,
|
||||
"cqr %p timed out (%is), %i retries "
|
||||
"remaining\n", cqr, (cqr->expires/HZ),
|
||||
cqr->retries);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1299,10 +1303,9 @@ int dasd_flush_device_queue(struct dasd_device *device)
|
|||
rc = device->discipline->term_IO(cqr);
|
||||
if (rc) {
|
||||
/* unable to terminate requeust */
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"dasd flush ccw_queue is unable "
|
||||
" to terminate request %p",
|
||||
cqr);
|
||||
dev_err(&device->cdev->dev,
|
||||
"Flushing the DASD request queue "
|
||||
"failed for request %p\n", cqr);
|
||||
/* stop flush processing */
|
||||
goto finished;
|
||||
}
|
||||
|
@ -1546,10 +1549,9 @@ int dasd_cancel_req(struct dasd_ccw_req *cqr)
|
|||
/* request in IO - terminate IO and release again */
|
||||
rc = device->discipline->term_IO(cqr);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_ERR, device,
|
||||
"dasd_cancel_req is unable "
|
||||
" to terminate request %p, rc = %d",
|
||||
cqr, rc);
|
||||
dev_err(&device->cdev->dev,
|
||||
"Cancelling request %p failed with rc=%d\n",
|
||||
cqr, rc);
|
||||
} else {
|
||||
cqr->stopclk = get_clock();
|
||||
rc = 1;
|
||||
|
@ -1626,7 +1628,7 @@ static inline void __dasd_block_process_erp(struct dasd_block *block,
|
|||
if (cqr->status == DASD_CQR_DONE)
|
||||
DBF_DEV_EVENT(DBF_NOTICE, device, "%s", "ERP successful");
|
||||
else
|
||||
DEV_MESSAGE(KERN_ERR, device, "%s", "ERP unsuccessful");
|
||||
dev_err(&device->cdev->dev, "ERP failed for the DASD\n");
|
||||
erp_fn = device->discipline->erp_postaction(cqr);
|
||||
erp_fn(cqr);
|
||||
}
|
||||
|
@ -2055,8 +2057,9 @@ static int dasd_open(struct block_device *bdev, fmode_t mode)
|
|||
}
|
||||
|
||||
if (dasd_probeonly) {
|
||||
DEV_MESSAGE(KERN_INFO, base, "%s",
|
||||
"No access to device due to probeonly mode");
|
||||
dev_info(&base->cdev->dev,
|
||||
"Accessing the DASD failed because it is in "
|
||||
"probeonly mode\n");
|
||||
rc = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
|
@ -2156,14 +2159,14 @@ int dasd_generic_probe(struct ccw_device *cdev,
|
|||
|
||||
ret = ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"dasd_generic_probe: could not set ccw-device options "
|
||||
"for %s\n", dev_name(&cdev->dev));
|
||||
return ret;
|
||||
}
|
||||
ret = dasd_add_sysfs_files(cdev);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"dasd_generic_probe: could not add sysfs entries "
|
||||
"for %s\n", dev_name(&cdev->dev));
|
||||
return ret;
|
||||
|
@ -2179,9 +2182,7 @@ int dasd_generic_probe(struct ccw_device *cdev,
|
|||
(dasd_autodetect && dasd_busid_known(dev_name(&cdev->dev)) != 0))
|
||||
ret = ccw_device_set_online(cdev);
|
||||
if (ret)
|
||||
printk(KERN_WARNING
|
||||
"dasd_generic_probe: could not initially "
|
||||
"online ccw-device %s; return code: %d\n",
|
||||
pr_warning("%s: Setting the DASD online failed with rc=%d\n",
|
||||
dev_name(&cdev->dev), ret);
|
||||
return 0;
|
||||
}
|
||||
|
@ -2245,10 +2246,9 @@ int dasd_generic_set_online(struct ccw_device *cdev,
|
|||
discipline = base_discipline;
|
||||
if (device->features & DASD_FEATURE_USEDIAG) {
|
||||
if (!dasd_diag_discipline_pointer) {
|
||||
printk (KERN_WARNING
|
||||
"dasd_generic couldn't online device %s "
|
||||
"- discipline DIAG not available\n",
|
||||
dev_name(&cdev->dev));
|
||||
pr_warning("%s Setting the DASD online failed because "
|
||||
"of missing DIAG discipline\n",
|
||||
dev_name(&cdev->dev));
|
||||
dasd_delete_device(device);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -2269,10 +2269,9 @@ int dasd_generic_set_online(struct ccw_device *cdev,
|
|||
/* check_device will allocate block device if necessary */
|
||||
rc = discipline->check_device(device);
|
||||
if (rc) {
|
||||
printk (KERN_WARNING
|
||||
"dasd_generic couldn't online device %s "
|
||||
"with discipline %s rc=%i\n",
|
||||
dev_name(&cdev->dev), discipline->name, rc);
|
||||
pr_warning("%s Setting the DASD online with discipline %s "
|
||||
"failed with rc=%i\n",
|
||||
dev_name(&cdev->dev), discipline->name, rc);
|
||||
module_put(discipline->owner);
|
||||
module_put(base_discipline->owner);
|
||||
dasd_delete_device(device);
|
||||
|
@ -2281,9 +2280,8 @@ int dasd_generic_set_online(struct ccw_device *cdev,
|
|||
|
||||
dasd_set_target_state(device, DASD_STATE_ONLINE);
|
||||
if (device->state <= DASD_STATE_KNOWN) {
|
||||
printk (KERN_WARNING
|
||||
"dasd_generic discipline not found for %s\n",
|
||||
dev_name(&cdev->dev));
|
||||
pr_warning("%s Setting the DASD online failed because of a "
|
||||
"missing discipline\n", dev_name(&cdev->dev));
|
||||
rc = -ENODEV;
|
||||
dasd_set_target_state(device, DASD_STATE_NEW);
|
||||
if (device->block)
|
||||
|
@ -2327,13 +2325,13 @@ int dasd_generic_set_offline(struct ccw_device *cdev)
|
|||
open_count = atomic_read(&device->block->open_count);
|
||||
if (open_count > max_count) {
|
||||
if (open_count > 0)
|
||||
printk(KERN_WARNING "Can't offline dasd "
|
||||
"device with open count = %i.\n",
|
||||
open_count);
|
||||
pr_warning("%s: The DASD cannot be set offline "
|
||||
"with open count %i\n",
|
||||
dev_name(&cdev->dev), open_count);
|
||||
else
|
||||
printk(KERN_WARNING "%s",
|
||||
"Can't offline dasd device due "
|
||||
"to internal use\n");
|
||||
pr_warning("%s: The DASD cannot be set offline "
|
||||
"while it is in use\n",
|
||||
dev_name(&cdev->dev));
|
||||
clear_bit(DASD_FLAG_OFFLINE, &device->flags);
|
||||
dasd_put_device(device);
|
||||
return -EBUSY;
|
||||
|
@ -2406,8 +2404,10 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
|
|||
cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device);
|
||||
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Could not allocate RDC request");
|
||||
/* internal error 13 - Allocating the RDC request failed*/
|
||||
dev_err(&device->cdev->dev,
|
||||
"An error occurred in the DASD device driver, "
|
||||
"reason=%s\n", "13");
|
||||
return cqr;
|
||||
}
|
||||
|
||||
|
@ -2519,7 +2519,7 @@ static int __init dasd_init(void)
|
|||
|
||||
return 0;
|
||||
failed:
|
||||
MESSAGE(KERN_INFO, "%s", "initialization not performed due to errors");
|
||||
pr_info("The DASD device driver could not be initialized\n");
|
||||
dasd_exit();
|
||||
return rc;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5,6 +5,8 @@
|
|||
* Author(s): Stefan Weinhuber <wein@de.ibm.com>
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <asm/ebcdic.h>
|
||||
#include "dasd_int.h"
|
||||
|
@ -503,7 +505,7 @@ static void lcu_update_work(struct work_struct *work)
|
|||
*/
|
||||
spin_lock_irqsave(&lcu->lock, flags);
|
||||
if (rc || (lcu->flags & NEED_UAC_UPDATE)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "could not update"
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "could not update"
|
||||
" alias data in lcu (rc = %d), retry later", rc);
|
||||
schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ);
|
||||
} else {
|
||||
|
@ -875,7 +877,7 @@ void dasd_alias_handle_summary_unit_check(struct dasd_device *device,
|
|||
|
||||
lcu = private->lcu;
|
||||
if (!lcu) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"device not ready to handle summary"
|
||||
" unit check (no lcu structure)");
|
||||
return;
|
||||
|
@ -888,7 +890,7 @@ void dasd_alias_handle_summary_unit_check(struct dasd_device *device,
|
|||
* the next interrupt on a different device
|
||||
*/
|
||||
if (list_empty(&device->alias_list)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"device is in offline processing,"
|
||||
" don't do summary unit check handling");
|
||||
spin_unlock(&lcu->lock);
|
||||
|
@ -896,7 +898,7 @@ void dasd_alias_handle_summary_unit_check(struct dasd_device *device,
|
|||
}
|
||||
if (lcu->suc_data.device) {
|
||||
/* already scheduled or running */
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"previous instance of summary unit check worker"
|
||||
" still pending");
|
||||
spin_unlock(&lcu->lock);
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -127,6 +129,7 @@ __setup ("dasd=", dasd_call_setup);
|
|||
* Read a device busid/devno from a string.
|
||||
*/
|
||||
static int
|
||||
|
||||
dasd_busid(char **str, int *id0, int *id1, int *devno)
|
||||
{
|
||||
int val, old_style;
|
||||
|
@ -134,8 +137,7 @@ dasd_busid(char **str, int *id0, int *id1, int *devno)
|
|||
/* Interpret ipldev busid */
|
||||
if (strncmp(DASD_IPLDEV, *str, strlen(DASD_IPLDEV)) == 0) {
|
||||
if (ipl_info.type != IPL_TYPE_CCW) {
|
||||
MESSAGE(KERN_ERR, "%s", "ipl device is not a ccw "
|
||||
"device");
|
||||
pr_err("The IPL device is not a CCW device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
*id0 = 0;
|
||||
|
@ -211,9 +213,8 @@ dasd_feature_list(char *str, char **endp)
|
|||
else if (len == 8 && !strncmp(str, "failfast", 8))
|
||||
features |= DASD_FEATURE_FAILFAST;
|
||||
else {
|
||||
MESSAGE(KERN_WARNING,
|
||||
"unsupported feature: %*s, "
|
||||
"ignoring setting", len, str);
|
||||
pr_warning("%*s is not a supported device option\n",
|
||||
len, str);
|
||||
rc = -EINVAL;
|
||||
}
|
||||
str += len;
|
||||
|
@ -222,8 +223,8 @@ dasd_feature_list(char *str, char **endp)
|
|||
str++;
|
||||
}
|
||||
if (*str != ')') {
|
||||
MESSAGE(KERN_WARNING, "%s",
|
||||
"missing ')' in dasd parameter string\n");
|
||||
pr_warning("A closing parenthesis ')' is missing in the "
|
||||
"dasd= parameter\n");
|
||||
rc = -EINVAL;
|
||||
} else
|
||||
str++;
|
||||
|
@ -255,28 +256,27 @@ dasd_parse_keyword( char *parsestring ) {
|
|||
}
|
||||
if (strncmp("autodetect", parsestring, length) == 0) {
|
||||
dasd_autodetect = 1;
|
||||
MESSAGE (KERN_INFO, "%s",
|
||||
"turning to autodetection mode");
|
||||
pr_info("The autodetection mode has been activated\n");
|
||||
return residual_str;
|
||||
}
|
||||
if (strncmp("probeonly", parsestring, length) == 0) {
|
||||
dasd_probeonly = 1;
|
||||
MESSAGE(KERN_INFO, "%s",
|
||||
"turning to probeonly mode");
|
||||
pr_info("The probeonly mode has been activated\n");
|
||||
return residual_str;
|
||||
}
|
||||
if (strncmp("nopav", parsestring, length) == 0) {
|
||||
if (MACHINE_IS_VM)
|
||||
MESSAGE(KERN_INFO, "%s", "'nopav' not supported on VM");
|
||||
pr_info("'nopav' is not supported on z/VM\n");
|
||||
else {
|
||||
dasd_nopav = 1;
|
||||
MESSAGE(KERN_INFO, "%s", "disable PAV mode");
|
||||
pr_info("PAV support has be deactivated\n");
|
||||
}
|
||||
return residual_str;
|
||||
}
|
||||
if (strncmp("nofcx", parsestring, length) == 0) {
|
||||
dasd_nofcx = 1;
|
||||
MESSAGE(KERN_INFO, "%s", "disable High Performance Ficon");
|
||||
pr_info("High Performance FICON support has been "
|
||||
"deactivated\n");
|
||||
return residual_str;
|
||||
}
|
||||
if (strncmp("fixedbuffers", parsestring, length) == 0) {
|
||||
|
@ -287,10 +287,10 @@ dasd_parse_keyword( char *parsestring ) {
|
|||
PAGE_SIZE, SLAB_CACHE_DMA,
|
||||
NULL);
|
||||
if (!dasd_page_cache)
|
||||
MESSAGE(KERN_WARNING, "%s", "Failed to create slab, "
|
||||
DBF_EVENT(DBF_WARNING, "%s", "Failed to create slab, "
|
||||
"fixed buffer mode disabled.");
|
||||
else
|
||||
MESSAGE (KERN_INFO, "%s",
|
||||
DBF_EVENT(DBF_INFO, "%s",
|
||||
"turning on fixed buffer mode");
|
||||
return residual_str;
|
||||
}
|
||||
|
@ -328,7 +328,7 @@ dasd_parse_range( char *parsestring ) {
|
|||
(from_id0 != to_id0 || from_id1 != to_id1 || from > to))
|
||||
rc = -EINVAL;
|
||||
if (rc) {
|
||||
MESSAGE(KERN_ERR, "Invalid device range %s", parsestring);
|
||||
pr_err("%s is not a valid device range\n", parsestring);
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
features = dasd_feature_list(str, &str);
|
||||
|
@ -347,8 +347,8 @@ dasd_parse_range( char *parsestring ) {
|
|||
return str + 1;
|
||||
if (*str == '\0')
|
||||
return str;
|
||||
MESSAGE(KERN_WARNING,
|
||||
"junk at end of dasd parameter string: %s\n", str);
|
||||
pr_warning("The dasd= parameter value %s has an invalid ending\n",
|
||||
str);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -144,8 +146,8 @@ dasd_diag_erp(struct dasd_device *device)
|
|||
mdsk_term_io(device);
|
||||
rc = mdsk_init_io(device, device->block->bp_block, 0, NULL);
|
||||
if (rc)
|
||||
DEV_MESSAGE(KERN_WARNING, device, "DIAG ERP unsuccessful, "
|
||||
"rc=%d", rc);
|
||||
dev_warn(&device->cdev->dev, "DIAG ERP failed with "
|
||||
"rc=%d\n", rc);
|
||||
}
|
||||
|
||||
/* Start a given request at the device. Return zero on success, non-zero
|
||||
|
@ -160,7 +162,7 @@ dasd_start_diag(struct dasd_ccw_req * cqr)
|
|||
|
||||
device = cqr->startdev;
|
||||
if (cqr->retries < 0) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "DIAG start_IO: request %p "
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "DIAG start_IO: request %p "
|
||||
"- no retry left)", cqr);
|
||||
cqr->status = DASD_CQR_ERROR;
|
||||
return -EIO;
|
||||
|
@ -195,7 +197,7 @@ dasd_start_diag(struct dasd_ccw_req * cqr)
|
|||
break;
|
||||
default: /* Error condition */
|
||||
cqr->status = DASD_CQR_QUEUED;
|
||||
DEV_MESSAGE(KERN_WARNING, device, "dia250 returned rc=%d", rc);
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "dia250 returned rc=%d", rc);
|
||||
dasd_diag_erp(device);
|
||||
rc = -EIO;
|
||||
break;
|
||||
|
@ -243,13 +245,14 @@ dasd_ext_handler(__u16 code)
|
|||
return;
|
||||
}
|
||||
if (!ip) { /* no intparm: unsolicited interrupt */
|
||||
MESSAGE(KERN_DEBUG, "%s", "caught unsolicited interrupt");
|
||||
DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited "
|
||||
"interrupt");
|
||||
return;
|
||||
}
|
||||
cqr = (struct dasd_ccw_req *) ip;
|
||||
device = (struct dasd_device *) cqr->startdev;
|
||||
if (strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device,
|
||||
DBF_DEV_EVENT(DBF_WARNING, device,
|
||||
" magic number of dasd_ccw_req 0x%08X doesn't"
|
||||
" match discipline 0x%08X",
|
||||
cqr->magic, *(int *) (&device->discipline->name));
|
||||
|
@ -281,15 +284,11 @@ dasd_ext_handler(__u16 code)
|
|||
rc = dasd_start_diag(next);
|
||||
if (rc == 0)
|
||||
expires = next->expires;
|
||||
else if (rc != -EACCES)
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Interrupt fastpath "
|
||||
"failed!");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cqr->status = DASD_CQR_QUEUED;
|
||||
DEV_MESSAGE(KERN_WARNING, device, "interrupt status for "
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for "
|
||||
"request %p was %d (%d retries left)", cqr, status,
|
||||
cqr->retries);
|
||||
dasd_diag_erp(device);
|
||||
|
@ -322,8 +321,9 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
if (private == NULL) {
|
||||
private = kzalloc(sizeof(struct dasd_diag_private),GFP_KERNEL);
|
||||
if (private == NULL) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"memory allocation failed for private data");
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Allocating memory for private DASD data "
|
||||
"failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ccw_device_get_id(device->cdev, &private->dev_id);
|
||||
|
@ -331,7 +331,7 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
}
|
||||
block = dasd_alloc_block();
|
||||
if (IS_ERR(block)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"could not allocate dasd block structure");
|
||||
device->private = NULL;
|
||||
kfree(private);
|
||||
|
@ -347,7 +347,7 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
|
||||
rc = diag210((struct diag210 *) rdc_data);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "failed to retrieve device "
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "failed to retrieve device "
|
||||
"information (rc=%d)", rc);
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out;
|
||||
|
@ -362,8 +362,8 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
private->pt_block = 2;
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_WARNING, device, "unsupported device class "
|
||||
"(class=%d)", private->rdc_data.vdev_class);
|
||||
dev_warn(&device->cdev->dev, "Device type %d is not supported "
|
||||
"in DIAG mode\n", private->rdc_data.vdev_class);
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
@ -380,7 +380,7 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
/* figure out blocksize of device */
|
||||
label = (struct vtoc_cms_label *) get_zeroed_page(GFP_KERNEL);
|
||||
if (label == NULL) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"No memory to allocate initialization request");
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
|
@ -404,8 +404,8 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
private->iob.flaga = DASD_DIAG_FLAGA_DEFAULT;
|
||||
rc = dia250(&private->iob, RW_BIO);
|
||||
if (rc == 3) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"DIAG call failed");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"A 64-bit DIAG call failed\n");
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out_label;
|
||||
}
|
||||
|
@ -414,8 +414,8 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
break;
|
||||
}
|
||||
if (bsize > PAGE_SIZE) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "device access failed "
|
||||
"(rc=%d)", rc);
|
||||
dev_warn(&device->cdev->dev, "Accessing the DASD failed because"
|
||||
" of an incorrect format (rc=%d)\n", rc);
|
||||
rc = -EIO;
|
||||
goto out_label;
|
||||
}
|
||||
|
@ -433,15 +433,15 @@ dasd_diag_check_device(struct dasd_device *device)
|
|||
block->s2b_shift++;
|
||||
rc = mdsk_init_io(device, block->bp_block, 0, NULL);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "DIAG initialization "
|
||||
"failed (rc=%d)", rc);
|
||||
dev_warn(&device->cdev->dev, "DIAG initialization "
|
||||
"failed with rc=%d\n", rc);
|
||||
rc = -EIO;
|
||||
} else {
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"(%ld B/blk): %ldkB",
|
||||
(unsigned long) block->bp_block,
|
||||
(unsigned long) (block->blocks <<
|
||||
block->s2b_shift) >> 1);
|
||||
dev_info(&device->cdev->dev,
|
||||
"New DASD with %ld byte/block, total size %ld KB\n",
|
||||
(unsigned long) block->bp_block,
|
||||
(unsigned long) (block->blocks <<
|
||||
block->s2b_shift) >> 1);
|
||||
}
|
||||
out_label:
|
||||
free_page((long) label);
|
||||
|
@ -595,7 +595,7 @@ static void
|
|||
dasd_diag_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
||||
struct irb *stat)
|
||||
{
|
||||
DEV_MESSAGE(KERN_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"dump sense not available for DIAG data");
|
||||
}
|
||||
|
||||
|
@ -621,10 +621,8 @@ static int __init
|
|||
dasd_diag_init(void)
|
||||
{
|
||||
if (!MACHINE_IS_VM) {
|
||||
MESSAGE_LOG(KERN_INFO,
|
||||
"Machine is not VM: %s "
|
||||
"discipline not initializing",
|
||||
dasd_diag_discipline.name);
|
||||
pr_info("Discipline %s cannot be used without z/VM\n",
|
||||
dasd_diag_discipline.name);
|
||||
return -ENODEV;
|
||||
}
|
||||
ASCEBC(dasd_diag_discipline.ebcname, 4);
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -87,7 +89,7 @@ dasd_eckd_probe (struct ccw_device *cdev)
|
|||
/* set ECKD specific ccw-device options */
|
||||
ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"dasd_eckd_probe: could not set ccw-device options "
|
||||
"for %s\n", dev_name(&cdev->dev));
|
||||
return ret;
|
||||
|
@ -248,8 +250,8 @@ define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk,
|
|||
rc = check_XRC (ccw, data, device);
|
||||
break;
|
||||
default:
|
||||
DBF_DEV_EVENT(DBF_ERR, device,
|
||||
"PFX LRE unknown opcode 0x%x", cmd);
|
||||
dev_err(&device->cdev->dev,
|
||||
"0x%x is not a known command\n", cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -647,7 +649,8 @@ locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, unsigned int trk,
|
|||
data->operation.operation = 0x0b;
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_ERR, device, "unknown opcode 0x%x", cmd);
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "unknown locate record "
|
||||
"opcode 0x%x", cmd);
|
||||
}
|
||||
set_ch_t(&data->seek_addr,
|
||||
trk / private->rdc_data.trk_per_cyl,
|
||||
|
@ -742,8 +745,8 @@ static struct dasd_ccw_req *dasd_eckd_build_rcd_lpm(struct dasd_device *device,
|
|||
cqr = dasd_smalloc_request("ECKD", 1 /* RCD */, ciw->count, device);
|
||||
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Could not allocate RCD request");
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate RCD request");
|
||||
return cqr;
|
||||
}
|
||||
|
||||
|
@ -893,14 +896,16 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
|
|||
rc = dasd_eckd_read_conf_lpm(device, &conf_data,
|
||||
&conf_len, lpm);
|
||||
if (rc && rc != -EOPNOTSUPP) { /* -EOPNOTSUPP is ok */
|
||||
MESSAGE(KERN_WARNING,
|
||||
"Read configuration data returned "
|
||||
"error %d", rc);
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"Read configuration data returned "
|
||||
"error %d for device: %s", rc,
|
||||
dev_name(&device->cdev->dev));
|
||||
return rc;
|
||||
}
|
||||
if (conf_data == NULL) {
|
||||
MESSAGE(KERN_WARNING, "%s", "No configuration "
|
||||
"data retrieved");
|
||||
DBF_EVENT(DBF_WARNING, "No configuration "
|
||||
"data retrieved for device: %s",
|
||||
dev_name(&device->cdev->dev));
|
||||
continue; /* no error */
|
||||
}
|
||||
/* save first valid configuration data */
|
||||
|
@ -947,8 +952,9 @@ static int dasd_eckd_read_features(struct dasd_device *device)
|
|||
sizeof(struct dasd_rssd_features)),
|
||||
device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
DBF_EVENT(DBF_WARNING, "Could not allocate initialization "
|
||||
"request for device: %s",
|
||||
dev_name(&device->cdev->dev));
|
||||
return PTR_ERR(cqr);
|
||||
}
|
||||
cqr->startdev = device;
|
||||
|
@ -1009,7 +1015,7 @@ static struct dasd_ccw_req *dasd_eckd_build_psf_ssc(struct dasd_device *device,
|
|||
device);
|
||||
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate PSF-SSC request");
|
||||
return cqr;
|
||||
}
|
||||
|
@ -1074,10 +1080,10 @@ static int dasd_eckd_validate_server(struct dasd_device *device)
|
|||
/* may be requested feature is not available on server,
|
||||
* therefore just report error and go ahead */
|
||||
private = (struct dasd_eckd_private *) device->private;
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"PSF-SSC on storage subsystem %s.%s.%04x returned rc=%d",
|
||||
private->uid.vendor, private->uid.serial,
|
||||
private->uid.ssid, rc);
|
||||
DBF_EVENT(DBF_WARNING, "PSF-SSC on storage subsystem %s.%s.%04x "
|
||||
"returned rc=%d for device: %s",
|
||||
private->uid.vendor, private->uid.serial,
|
||||
private->uid.ssid, rc, dev_name(&device->cdev->dev));
|
||||
/* RE-Read Configuration Data */
|
||||
return dasd_eckd_read_conf(device);
|
||||
}
|
||||
|
@ -1099,9 +1105,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
private = kzalloc(sizeof(struct dasd_eckd_private),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (private == NULL) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"memory allocation failed for private "
|
||||
"data");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"Allocating memory for private DASD data "
|
||||
"failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
device->private = (void *) private;
|
||||
|
@ -1126,8 +1132,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
if (private->uid.type == UA_BASE_DEVICE) {
|
||||
block = dasd_alloc_block();
|
||||
if (IS_ERR(block)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"could not allocate dasd block structure");
|
||||
DBF_EVENT(DBF_WARNING, "could not allocate dasd "
|
||||
"block structure for device: %s",
|
||||
dev_name(&device->cdev->dev));
|
||||
rc = PTR_ERR(block);
|
||||
goto out_err1;
|
||||
}
|
||||
|
@ -1158,9 +1165,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
memset(rdc_data, 0, sizeof(rdc_data));
|
||||
rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_WARNING, device,
|
||||
"Read device characteristics returned "
|
||||
"rc=%d", rc);
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"Read device characteristics failed, rc=%d for "
|
||||
"device: %s", rc, dev_name(&device->cdev->dev));
|
||||
goto out_err3;
|
||||
}
|
||||
/* find the vaild cylinder size */
|
||||
|
@ -1170,15 +1177,15 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
else
|
||||
private->real_cyl = private->rdc_data.no_cyl;
|
||||
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d",
|
||||
private->rdc_data.dev_type,
|
||||
private->rdc_data.dev_model,
|
||||
private->rdc_data.cu_type,
|
||||
private->rdc_data.cu_model.model,
|
||||
dev_info(&device->cdev->dev, "New DASD %04X/%02X (CU %04X/%02X) "
|
||||
"with %d cylinders, %d heads, %d sectors\n",
|
||||
private->rdc_data.dev_type,
|
||||
private->rdc_data.dev_model,
|
||||
private->rdc_data.cu_type,
|
||||
private->rdc_data.cu_model.model,
|
||||
private->real_cyl,
|
||||
private->rdc_data.trk_per_cyl,
|
||||
private->rdc_data.sec_per_trk);
|
||||
private->rdc_data.trk_per_cyl,
|
||||
private->rdc_data.sec_per_trk);
|
||||
return 0;
|
||||
|
||||
out_err3:
|
||||
|
@ -1319,8 +1326,8 @@ dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
status = private->init_cqr_status;
|
||||
private->init_cqr_status = -1;
|
||||
if (status != DASD_CQR_DONE) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"volume analysis returned unformatted disk");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"The DASD is not formatted\n");
|
||||
return -EMEDIUMTYPE;
|
||||
}
|
||||
|
||||
|
@ -1348,8 +1355,8 @@ dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
count_area = &private->count_area[0];
|
||||
} else {
|
||||
if (private->count_area[3].record == 1)
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Trk 0: no records after VTOC!");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"Track 0 has no records following the VTOC\n");
|
||||
}
|
||||
if (count_area != NULL && count_area->kl == 0) {
|
||||
/* we found notthing violating our disk layout */
|
||||
|
@ -1357,8 +1364,8 @@ dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
block->bp_block = count_area->dl;
|
||||
}
|
||||
if (block->bp_block == 0) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"Volume has incompatible disk layout");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"The disk layout of the DASD is not supported\n");
|
||||
return -EMEDIUMTYPE;
|
||||
}
|
||||
block->s2b_shift = 0; /* bits to shift 512 to get a block */
|
||||
|
@ -1370,15 +1377,15 @@ dasd_eckd_end_analysis(struct dasd_block *block)
|
|||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk);
|
||||
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"(%dkB blks): %dkB at %dkB/trk %s",
|
||||
(block->bp_block >> 10),
|
||||
((private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk * (block->bp_block >> 9)) >> 1),
|
||||
((blk_per_trk * block->bp_block) >> 10),
|
||||
private->uses_cdl ?
|
||||
"compatible disk layout" : "linux disk layout");
|
||||
dev_info(&device->cdev->dev,
|
||||
"DASD with %d KB/block, %d KB total size, %d KB/track, "
|
||||
"%s\n", (block->bp_block >> 10),
|
||||
((private->real_cyl *
|
||||
private->rdc_data.trk_per_cyl *
|
||||
blk_per_trk * (block->bp_block >> 9)) >> 1),
|
||||
((blk_per_trk * block->bp_block) >> 10),
|
||||
private->uses_cdl ?
|
||||
"compatible disk layout" : "linux disk layout");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1444,19 +1451,19 @@ dasd_eckd_format_device(struct dasd_device * device,
|
|||
/* Sanity checks. */
|
||||
if (fdata->start_unit >=
|
||||
(private->real_cyl * private->rdc_data.trk_per_cyl)) {
|
||||
DEV_MESSAGE(KERN_INFO, device, "Track no %u too big!",
|
||||
fdata->start_unit);
|
||||
dev_warn(&device->cdev->dev, "Start track number %d used in "
|
||||
"formatting is too big\n", fdata->start_unit);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (fdata->start_unit > fdata->stop_unit) {
|
||||
DEV_MESSAGE(KERN_INFO, device, "Track %u reached! ending.",
|
||||
fdata->start_unit);
|
||||
dev_warn(&device->cdev->dev, "Start track %d used in "
|
||||
"formatting exceeds end track\n", fdata->start_unit);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (dasd_check_blocksize(fdata->blksize) != 0) {
|
||||
DEV_MESSAGE(KERN_WARNING, device,
|
||||
"Invalid blocksize %u...terminating!",
|
||||
fdata->blksize);
|
||||
dev_warn(&device->cdev->dev,
|
||||
"The DASD cannot be formatted with block size %d\n",
|
||||
fdata->blksize);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
|
@ -1500,8 +1507,8 @@ dasd_eckd_format_device(struct dasd_device * device,
|
|||
sizeof(struct eckd_count);
|
||||
break;
|
||||
default:
|
||||
DEV_MESSAGE(KERN_WARNING, device, "Invalid flags 0x%x.",
|
||||
fdata->intensity);
|
||||
dev_warn(&device->cdev->dev, "An I/O control call used "
|
||||
"incorrect flags 0x%x\n", fdata->intensity);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
/* Allocate the format ccw request. */
|
||||
|
@ -1696,13 +1703,14 @@ static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device,
|
|||
|
||||
if (!sense) {
|
||||
/* just report other unsolicited interrupts */
|
||||
DEV_MESSAGE(KERN_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
"unsolicited interrupt received");
|
||||
} else {
|
||||
DEV_MESSAGE(KERN_ERR, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_ERR, device, "%s",
|
||||
"unsolicited interrupt received "
|
||||
"(sense available)");
|
||||
device->discipline->dump_sense(device, NULL, irb);
|
||||
device->discipline->dump_sense_dbf(device, NULL, irb,
|
||||
"unsolicited");
|
||||
}
|
||||
|
||||
dasd_schedule_device_bh(device);
|
||||
|
@ -2553,7 +2561,7 @@ dasd_eckd_release(struct dasd_device *device)
|
|||
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
|
||||
1, 32, device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
return PTR_ERR(cqr);
|
||||
}
|
||||
|
@ -2596,7 +2604,7 @@ dasd_eckd_reserve(struct dasd_device *device)
|
|||
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
|
||||
1, 32, device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
return PTR_ERR(cqr);
|
||||
}
|
||||
|
@ -2638,7 +2646,7 @@ dasd_eckd_steal_lock(struct dasd_device *device)
|
|||
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
|
||||
1, 32, device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
return PTR_ERR(cqr);
|
||||
}
|
||||
|
@ -2680,7 +2688,7 @@ dasd_eckd_performance(struct dasd_device *device, void __user *argp)
|
|||
sizeof(struct dasd_rssd_perf_stats_t)),
|
||||
device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
return PTR_ERR(cqr);
|
||||
}
|
||||
|
@ -2770,9 +2778,9 @@ dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
|
|||
return -EFAULT;
|
||||
private->attrib = attrib;
|
||||
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"cache operation mode set to %x (%i cylinder prestage)",
|
||||
private->attrib.operation, private->attrib.nr_cyl);
|
||||
dev_info(&device->cdev->dev,
|
||||
"The DASD cache mode was set to %x (%i cylinder prestage)\n",
|
||||
private->attrib.operation, private->attrib.nr_cyl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2823,7 +2831,7 @@ static int dasd_symm_io(struct dasd_device *device, void __user *argp)
|
|||
/* setup CCWs for PSF + RSSD */
|
||||
cqr = dasd_smalloc_request("ECKD", 2 , 0, device);
|
||||
if (IS_ERR(cqr)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"Could not allocate initialization request");
|
||||
rc = PTR_ERR(cqr);
|
||||
goto out_free;
|
||||
|
@ -2932,6 +2940,49 @@ dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page)
|
|||
return len;
|
||||
}
|
||||
|
||||
static void
|
||||
dasd_eckd_dump_sense_dbf(struct dasd_device *device, struct dasd_ccw_req *req,
|
||||
struct irb *irb, char *reason)
|
||||
{
|
||||
u64 *sense;
|
||||
int sl;
|
||||
struct tsb *tsb;
|
||||
|
||||
sense = NULL;
|
||||
tsb = NULL;
|
||||
if (req && scsw_is_tm(&req->irb.scsw)) {
|
||||
if (irb->scsw.tm.tcw)
|
||||
tsb = tcw_get_tsb(
|
||||
(struct tcw *)(unsigned long)irb->scsw.tm.tcw);
|
||||
if (tsb && (irb->scsw.tm.fcxs == 0x01)) {
|
||||
switch (tsb->flags & 0x07) {
|
||||
case 1: /* tsa_iostat */
|
||||
sense = (u64 *)tsb->tsa.iostat.sense;
|
||||
break;
|
||||
case 2: /* ts_ddpc */
|
||||
sense = (u64 *)tsb->tsa.ddpc.sense;
|
||||
break;
|
||||
case 3: /* tsa_intrg */
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (irb->esw.esw0.erw.cons)
|
||||
sense = (u64 *)irb->ecw;
|
||||
}
|
||||
if (sense) {
|
||||
for (sl = 0; sl < 4; sl++) {
|
||||
DBF_DEV_EVENT(DBF_EMERG, device,
|
||||
"%s: %016llx %016llx %016llx %016llx",
|
||||
reason, sense[0], sense[1], sense[2],
|
||||
sense[3]);
|
||||
}
|
||||
} else {
|
||||
DBF_DEV_EVENT(DBF_EMERG, device, "%s",
|
||||
"SORRY - NO VALID SENSE AVAILABLE\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print sense data and related channel program.
|
||||
* Parts are printed because printk buffer is only 1024 bytes.
|
||||
|
@ -2945,8 +2996,8 @@ static void dasd_eckd_dump_sense_ccw(struct dasd_device *device,
|
|||
|
||||
page = (char *) get_zeroed_page(GFP_ATOMIC);
|
||||
if (page == NULL) {
|
||||
DEV_MESSAGE(KERN_ERR, device, " %s",
|
||||
"No memory to dump sense data");
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"No memory to dump sense data\n");
|
||||
return;
|
||||
}
|
||||
/* dump the sense data */
|
||||
|
@ -3047,7 +3098,7 @@ static void dasd_eckd_dump_sense_tcw(struct dasd_device *device,
|
|||
|
||||
page = (char *) get_zeroed_page(GFP_ATOMIC);
|
||||
if (page == NULL) {
|
||||
DEV_MESSAGE(KERN_ERR, device, " %s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, " %s",
|
||||
"No memory to dump sense data");
|
||||
return;
|
||||
}
|
||||
|
@ -3206,6 +3257,7 @@ static struct dasd_discipline dasd_eckd_discipline = {
|
|||
.build_cp = dasd_eckd_build_alias_cp,
|
||||
.free_cp = dasd_eckd_free_alias_cp,
|
||||
.dump_sense = dasd_eckd_dump_sense,
|
||||
.dump_sense_dbf = dasd_eckd_dump_sense_dbf,
|
||||
.fill_info = dasd_eckd_fill_info,
|
||||
.ioctl = dasd_eckd_ioctl,
|
||||
};
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
* Author(s): Stefan Weinhuber <wein@de.ibm.com>
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kernel.h>
|
||||
|
@ -539,7 +541,7 @@ static int dasd_eer_open(struct inode *inp, struct file *filp)
|
|||
if (eerb->buffer_page_count < 1 ||
|
||||
eerb->buffer_page_count > INT_MAX / PAGE_SIZE) {
|
||||
kfree(eerb);
|
||||
MESSAGE(KERN_WARNING, "can't open device since module "
|
||||
DBF_EVENT(DBF_WARNING, "can't open device since module "
|
||||
"parameter eer_pages is smaller than 1 or"
|
||||
" bigger than %d", (int)(INT_MAX / PAGE_SIZE));
|
||||
unlock_kernel();
|
||||
|
@ -692,7 +694,7 @@ int __init dasd_eer_init(void)
|
|||
if (rc) {
|
||||
kfree(dasd_eer_dev);
|
||||
dasd_eer_dev = NULL;
|
||||
MESSAGE(KERN_ERR, "%s", "dasd_eer_init could not "
|
||||
DBF_EVENT(DBF_ERR, "%s", "dasd_eer_init could not "
|
||||
"register misc device");
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
|
@ -91,14 +93,14 @@ dasd_default_erp_action(struct dasd_ccw_req *cqr)
|
|||
|
||||
/* just retry - there is nothing to save ... I got no sense data.... */
|
||||
if (cqr->retries > 0) {
|
||||
DEV_MESSAGE (KERN_DEBUG, device,
|
||||
DBF_DEV_EVENT(DBF_DEBUG, device,
|
||||
"default ERP called (%i retries left)",
|
||||
cqr->retries);
|
||||
cqr->lpm = LPM_ANYPATH;
|
||||
cqr->status = DASD_CQR_FILLED;
|
||||
} else {
|
||||
DEV_MESSAGE (KERN_WARNING, device, "%s",
|
||||
"default ERP called (NO retry left)");
|
||||
dev_err(&device->cdev->dev,
|
||||
"default ERP has run out of retries and failed\n");
|
||||
cqr->status = DASD_CQR_FAILED;
|
||||
cqr->stopclk = get_clock();
|
||||
}
|
||||
|
@ -162,8 +164,21 @@ dasd_log_sense(struct dasd_ccw_req *cqr, struct irb *irb)
|
|||
device->discipline->dump_sense(device, cqr, irb);
|
||||
}
|
||||
|
||||
void
|
||||
dasd_log_sense_dbf(struct dasd_ccw_req *cqr, struct irb *irb)
|
||||
{
|
||||
struct dasd_device *device;
|
||||
|
||||
device = cqr->startdev;
|
||||
/* dump sense data to s390 debugfeature*/
|
||||
if (device->discipline && device->discipline->dump_sense_dbf)
|
||||
device->discipline->dump_sense_dbf(device, cqr, irb, "log");
|
||||
}
|
||||
EXPORT_SYMBOL(dasd_log_sense_dbf);
|
||||
|
||||
EXPORT_SYMBOL(dasd_default_erp_action);
|
||||
EXPORT_SYMBOL(dasd_default_erp_postaction);
|
||||
EXPORT_SYMBOL(dasd_alloc_erp_request);
|
||||
EXPORT_SYMBOL(dasd_free_erp_request);
|
||||
EXPORT_SYMBOL(dasd_log_sense);
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/debug.h>
|
||||
|
@ -128,17 +130,18 @@ dasd_fba_check_characteristics(struct dasd_device *device)
|
|||
private = kzalloc(sizeof(struct dasd_fba_private),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (private == NULL) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"memory allocation failed for private "
|
||||
"data");
|
||||
dev_warn(&device->cdev->dev,
|
||||
"Allocating memory for private DASD "
|
||||
"data failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
device->private = (void *) private;
|
||||
}
|
||||
block = dasd_alloc_block();
|
||||
if (IS_ERR(block)) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"could not allocate dasd block structure");
|
||||
DBF_EVENT(DBF_WARNING, "could not allocate dasd block "
|
||||
"structure for device: %s",
|
||||
dev_name(&device->cdev->dev));
|
||||
device->private = NULL;
|
||||
kfree(private);
|
||||
return PTR_ERR(block);
|
||||
|
@ -150,9 +153,9 @@ dasd_fba_check_characteristics(struct dasd_device *device)
|
|||
rdc_data = (void *) &(private->rdc_data);
|
||||
rc = dasd_generic_read_dev_chars(device, "FBA ", &rdc_data, 32);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_WARNING, device,
|
||||
"Read device characteristics returned error %d",
|
||||
rc);
|
||||
DBF_EVENT(DBF_WARNING, "Read device characteristics returned "
|
||||
"error %d for device: %s",
|
||||
rc, dev_name(&device->cdev->dev));
|
||||
device->block = NULL;
|
||||
dasd_free_block(block);
|
||||
device->private = NULL;
|
||||
|
@ -160,15 +163,16 @@ dasd_fba_check_characteristics(struct dasd_device *device)
|
|||
return rc;
|
||||
}
|
||||
|
||||
DEV_MESSAGE(KERN_INFO, device,
|
||||
"%04X/%02X(CU:%04X/%02X) %dMB at(%d B/blk)",
|
||||
cdev->id.dev_type,
|
||||
cdev->id.dev_model,
|
||||
cdev->id.cu_type,
|
||||
cdev->id.cu_model,
|
||||
((private->rdc_data.blk_bdsa *
|
||||
(private->rdc_data.blk_size >> 9)) >> 11),
|
||||
private->rdc_data.blk_size);
|
||||
dev_info(&device->cdev->dev,
|
||||
"New FBA DASD %04X/%02X (CU %04X/%02X) with %d MB "
|
||||
"and %d B/blk\n",
|
||||
cdev->id.dev_type,
|
||||
cdev->id.dev_model,
|
||||
cdev->id.cu_type,
|
||||
cdev->id.cu_model,
|
||||
((private->rdc_data.blk_bdsa *
|
||||
(private->rdc_data.blk_size >> 9)) >> 11),
|
||||
private->rdc_data.blk_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -180,7 +184,7 @@ static int dasd_fba_do_analysis(struct dasd_block *block)
|
|||
private = (struct dasd_fba_private *) block->base->private;
|
||||
rc = dasd_check_blocksize(private->rdc_data.blk_size);
|
||||
if (rc) {
|
||||
DEV_MESSAGE(KERN_INFO, block->base, "unknown blocksize %d",
|
||||
DBF_DEV_EVENT(DBF_WARNING, block->base, "unknown blocksize %d",
|
||||
private->rdc_data.blk_size);
|
||||
return rc;
|
||||
}
|
||||
|
@ -215,7 +219,7 @@ dasd_fba_erp_postaction(struct dasd_ccw_req * cqr)
|
|||
if (cqr->function == dasd_default_erp_action)
|
||||
return dasd_default_erp_postaction;
|
||||
|
||||
DEV_MESSAGE(KERN_WARNING, cqr->startdev, "unknown ERP action %p",
|
||||
DBF_DEV_EVENT(DBF_WARNING, cqr->startdev, "unknown ERP action %p",
|
||||
cqr->function);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -233,9 +237,9 @@ static void dasd_fba_handle_unsolicited_interrupt(struct dasd_device *device,
|
|||
}
|
||||
|
||||
/* check for unsolicited interrupts */
|
||||
DEV_MESSAGE(KERN_DEBUG, device, "%s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"unsolicited interrupt received");
|
||||
device->discipline->dump_sense(device, NULL, irb);
|
||||
device->discipline->dump_sense_dbf(device, NULL, irb, "unsolicited");
|
||||
dasd_schedule_device_bh(device);
|
||||
return;
|
||||
};
|
||||
|
@ -436,6 +440,25 @@ dasd_fba_fill_info(struct dasd_device * device,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
dasd_fba_dump_sense_dbf(struct dasd_device *device, struct dasd_ccw_req *req,
|
||||
struct irb *irb, char *reason)
|
||||
{
|
||||
int sl;
|
||||
if (irb->esw.esw0.erw.cons) {
|
||||
for (sl = 0; sl < 4; sl++) {
|
||||
DBF_DEV_EVENT(DBF_EMERG, device,
|
||||
"%s: %08x %08x %08x %08x",
|
||||
reason, irb->ecw[8 * 0], irb->ecw[8 * 1],
|
||||
irb->ecw[8 * 2], irb->ecw[8 * 3]);
|
||||
}
|
||||
} else {
|
||||
DBF_DEV_EVENT(DBF_EMERG, device, "%s",
|
||||
"SORRY - NO VALID SENSE AVAILABLE\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
||||
struct irb *irb)
|
||||
|
@ -446,7 +469,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
|||
|
||||
page = (char *) get_zeroed_page(GFP_ATOMIC);
|
||||
if (page == NULL) {
|
||||
DEV_MESSAGE(KERN_ERR, device, " %s",
|
||||
DBF_DEV_EVENT(DBF_WARNING, device, "%s",
|
||||
"No memory to dump sense data");
|
||||
return;
|
||||
}
|
||||
|
@ -476,8 +499,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
|||
len += sprintf(page + len, KERN_ERR PRINTK_HEADER
|
||||
" SORRY - NO VALID SENSE AVAILABLE\n");
|
||||
}
|
||||
MESSAGE_LOG(KERN_ERR, "%s",
|
||||
page + sizeof(KERN_ERR PRINTK_HEADER));
|
||||
printk(KERN_ERR "%s", page);
|
||||
|
||||
/* dump the Channel Program */
|
||||
/* print first CCWs (maximum 8) */
|
||||
|
@ -498,8 +520,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
|||
len += sprintf(page + len, "\n");
|
||||
act++;
|
||||
}
|
||||
MESSAGE_LOG(KERN_ERR, "%s",
|
||||
page + sizeof(KERN_ERR PRINTK_HEADER));
|
||||
printk(KERN_ERR "%s", page);
|
||||
|
||||
|
||||
/* print failing CCW area */
|
||||
|
@ -540,8 +561,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
|
|||
act++;
|
||||
}
|
||||
if (len > 0)
|
||||
MESSAGE_LOG(KERN_ERR, "%s",
|
||||
page + sizeof(KERN_ERR PRINTK_HEADER));
|
||||
printk(KERN_ERR "%s", page);
|
||||
free_page((unsigned long) page);
|
||||
}
|
||||
|
||||
|
@ -576,6 +596,7 @@ static struct dasd_discipline dasd_fba_discipline = {
|
|||
.build_cp = dasd_fba_build_cp,
|
||||
.free_cp = dasd_fba_free_cp,
|
||||
.dump_sense = dasd_fba_dump_sense,
|
||||
.dump_sense_dbf = dasd_fba_dump_sense_dbf,
|
||||
.fill_info = dasd_fba_fill_info,
|
||||
};
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/blkpg.h>
|
||||
|
@ -163,9 +165,8 @@ int dasd_gendisk_init(void)
|
|||
/* Register to static dasd major 94 */
|
||||
rc = register_blkdev(DASD_MAJOR, "dasd");
|
||||
if (rc != 0) {
|
||||
MESSAGE(KERN_WARNING,
|
||||
"Couldn't register successfully to "
|
||||
"major no %d", DASD_MAJOR);
|
||||
pr_warning("Registering the device driver with major number "
|
||||
"%d failed\n", DASD_MAJOR);
|
||||
return rc;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -112,6 +112,9 @@ do { \
|
|||
d_data); \
|
||||
} while(0)
|
||||
|
||||
/* limit size for an errorstring */
|
||||
#define ERRORLENGTH 30
|
||||
|
||||
/* definition of dbf debug levels */
|
||||
#define DBF_EMERG 0 /* system is unusable */
|
||||
#define DBF_ALERT 1 /* action must be taken immediately */
|
||||
|
@ -281,6 +284,8 @@ struct dasd_discipline {
|
|||
dasd_erp_fn_t(*erp_postaction) (struct dasd_ccw_req *);
|
||||
void (*dump_sense) (struct dasd_device *, struct dasd_ccw_req *,
|
||||
struct irb *);
|
||||
void (*dump_sense_dbf) (struct dasd_device *, struct dasd_ccw_req *,
|
||||
struct irb *, char *);
|
||||
|
||||
void (*handle_unsolicited_interrupt) (struct dasd_device *,
|
||||
struct irb *);
|
||||
|
@ -626,6 +631,7 @@ struct dasd_ccw_req *dasd_alloc_erp_request(char *, int, int,
|
|||
struct dasd_device *);
|
||||
void dasd_free_erp_request(struct dasd_ccw_req *, struct dasd_device *);
|
||||
void dasd_log_sense(struct dasd_ccw_req *, struct irb *);
|
||||
void dasd_log_sense_dbf(struct dasd_ccw_req *cqr, struct irb *irb);
|
||||
|
||||
/* externals in dasd_3990_erp.c */
|
||||
struct dasd_ccw_req *dasd_3990_erp_action(struct dasd_ccw_req *);
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
*
|
||||
* i/o controls for the dasd driver.
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
|
@ -94,7 +97,8 @@ static int dasd_ioctl_quiesce(struct dasd_block *block)
|
|||
if (!capable (CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
|
||||
DEV_MESSAGE(KERN_DEBUG, base, "%s", "Quiesce IO on device");
|
||||
dev_info(&base->cdev->dev, "The DASD has been put in the quiesce "
|
||||
"state\n");
|
||||
spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
|
||||
base->stopped |= DASD_STOPPED_QUIESCE;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
|
||||
|
@ -103,7 +107,7 @@ static int dasd_ioctl_quiesce(struct dasd_block *block)
|
|||
|
||||
|
||||
/*
|
||||
* Quiesce device.
|
||||
* Resume device.
|
||||
*/
|
||||
static int dasd_ioctl_resume(struct dasd_block *block)
|
||||
{
|
||||
|
@ -114,7 +118,8 @@ static int dasd_ioctl_resume(struct dasd_block *block)
|
|||
if (!capable (CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
|
||||
DEV_MESSAGE(KERN_DEBUG, base, "%s", "resume IO on device");
|
||||
dev_info(&base->cdev->dev, "I/O operations have been resumed "
|
||||
"on the DASD\n");
|
||||
spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
|
||||
base->stopped &= ~DASD_STOPPED_QUIESCE;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
|
||||
|
@ -140,8 +145,8 @@ static int dasd_format(struct dasd_block *block, struct format_data_t *fdata)
|
|||
return -EPERM;
|
||||
|
||||
if (base->state != DASD_STATE_BASIC) {
|
||||
DEV_MESSAGE(KERN_WARNING, base, "%s",
|
||||
"dasd_format: device is not disabled! ");
|
||||
dev_warn(&base->cdev->dev,
|
||||
"The DASD cannot be formatted while it is enabled\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -169,10 +174,9 @@ static int dasd_format(struct dasd_block *block, struct format_data_t *fdata)
|
|||
dasd_sfree_request(cqr, cqr->memdev);
|
||||
if (rc) {
|
||||
if (rc != -ERESTARTSYS)
|
||||
DEV_MESSAGE(KERN_ERR, base,
|
||||
" Formatting of unit %u failed "
|
||||
"with rc = %d",
|
||||
fdata->start_unit, rc);
|
||||
dev_err(&base->cdev->dev,
|
||||
"Formatting unit %d failed with "
|
||||
"rc=%d\n", fdata->start_unit, rc);
|
||||
return rc;
|
||||
}
|
||||
fdata->start_unit++;
|
||||
|
@ -199,8 +203,9 @@ dasd_ioctl_format(struct block_device *bdev, void __user *argp)
|
|||
if (copy_from_user(&fdata, argp, sizeof(struct format_data_t)))
|
||||
return -EFAULT;
|
||||
if (bdev != bdev->bd_contains) {
|
||||
DEV_MESSAGE(KERN_WARNING, block->base, "%s",
|
||||
"Cannot low-level format a partition");
|
||||
dev_warn(&block->base->cdev->dev,
|
||||
"The specified DASD is a partition and cannot be "
|
||||
"formatted\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return dasd_format(block, &fdata);
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "dasd"
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
@ -267,7 +269,7 @@ dasd_statistics_write(struct file *file, const char __user *user_buf,
|
|||
buffer = dasd_get_user_string(user_buf, user_len);
|
||||
if (IS_ERR(buffer))
|
||||
return PTR_ERR(buffer);
|
||||
MESSAGE_LOG(KERN_INFO, "/proc/dasd/statictics: '%s'", buffer);
|
||||
DBF_EVENT(DBF_DEBUG, "/proc/dasd/statictics: '%s'\n", buffer);
|
||||
|
||||
/* check for valid verbs */
|
||||
for (str = buffer; isspace(*str); str++);
|
||||
|
@ -277,33 +279,33 @@ dasd_statistics_write(struct file *file, const char __user *user_buf,
|
|||
if (strcmp(str, "on") == 0) {
|
||||
/* switch on statistics profiling */
|
||||
dasd_profile_level = DASD_PROFILE_ON;
|
||||
MESSAGE(KERN_INFO, "%s", "Statistics switched on");
|
||||
pr_info("The statistics feature has been switched "
|
||||
"on\n");
|
||||
} else if (strcmp(str, "off") == 0) {
|
||||
/* switch off and reset statistics profiling */
|
||||
memset(&dasd_global_profile,
|
||||
0, sizeof (struct dasd_profile_info_t));
|
||||
dasd_profile_level = DASD_PROFILE_OFF;
|
||||
MESSAGE(KERN_INFO, "%s", "Statistics switched off");
|
||||
pr_info("The statistics feature has been switched "
|
||||
"off\n");
|
||||
} else
|
||||
goto out_error;
|
||||
} else if (strncmp(str, "reset", 5) == 0) {
|
||||
/* reset the statistics */
|
||||
memset(&dasd_global_profile, 0,
|
||||
sizeof (struct dasd_profile_info_t));
|
||||
MESSAGE(KERN_INFO, "%s", "Statistics reset");
|
||||
pr_info("The statistics have been reset\n");
|
||||
} else
|
||||
goto out_error;
|
||||
kfree(buffer);
|
||||
return user_len;
|
||||
out_error:
|
||||
MESSAGE(KERN_WARNING, "%s",
|
||||
"/proc/dasd/statistics: only 'set on', 'set off' "
|
||||
"and 'reset' are supported verbs");
|
||||
pr_warning("%s is not a supported value for /proc/dasd/statistics\n",
|
||||
str);
|
||||
kfree(buffer);
|
||||
return -EINVAL;
|
||||
#else
|
||||
MESSAGE(KERN_WARNING, "%s",
|
||||
"/proc/dasd/statistics: is not activated in this kernel");
|
||||
pr_warning("/proc/dasd/statistics: is not activated in this kernel\n");
|
||||
return user_len;
|
||||
#endif /* CONFIG_DASD_PROFILE */
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue