Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[cascardo/linux.git] / arch / s390 / mm / extmem.c
index 394980b..f231f5e 100644 (file)
@@ -83,7 +83,7 @@ struct dcss_segment {
 };
 
 static DEFINE_MUTEX(dcss_lock);
-static struct list_head dcss_list = LIST_HEAD_INIT(dcss_list);
+static LIST_HEAD(dcss_list);
 static char *segtype_string[] = { "SW", "EW", "SR", "ER", "SN", "EN", "SC",
                                        "EW/EN-MIXED" };
 
@@ -287,24 +287,10 @@ __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long
        if (rc < 0)
                goto out_free;
 
-       rc = add_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
+       rc = vmem_add_mapping(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) {
@@ -365,7 +351,7 @@ __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long
        release_resource(seg->res);
        kfree(seg->res);
  out_shared:
-       remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
+       vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1);
  out_free:
        kfree(seg);
  out:
@@ -488,7 +474,7 @@ segment_modify_shared (char *name, int do_nonshared)
        rc = 0;
        goto out_unlock;
  out_del:
-       remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
+       vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1);
        list_del(&seg->list);
        dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy);
        kfree(seg);
@@ -522,7 +508,7 @@ segment_unload(char *name)
                goto out_unlock;
        release_resource(seg->res);
        kfree(seg->res);
-       remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1);
+       vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1);
        list_del(&seg->list);
        dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy);
        kfree(seg);
@@ -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);