mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
[S390] Remove code duplication from monreader / dcssblk.
Move the function that prints the segment warning messages found in the monreader driver and the dcssblk driver to the extmem base code. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
parent
9e74a6b898
commit
ca68305bf3
@ -289,22 +289,8 @@ __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long
|
|||||||
|
|
||||||
rc = add_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
|
rc = add_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
|
||||||
|
|
||||||
switch (rc) {
|
if (rc)
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case -ENOSPC:
|
|
||||||
PRINT_WARN("segment_load: not loading segment %s - overlaps "
|
|
||||||
"storage/segment\n", name);
|
|
||||||
goto out_free;
|
goto out_free;
|
||||||
case -ERANGE:
|
|
||||||
PRINT_WARN("segment_load: not loading segment %s - exceeds "
|
|
||||||
"kernel mapping range\n", name);
|
|
||||||
goto out_free;
|
|
||||||
default:
|
|
||||||
PRINT_WARN("segment_load: not loading segment %s (rc: %d)\n",
|
|
||||||
name, rc);
|
|
||||||
goto out_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
seg->res = kzalloc(sizeof(struct resource), GFP_KERNEL);
|
seg->res = kzalloc(sizeof(struct resource), GFP_KERNEL);
|
||||||
if (seg->res == NULL) {
|
if (seg->res == NULL) {
|
||||||
@ -582,8 +568,59 @@ out:
|
|||||||
mutex_unlock(&dcss_lock);
|
mutex_unlock(&dcss_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* print appropriate error message for segment_load()/segment_type()
|
||||||
|
* return code
|
||||||
|
*/
|
||||||
|
void segment_warning(int rc, char *seg_name)
|
||||||
|
{
|
||||||
|
switch (rc) {
|
||||||
|
case -ENOENT:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"does not exist\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -ENOSYS:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"not running on VM\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -EIO:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"hardware error\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -ENOTSUPP:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"is a multi-part segment\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -ENOSPC:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"overlaps with storage\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -EBUSY:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"overlaps with already loaded dcss\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -EPERM:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"already loaded in incompatible mode\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -ENOMEM:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"out of memory\n", seg_name);
|
||||||
|
break;
|
||||||
|
case -ERANGE:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"exceeds kernel mapping range\n", seg_name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PRINT_WARN("cannot load/query segment %s, "
|
||||||
|
"return value %i\n", seg_name, rc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(segment_load);
|
EXPORT_SYMBOL(segment_load);
|
||||||
EXPORT_SYMBOL(segment_unload);
|
EXPORT_SYMBOL(segment_unload);
|
||||||
EXPORT_SYMBOL(segment_save);
|
EXPORT_SYMBOL(segment_save);
|
||||||
EXPORT_SYMBOL(segment_type);
|
EXPORT_SYMBOL(segment_type);
|
||||||
EXPORT_SYMBOL(segment_modify_shared);
|
EXPORT_SYMBOL(segment_modify_shared);
|
||||||
|
EXPORT_SYMBOL(segment_warning);
|
||||||
|
@ -142,57 +142,6 @@ dcssblk_get_device_by_name(char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* print appropriate error message for segment_load()/segment_type()
|
|
||||||
* return code
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
dcssblk_segment_warn(int rc, char* seg_name)
|
|
||||||
{
|
|
||||||
switch (rc) {
|
|
||||||
case -ENOENT:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, does not exist\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOSYS:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, not running on VM\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -EIO:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, hardware error\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOTSUPP:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, is a multi-part "
|
|
||||||
"segment\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOSPC:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, overlaps with "
|
|
||||||
"storage\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -EBUSY:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, overlaps with "
|
|
||||||
"already loaded dcss\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -EPERM:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, already loaded in "
|
|
||||||
"incompatible mode\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOMEM:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, out of memory\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ERANGE:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, exceeds kernel "
|
|
||||||
"mapping range\n", seg_name);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
PRINT_WARN("cannot load/query segment %s, return value %i\n",
|
|
||||||
seg_name, rc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dcssblk_unregister_callback(struct device *dev)
|
static void dcssblk_unregister_callback(struct device *dev)
|
||||||
{
|
{
|
||||||
device_unregister(dev);
|
device_unregister(dev);
|
||||||
@ -423,7 +372,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
|||||||
rc = segment_load(local_buf, SEGMENT_SHARED,
|
rc = segment_load(local_buf, SEGMENT_SHARED,
|
||||||
&dev_info->start, &dev_info->end);
|
&dev_info->start, &dev_info->end);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dcssblk_segment_warn(rc, dev_info->segment_name);
|
segment_warning(rc, dev_info->segment_name);
|
||||||
goto dealloc_gendisk;
|
goto dealloc_gendisk;
|
||||||
}
|
}
|
||||||
seg_byte_size = (dev_info->end - dev_info->start + 1);
|
seg_byte_size = (dev_info->end - dev_info->start + 1);
|
||||||
|
@ -111,56 +111,6 @@ static void dcss_mkname(char *ascii_name, char *ebcdic_name)
|
|||||||
ASCEBC(ebcdic_name, 8);
|
ASCEBC(ebcdic_name, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* print appropriate error message for segment_load()/segment_type()
|
|
||||||
* return code
|
|
||||||
*/
|
|
||||||
static void mon_segment_warn(int rc, char* seg_name)
|
|
||||||
{
|
|
||||||
switch (rc) {
|
|
||||||
case -ENOENT:
|
|
||||||
P_WARNING("cannot load/query segment %s, does not exist\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOSYS:
|
|
||||||
P_WARNING("cannot load/query segment %s, not running on VM\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -EIO:
|
|
||||||
P_WARNING("cannot load/query segment %s, hardware error\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOTSUPP:
|
|
||||||
P_WARNING("cannot load/query segment %s, is a multi-part "
|
|
||||||
"segment\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOSPC:
|
|
||||||
P_WARNING("cannot load/query segment %s, overlaps with "
|
|
||||||
"storage\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -EBUSY:
|
|
||||||
P_WARNING("cannot load/query segment %s, overlaps with "
|
|
||||||
"already loaded dcss\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -EPERM:
|
|
||||||
P_WARNING("cannot load/query segment %s, already loaded in "
|
|
||||||
"incompatible mode\n", seg_name);
|
|
||||||
break;
|
|
||||||
case -ENOMEM:
|
|
||||||
P_WARNING("cannot load/query segment %s, out of memory\n",
|
|
||||||
seg_name);
|
|
||||||
break;
|
|
||||||
case -ERANGE:
|
|
||||||
P_WARNING("cannot load/query segment %s, exceeds kernel "
|
|
||||||
"mapping range\n", seg_name);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
P_WARNING("cannot load/query segment %s, return value %i\n",
|
|
||||||
seg_name, rc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long mon_mca_start(struct mon_msg *monmsg)
|
static inline unsigned long mon_mca_start(struct mon_msg *monmsg)
|
||||||
{
|
{
|
||||||
return *(u32 *) &monmsg->msg.rmmsg;
|
return *(u32 *) &monmsg->msg.rmmsg;
|
||||||
@ -585,7 +535,7 @@ static int __init mon_init(void)
|
|||||||
|
|
||||||
rc = segment_type(mon_dcss_name);
|
rc = segment_type(mon_dcss_name);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
mon_segment_warn(rc, mon_dcss_name);
|
segment_warning(rc, mon_dcss_name);
|
||||||
goto out_iucv;
|
goto out_iucv;
|
||||||
}
|
}
|
||||||
if (rc != SEG_TYPE_SC) {
|
if (rc != SEG_TYPE_SC) {
|
||||||
@ -598,7 +548,7 @@ static int __init mon_init(void)
|
|||||||
rc = segment_load(mon_dcss_name, SEGMENT_SHARED,
|
rc = segment_load(mon_dcss_name, SEGMENT_SHARED,
|
||||||
&mon_dcss_start, &mon_dcss_end);
|
&mon_dcss_start, &mon_dcss_end);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
mon_segment_warn(rc, mon_dcss_name);
|
segment_warning(rc, mon_dcss_name);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out_iucv;
|
goto out_iucv;
|
||||||
}
|
}
|
||||||
|
@ -22,11 +22,12 @@
|
|||||||
#define SEGMENT_SHARED 0
|
#define SEGMENT_SHARED 0
|
||||||
#define SEGMENT_EXCLUSIVE 1
|
#define SEGMENT_EXCLUSIVE 1
|
||||||
|
|
||||||
extern int segment_load (char *name,int segtype,unsigned long *addr,unsigned long *length);
|
int segment_load (char *name, int segtype, unsigned long *addr, unsigned long *length);
|
||||||
extern void segment_unload(char *name);
|
void segment_unload(char *name);
|
||||||
extern void segment_save(char *name);
|
void segment_save(char *name);
|
||||||
extern int segment_type (char* name);
|
int segment_type (char* name);
|
||||||
extern int segment_modify_shared (char *name, int do_nonshared);
|
int segment_modify_shared (char *name, int do_nonshared);
|
||||||
|
void segment_warning(int rc, char *seg_name);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user