Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca68305b authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Heiko Carstens
Browse files

[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: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent 9e74a6b8
Loading
Loading
Loading
Loading
+52 −15
Original line number Diff line number Diff line
@@ -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 @@ segment_save(char *name)
	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);
+1 −52
Original line number Diff line number Diff line
@@ -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);
+2 −52
Original line number Diff line number Diff line
@@ -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;
	}
+6 −5
Original line number Diff line number Diff line
@@ -22,11 +22,12 @@
#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