[S390] Remove code duplication from monreader / dcssblk.
Martin Schwidefsky [Thu, 17 Apr 2008 05:46:31 +0000 (07:46 +0200)]
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>

arch/s390/mm/extmem.c
drivers/s390/block/dcssblk.c
drivers/s390/char/monreader.c
include/asm-s390/extmem.h

index 880b0eb..ed2af0a 100644 (file)
@@ -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);
 
-       switch (rc) {
-       case 0:
-               break;
-       case -ENOSPC:
-               PRINT_WARN("segment_load: not loading segment %s - overlaps "
-                          "storage/segment\n", name);
-               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);
+       if (rc)
                goto out_free;
-       }
 
        seg->res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        if (seg->res == NULL) {
@@ -582,8 +568,59 @@ out:
        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_unload);
 EXPORT_SYMBOL(segment_save);
 EXPORT_SYMBOL(segment_type);
 EXPORT_SYMBOL(segment_modify_shared);
+EXPORT_SYMBOL(segment_warning);
index e6c94db..04787ea 100644 (file)
@@ -142,57 +142,6 @@ dcssblk_get_device_by_name(char *name)
        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)
 {
        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,
                                &dev_info->start, &dev_info->end);
        if (rc < 0) {
-               dcssblk_segment_warn(rc, dev_info->segment_name);
+               segment_warning(rc, dev_info->segment_name);
                goto dealloc_gendisk;
        }
        seg_byte_size = (dev_info->end - dev_info->start + 1);
index 67009bf..1e1f506 100644 (file)
@@ -111,56 +111,6 @@ static void dcss_mkname(char *ascii_name, char *ebcdic_name)
        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)
 {
        return *(u32 *) &monmsg->msg.rmmsg;
@@ -585,7 +535,7 @@ static int __init mon_init(void)
 
        rc = segment_type(mon_dcss_name);
        if (rc < 0) {
-               mon_segment_warn(rc, mon_dcss_name);
+               segment_warning(rc, mon_dcss_name);
                goto out_iucv;
        }
        if (rc != SEG_TYPE_SC) {
@@ -598,7 +548,7 @@ static int __init mon_init(void)
        rc = segment_load(mon_dcss_name, SEGMENT_SHARED,
                          &mon_dcss_start, &mon_dcss_end);
        if (rc < 0) {
-               mon_segment_warn(rc, mon_dcss_name);
+               segment_warning(rc, mon_dcss_name);
                rc = -EINVAL;
                goto out_iucv;
        }
index c8802c9..33837d7 100644 (file)
 #define SEGMENT_SHARED 0
 #define SEGMENT_EXCLUSIVE 1
 
-extern int segment_load (char *name,int segtype,unsigned long *addr,unsigned long *length);
-extern void segment_unload(char *name);
-extern void segment_save(char *name);
-extern int segment_type (char* name);
-extern int segment_modify_shared (char *name, int do_nonshared);
+int segment_load (char *name, int segtype, unsigned long *addr, unsigned long *length);
+void segment_unload(char *name);
+void segment_save(char *name);
+int segment_type (char* name);
+int segment_modify_shared (char *name, int do_nonshared);
+void segment_warning(int rc, char *seg_name);
 
 #endif
 #endif